【问题标题】:Should I use MinMaxScaler which was fit on train dataset to transform test dataset, or use a separate MinMaxScaler to fit and transform test dataset?我应该使用适合训练数据集的 MinMaxScaler 来转换测试数据集,还是使用单独的 MinMaxScaler 来拟合和转换测试数据集?
【发布时间】:2020-10-21 12:37:15
【问题描述】:

假设我在一个机器学习问题中有 3 个数据集。

train dataset:用于估计ML模型参数(训练)

test dataset:用于评估训练模型,计算训练模型的准确率

prediction dataset:仅用于模型部署后的预测

我没有 evaluation dataset,我使用 Grid Search 和 k 折交叉验证来找到最佳模型。

另外,我有两个python脚本如下:

train.py:用于训练和测试ML模型,加载训练和测试数据集,保存训练好的模型,通过Grid Search找到最佳模型。

predict.py:用于加载预训练模型和加载预测数据集,预测模型输出并计算准确率。

train.py开始训练之前,我使用MinMaxScaler如下:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

scaler.fit(x_train)   # fit only on train dataset
x_train_norm = scaler.transform(x_train)
x_test_norm = scaler.transform(x_test)

predict.py中,加载预测数据集后,我需要使用如下相同的数据预处理:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

scaler.fit(x_predict)   
x_predict_norm = scaler.transform(x_predict)

正如您在上面看到的,拟合和变换都是在预测数据集上完成的。然而,在train.py 中,拟合是在训练数据集上完成的,并且相同的 MinMaxScaler 应用于转换测试数据集。

我的理解是,测试数据集是模型应该在部署后预测的真实数据的模拟。因此,测试数据集和预测数据集的数据预处理应该是一样的。

我认为应该在train.py 中为训练和测试数据集使用单独的 MinMaxScaler,如下所示:

from sklearn.preprocessing import MinMaxScaler
scaler_train = MinMaxScaler()
scaler_test = MinMaxScaler()

scaler_train.fit(x_train)   # fit only on train dataset
x_train_norm = scaler_train.transform(x_train)

scaler_test.fit(x_test)   # fit only on test dataset
x_test_norm = scaler_test.transform(x_test)

有什么区别?

如果我如上所述使用单独的 MinMaxScaler,x_test_norm 的值会有所不同。在这种情况下,x_test_norm 的值在 [-1, 1] 的范围内。但是,如果我通过适合训练数据集的 MinMaxScaler 转换测试数据集,x_test_norm 的值可能超出 [-1, 1] 的范围。

请告诉我你的想法。

【问题讨论】:

    标签: machine-learning dataset normalization predict data-processing


    【解决方案1】:

    当您运行.transform() 时,MinMax 缩放执行如下操作:(value - min) / (Max - min) minMax 的值是在您运行.fit() 时定义的。所以答案 - 是的,您应该在训练数据集上拟合 MinMaxScaller,然后在测试数据集上使用它。

    想象一下这样的情况:在训练数据集中,您有一些 Max=100 和 min=10 的特征,而在测试数据集中 Max=10 和 min=1。如果您要为测试子集训练单独的 MinMaxScaller,是的,它将在 [-1, 1] 范围内缩放特征,但与训练数据集相比,调用的值应该更低。

    另外,关于使用 k 折交叉验证的网格搜索,您应该使用 Pipeline。在这种情况下,网格搜索将自动将 MinMaxScaller 适合 k-1 折叠。这是一个很好的例子来说明如何组织pipeline with Mixed Types

    【讨论】:

    • 谢谢。关于Grid Search,如果Grid Search自动适配MinMaxScaler,是不是意味着我不需要在“train.py”中使用MinMaxScaler了?那么“predict.py”呢?
    • 不一定那样。将所有转换步骤放在一个管道中的想法。在这种情况下,pipeline.fit(X, y) 将自动训练缩放器、编码器和模型。在您可以腌制管道之后(即在 training.py 中)。在 predicti.py 你做pickle.load 并且完整的预训练管道可用于进行预测。检查答案中的最后一个链接。
    • 在 train_set 和 test_set 上运行.fit() 怎么样,即在将整个数据集拆分为 train_set 和 test_set 之前使用 MinMaxScaler。这会导致更好的测试预测,但可能会导致更差的产品预测?
    猜你喜欢
    • 2021-10-03
    • 2019-11-02
    • 2018-11-07
    • 2020-06-01
    • 2023-03-19
    • 2020-02-18
    • 2014-09-22
    • 2018-07-19
    • 2020-09-24
    相关资源
    最近更新 更多