我应该使用适合训练数据集的 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。
假设我在 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。