这里有训练数据(x_train)和测试数据(x_test)以及all_data,它们与训练和测试数据相结合
那么,如果我们对数据进行标准化,你认为哪一个是最佳实践?
假设我们使用熊猫和sklearn
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
- 对列车数据进行标准化,然后应用于测试数据代码为:
scaler.fit(x_train) x_train=scaler.transform(x_train) x_test=scaler.transform(x_test)
- 对所有数据进行标准化,然后应用于训练和测试数据,代码为:
scaler.fit(all_data) x_train=scaler.transform(x_train) x_test=scaler.transform(x_test)
同样的问题是关于LabelEncoder和One-Hot编码分类特征,您使用哪种方法?
提前谢谢。
缩放应该使用情况1来完成,即缩放器只适合您的训练集,然后在测试集上使用相同的缩放。
情况2,你拟合所有数据是一种数据窥探的形式,其中来自测试集的信息正在泄漏到你的训练集中。这可能导致非常错误的结果。阿布·穆斯塔法的数据学习课上有一个精彩的片段涵盖了这一点。
对于标签编码,假设您为所有分类列中的每个唯一值创建一个二进制列。具有测试集中但不在训练集中的类别的列将全部编码为0。即使您决定对整个训练和测试数据集一起使用标签编码,当您构建模型时,所有不在训练集中的类别都将设置为0,并且不会影响您的模型-这些未知类别的权重将简单地添加到偏差单元中。
在实际使用中,不能做第二个。
不要忘记,交叉验证只是为了估计未来数据的错误,而您还没有。
这意味着您需要将场景设置为尽可能接近真实情况,即假装测试数据不存在。
其次,在归一化中包含测试数据可能会导致过拟合!例如,假设您想要预测一家公司的股票价值。如果你使用整个系列进行标准化,然后进行拆分,我可以将训练集的平均值与0进行比较,以"预测"股票是上涨还是下跌。但面对真实的数据,这是失败的——因为这种方法过于适合你从测试到训练中泄露的信息。
对于二进制属性,规范化更为困难不要认为标准化对编码数据有好处-问题是,在编码时,你引入了相关的变量,而标准化最终会给它们带来太多的权重。