【发布时间】: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