【问题标题】:How to properly use a scaler model?如何正确使用缩放器模型?
【发布时间】:2020-01-14 15:06:19
【问题描述】:
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'方法?

【问题讨论】:

  • 你应该使用管道。此外,Scalers 单独缩放列。当您一次又一次地重新调整相同的对象引用时,您只会保留最后一个缩放器。我建议只看docs

标签: python scikit-learn normalization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    来自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')
    ...
    

    【讨论】:

      【解决方案3】:

      我建议您为每个 2D 表格使用不同的缩放器。在这里,您最后拥有的缩放器对象不记得索引 0 的缩放参数。也许这是期望的行为,如果我错了,请告诉我...

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

      【讨论】:

        猜你喜欢
        • 2017-12-24
        • 2020-01-21
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2016-09-23
        相关资源
        最近更新 更多