为什么不在总数据帧上使用 Scaler.fit_transform ?

数据挖掘 正常化
2022-02-27 05:29:20

在 sklearn 中,我使用 MinMaxScaler 对数据进行规范化。我正在关注的示例使用

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

X_train, X_test, y_train, y_test = train_test_split(X_crime, y_crime,random_state = 0)

X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

现在我想知道为什么这是在trainandtest集上单独完成的,而不是在 X_crime 数据帧上,例如:

X_crime_scaled = scaler.fit_transform(X_crime)

X_train_scaled, X_test_scaled, y_train, y_test = train_test_split(X_crime_scaled, y_crime, random_state = 0)

R 平方分数更高,使用此选项我知道我的所有值都在 0 和 1 之间标准化。

2个回答

如果您将scaler在完整数据集上使用 ,您将为算法提供一些关于测试集中值的信息,否则它不会有。

从测试集到训练集的这些附加信息(“数据泄漏”)是有问题的,因为它会导致不可靠的性能估计。因此,您获得更高的 R 平方也就不足为奇了。由于数据泄漏,此 R 平方可能过于乐观,因为它可能取决于您在训练集中引入的附加信息。

对于 尤其如此,MinMaxScaler因为根据定义,它对异常值非常敏感。RobustScaler如果您使用(或什至) ,效果可能不会有问题StandardScaler

这同样适用于其他预处理步骤,如异常值删除、特征选择等。

如果您担心您的训练数据不能充分反映真实分布,您可以退回到具有多个折叠的交叉验证方法,这样您就可以估计多个数据拆分的效果。同样,记住要适合scaler所有训练折叠并将其应用于每次迭代的测试折叠。

主要原因是我们假设我们的模型从未见过我们的测试数据或有任何关于它的信息。所以如果你在整个数据集上运行你的缩放器,它们可能会有不同的最大值和最小值,你能看到吗?然后,我们的模型确实会有关于我们的测试数据的信息。

如果您还有其他疑问,请发表评论,我可以再次为您提供帮助。