python 属性错误:“MinMaxScaler”对象没有属性“clip”

huus2vyu  于 2023-09-29  发布在  Python
关注(0)|答案(5)|浏览(395)

当我尝试加载已保存的sklearn.preprocessing.MinMaxScaler时,出现以下错误

/shared/env/lib/python3.6/site-packages/sklearn/base.py:315: UserWarning: Trying to unpickle estimator MinMaxScaler from version 0.23.2 when using version 0.24.0. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
[2021-01-08 19:40:28,805 INFO train.py:1317 - main ] EXCEPTION WORKER 100: 
Traceback (most recent call last):
  ...
  File "/shared/core/simulate.py", line 129, in process_obs
    obs = scaler.transform(obs)
  File "/shared/env/lib/python3.6/site-packages/sklearn/preprocessing/_data.py", line 439, in transform
    if self.clip:
AttributeError: 'MinMaxScaler' object has no attribute 'clip'

我在一台机器上训练定标器,保存它,并将其推到第二台机器上,在那里加载并用于转换输入。

# loading and transforming
import joblib
from sklearn.preprocessing import MinMaxScaler

scaler = joblib.load('scaler')
assert isinstance(scaler, MinMaxScaler)
data = scaler.transform(data)  # throws exception
qqrboqgw

qqrboqgw1#

问题是你在一台机器上训练定标器,它的sklearn版本比你用来加载定标器的机器要旧。
注意UserWarning
UserWarning: Trying to unpickle estimator MinMaxScaler from version 0.23.2 when using version 0.24.0. This might lead to breaking code or invalid results. Use at your own risk. UserWarning)
解决方案是修复版本不匹配。通过将一个sklearn升级到0.24.0或降级到0.23.2

nwlqm0z1

nwlqm0z12#

新属性clip在较新版本中添加到MinMaxScaler(自0.24起)。

# loading and transforming
import joblib
from sklearn.preprocessing import MinMaxScaler

scaler = joblib.load('scaler')
assert isinstance(scaler, MinMaxScaler)
scaler.clip = False  # add this line
data = scaler.transform(data)  # throws exceptio

说明:

因为clip是在__init__方法中定义的,所以它是MinMaxScaler.__dict__的一部分。当您尝试从pickle创建对象时,__setattr__方法用于设置所有属性,但旧版本中没有使用clip,因此在新的MinMaxScale示例中丢失。只需添加:

scaler.clip = False

应该能正常工作

wgeznvg7

wgeznvg73#

我在conda或cmd中使用pip install scikit-learn==0.23.2解决了这个问题。本质上,降级scikit模块起到了帮助作用。

l7wslrjt

l7wslrjt4#

sklearn版本问题

您需要在windows中安装
pip install scikit-learn==0.24.0
我使用此命令解决问题

ux6nzvsh

ux6nzvsh5#

一种对我有效的方法是对MinMaxScaler.__setstate__进行monkey-patch,如果不存在此属性,则手动将其设置为false,代码片段如下:

from typing import Any, Dict

from sklearn.preprocessing import MinMaxScaler

original_minmax_setstate = MinMaxScaler.__setstate__

def __monkey_patch_minmax_setstate__(self, state: Dict[str, Any]) -> None:
    state.setdefault("clip", False)
    original_minmax_setstate(self, state)

MinMaxScaler.__setstate__ = __monkey_patch_minmax_setstate__

# Deserialize the scaler here

通过在反序列化(unpickle)上面添加这个,我设法在一个较新的scikit-learn版本中反序列化我的对象,然后用clip更改重新序列化它,之后不再需要monkey-patch。

相关问题