如何正确使用缩放器模型?

时间:2019-09-12 17:23:03

标签: python scikit-learn normalization

scaler = MinMaxScaler(feature_range = (0, 1))
X_train[:, :, 0] = scaler.fit_transform(X_train[:, :, 0])
X_test[:, :, 0] = scaler.transform(X_test[:, :, 0])

X_train[:, :, 1] = scaler.fit_transform(X_train[:, :, 1])
X_test[:, :, 1] = scaler.transform(X_test[:, :, 1])

X_train[:, :, 2] = scaler.fit_transform(X_train[:, :, 2])
X_test[:, :, 2] = scaler.transform(X_test[:, :, 2])

X_train[:, :, 3] = scaler.fit_transform(X_train[:, :, 3])
X_test[:, :, 3] = scaler.transform(X_test[:, :, 3])

X_train[:, :, 4] = scaler.fit_transform(X_train[:, :, 4])
X_test[:, :, 4] = scaler.transform(X_test[:, :, 4])

scaler_filename = 'scaler.save'
joblib.dump(scaler, scaler_filename)

如您所见,我使用MinMaxScaler来标准化训练/测试数据的每一列。在那之后,我保存了缩放器对象以供后用。保存定标器后,是否可以仅对新数据调用“ transform”方法,还是必须调用“ fit”方法?

3 个答案:

答案 0 :(得分:0)

我建议您为每个2D表使用不同的缩放器。在这里,您最后拥有的缩放器对象不记得索引0的缩放参数。尽管这可能是所需的行为,但请告诉我我是否错误...

如果使用joblib或pickle保存了缩放器对象并再次从文件中加载它,则它包含所有正确的参数以用于以后的转换,是的,您可以单独使用transform。

答案 1 :(得分:0)

来自docs

  

MinMaxScaler   通过将每个要素缩放到给定范围来变换要素。

     

此估算器分别缩放和翻译每个功能,例如   它在训练集的给定范围内,例如零之间   还有一个。

无需分别为每个功能执行此操作,您可以一次缩放多个功能:

scaler = MinMaxScaler(feature_range = (0, 1))
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test= scaler.transform(X_test)

我也建议使用joblib来使您的洁牙机腌制:

import joblib

joblib.dump(scaler, 'scaler.save')

要加载洁牙机:

scaler = joblib.load('scaler.save')
...

答案 2 :(得分:0)

MinMaxScaler在0到1之间缩放每一列数据。从机器学习的角度来看,正确的方法是“学习”训练数据上的缩放器,然后将学习到的缩放器用于测试数据。原因是两方面

  1. 我们假设您的训练数据很大且变化很大,可以捕获整个数据集(训练和测试)中的最大值和最小值
  2. 假定测试集未知/不可见。您将在可用时“实时”对测试数据进行缩放,因此,每次新的测试数据点可用时,您就不需要(有时甚至无法)训练缩放器。

我会这样使用

from sklearn.preprocessing import MinMaxScaler
import pickle

scaler = MinMaxScaler().fit(X_train)  # learn a scaler on all columns of X_train
# now transform the training and testing data using the learned scaler
x_scaled_train = scaler.transform(X_train)
x_scaled_test = scaler.transform(X_test)

pickle.dump(scaler, open("scaler.pkl", "wb"))  # save learned scaler