我是Python的scikit-learn库的新手。截至目前,我已经使用图书馆制作了不同的分类器模型,这一直在顺利进行。由于数据中的单位不同(我从不同的传感器获得了相应类别标记的数据),我选择使用StandardScale模块来扩展功能。
不同机器学习分类器的结果准确性得分很好。但是,当我尝试使用模型来预测传感器值的原始实例(意味着未缩放)时,模型会输出错误的分类。
由于对训练数据进行了缩放,是否真的会出现这种情况?如果是这样,是否有一种简单的方法来扩展原始值?我想使用joblib来使用模型持久性,如果有办法使它尽可能模块化,我将不胜感激。这意味着,每次训练数据发生变化时,都不要记录每个特征的平均值和标准变量。
非常感谢!
答案 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”训练。 < - 我绝对不知道。
由于这个功能,无论我们使用什么数字来“预测”,这个保存的缩放器都会缩放我们将用来预测未知输出的输入数字。