AttributeError: 'MinMaxScaler' object has no attribute 'clip'
AttributeError: 'MinMaxScaler' object has no attribute 'clip'
当我尝试加载已保存的 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
问题是你在一台机器上训练定标器,它的 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
我在 conda 或 cmd 中使用 pip install scikit-learn==0.23.2
解决了这个问题。本质上降级 scikit 模块有帮助。
新 属性 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
它应该可以正常工作。
sklearn的版本问题
您需要安装在 windows
pip install scikit-learn==0.24.0
我使用这个命令解决了我的问题
当我尝试加载已保存的 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
问题是你在一台机器上训练定标器,它的 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
我在 conda 或 cmd 中使用 pip install scikit-learn==0.23.2
解决了这个问题。本质上降级 scikit 模块有帮助。
新 属性 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
它应该可以正常工作。
sklearn的版本问题
您需要安装在 windows
pip install scikit-learn==0.24.0
我使用这个命令解决了我的问题