【问题标题】:Scikit-learn: Predicting new raw and unscaled instance using models trained with scaled dataScikit-learn:使用经过缩放数据训练的模型预测新的原始和未缩放实例
【发布时间】:2016-02-08 18:17:57
【问题描述】:

我已经使用 scikit-learn 制作了不同的分类器模型,并且进展顺利。由于数据中单位的差异(我从不同传感器获得的数据按相应类别标记),我选择使用 StandardScale 模块来缩放特征。

不同机器学习分类器的准确度得分很好。但是,当我尝试使用模型来预测传感器值的原始实例(即未缩放)时,模型会输出错误的分类。

由于对训练数据进行了缩放,真的应该是这种情况吗?如果是这样,是否也有一种简单的方法来缩放原始值?我想使用 joblib 对此使用模型持久性,如果有办法使其尽可能模块化,我们将不胜感激。意思是说,不要在每次训练数据发生变化时记录每个特征的均值和标准变化。

【问题讨论】:

  • 你确定你也缩放输出(目标)变量吗?通常,它不会完成,因为它几乎没有带来任何好处。你能发布你的代码吗?

标签: python machine-learning scikit-learn


【解决方案1】:

由于对训练数据进行了缩放,真的应该是这种情况吗?

是的,这是预期的行为。您在缩放数据上训练了您的模型,因此它只适用于缩放数据。

如果是这样,是否也有一种简单的方法来缩放原始值?

是的,只需保存您的缩放器。

# Training
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
...
# do some training, probably save classifier, and save scaler too!

然后

# Testing
# load scaler
scaled_instances = scaler.transform(raw_instances)

意思是说,不是每次训练数据变化时记录每个特征的均值和标准变化

这正是你必须做的,虽然不是手动(因为这是 scaler 计算的),但本质上是“在引擎盖下”发生的事情 - 你必须存储手段/每个功能的标准差。

【讨论】:

  • 嗨@lejlot,感谢您回答我的问题。你知道是否有满足这种需求的图书馆吗?像 joblib 这样的库,但用于保存缩放器?
  • 您需要什么其他库?只是管道缩放器和模型
  • 我遇到了类似的问题。但我使用了 normalize 和 scaler 函数。我怀疑它们是不同的。我们需要保存预处理模块的 normalize 和 scale 方法的实例吗?
【解决方案2】:

我已经为这个问题苦苦挣扎了好几天,并在谷歌上搜索了很多,最后,感谢 lejlot 的发帖,我解决了你所提到的问题。

我很生气,没有人在标准化 X(目标函数)之后写出如何预测任意数的方法(顺便说一句,你不应该标准化 y。起初我很困惑,因为每个人都似乎很困惑并且写错了。)

我会在下面放一个您可以轻松参考的代码。

from sklearn.neural_network import MLPClassifier, MLPRegressor
from sklearn.preprocessing import StandardScaler
from numpy import *



X = array([ [0], [1],[2],[3],[4],[5],[6],[7] ])  
y = 2*array([ [0], [1],[2],[3],[4],[5],[6],[7]  ])


scaler = StandardScaler()
X_train = scaler.fit_transform(X)
print(X_train)




model = MLPRegressor(hidden_layer_sizes=(3 ), activation='logistic', solver='lbfgs', alpha=0.0001, batch_size ="auto",
                    learning_rate= 'constant', learning_rate_init=0.001, power_t=0.5, max_iter=2000, shuffle=True, random_state=None,
                    tol=0.0001, verbose=True, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False,
                    validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08)



model.fit(X_train, y) 
# YOU CAN SEE I DIDN't STANDARDIZE y BUT ONLY X.


# Testing
# load scaler

scaled_instances = scaler.transform(array([ [1],[2] ]))
print(scaled_instances)

s = model.predict( scaled_instances )
print(s)

我测试了几个数字并显示了正确的值。 lejlot 发布的信息非常有用,在训练时保存了“缩放器”。

多亏了这个功能,无论我们使用什么数字来“预测”,这个保存的缩放器都会缩放我们将用来预测未知输出的输入数字。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2018-09-07
    • 2022-11-17
    • 2014-10-13
    • 2015-03-08
    • 2018-11-05
    • 2015-06-22
    • 2020-02-08
    相关资源
    最近更新 更多