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
我使用这个命令解决了我的问题