Python Scikit学习:使用经过缩放数据训练的模型预测新的原始和未缩放实例

Python Scikit学习:使用经过缩放数据训练的模型预测新的原始和未缩放实例,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我已经使用scikit learn生成了不同的分类器模型,这是一帆风顺的。由于数据单位的不同(我从不同的传感器获得的数据按其相应的类别进行标记),我选择使用StandardScale模块缩放特征 不同机器学习分类器的结果准确度得分很好。然而,当我试图使用该模型预测传感器值的原始实例(表示未标度)时,该模型输出错误的分类 由于对训练数据进行了缩放,这种情况真的应该发生吗?如果是这样,是否也有一种简单的方法来缩放原始值?我希望使用joblib使用模型持久性,如果有办法使其尽可能模块化,我将不胜感激。

我已经使用scikit learn生成了不同的分类器模型,这是一帆风顺的。由于数据单位的不同(我从不同的传感器获得的数据按其相应的类别进行标记),我选择使用StandardScale模块缩放特征

不同机器学习分类器的结果准确度得分很好。然而,当我试图使用该模型预测传感器值的原始实例(表示未标度)时,该模型输出错误的分类

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

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

是的,这是预期的行为。您根据缩放数据对模型进行了训练,因此它仅适用于缩放数据

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

是的,只要保存你的定标器

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

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


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

我已经为这个问题挣扎了好几天,在谷歌上搜索了很多次,最后,感谢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的帖子中得到的非常有用的信息是,虽然训练“scaler”被保存了下来。您确定您也可以缩放输出(目标)变量吗?通常情况下,这是不可能的,因为它几乎没有带来任何好处。你能发布你的密码吗?嗨@lejlot,谢谢你回答我的问题。你知道有没有满足这种需要的图书馆吗?一个类似于joblib的库,但用于保存scaler?您还需要其他库吗?只是pipeline scaler和modelI遇到了类似的问题。但我使用了规格化和缩放函数。我怀疑他们是不同的。我们是否需要保存预处理模块的规格化和缩放方法的实例?
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)