当我尝试加载已保存的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
5条答案
按热度按时间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
nwlqm0z12#
新属性
clip
在较新版本中添加到MinMaxScaler
(自0.24起)。说明:
因为
clip
是在__init__
方法中定义的,所以它是MinMaxScaler.__dict__
的一部分。当您尝试从pickle创建对象时,__setattr__
方法用于设置所有属性,但旧版本中没有使用clip
,因此在新的MinMaxScale
示例中丢失。只需添加:应该能正常工作
wgeznvg73#
我在conda或cmd中使用
pip install scikit-learn==0.23.2
解决了这个问题。本质上,降级scikit模块起到了帮助作用。l7wslrjt4#
sklearn版本问题
您需要在windows中安装
pip install scikit-learn==0.24.0
我使用此命令解决问题
ux6nzvsh5#
一种对我有效的方法是对
MinMaxScaler.__setstate__
进行monkey-patch,如果不存在此属性,则手动将其设置为false,代码片段如下:通过在反序列化(unpickle)上面添加这个,我设法在一个较新的
scikit-learn
版本中反序列化我的对象,然后用clip
更改重新序列化它,之后不再需要monkey-patch。