Scikit-learn:使用使用缩放数据训练的模型预测新的原始和未缩放实例

时间:2016-02-08 18:17:57

标签: python machine-learning scikit-learn

我是Python的scikit-learn库的新手。截至目前,我已经使用图书馆制作了不同的分类器模型,这一直在顺利进行。由于数据中的单位不同(我从不同的传感器获得了相应类别标记的数据),我选择使用StandardScale模块来扩展功能。

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

由于对训练数据进行了缩放,是否真的会出现这种情况?如果是这样,是否有一种简单的方法来扩展原始值?我想使用joblib来使用模型持久性,如果有办法使它尽可能模块化,我将不胜感激。这意味着,每次训练数据发生变化时,都不要记录每个特征的平均值和标准变量。

非常感谢!

2 个答案:

答案 0 :(得分:6)

  

由于对训练数据进行了缩放,是否真的会出现这种情况?

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

  

如果是这样,是否有一种简单的方法可以扩展原始值?

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

# 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)
  

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

这正是你必须做的事情,虽然不是手工(因为这是缩放器计算的),但是必须"引擎盖下#34;这就是发生的事情 - 你必须存储每个功能的手段/标准。

答案 1 :(得分:0)

我一直在努力解决这个问题好几天,并且谷歌搜索了很多,最后,感谢lejlot的发布,我解决了你刚才提到的问题。

我很生气,在标准化X(目标函数)之后,没有人写过如何预测任意数字的方法(BTW,你不应该标准化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的帖子是非常有用的信息,同时保存了“scaler”训练。 < - 我绝对不知道。

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