我应该使用适合训练数据集的 MinMaxScaler 来转换测试数据集,还是使用单独的 MinMaxScaler 来适合和转换测试数据集?

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?

假设我在 ML 问题中有 3 个数据集。

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

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

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

我没有 evaluation dataset,我使用 网格搜索 和 k 折交叉验证来找到最佳模型。

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

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

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 来转换测试数据集。

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

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

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].

的范围

请告诉我你的想法。

当您 运行 .transform() MinMax 缩放做类似的事情时: (value - min) / (Max - min) 当您 运行 .fit()。所以答案 - 是的,您应该在训练数据集上安装 MinMaxScaller,然后在测试数据集上使用它。

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

此外,关于带有 k 折交叉验证的网格搜索,您应该使用 Pipeline. In this case, Grid Search will automatically fit MinMaxScaller on the k-1 folds. Here is a good example of how to organize pipeline with Mixed Types