功能缩放(标准化)以及LabelEncode和OneHotEncode数据的最佳实践是什么



这里有训练数据(x_train)和测试数据(x_test)以及all_data,它们与训练和测试数据相结合

那么,如果我们对数据进行标准化,你认为哪一个是最佳实践?

假设我们使用熊猫和sklearn

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
  1. 对列车数据进行标准化,然后应用于测试数据代码为:
scaler.fit(x_train)
x_train=scaler.transform(x_train)
x_test=scaler.transform(x_test)
  1. 对所有数据进行标准化,然后应用于训练和测试数据,代码为:
scaler.fit(all_data)
x_train=scaler.transform(x_train)
x_test=scaler.transform(x_test)

同样的问题是关于LabelEncoder和One-Hot编码分类特征,您使用哪种方法?

提前谢谢。

缩放应该使用情况1来完成,即缩放器只适合您的训练集,然后在测试集上使用相同的缩放。

情况2,你拟合所有数据是一种数据窥探的形式,其中来自测试集的信息正在泄漏到你的训练集中。这可能导致非常错误的结果。阿布·穆斯塔法的数据学习课上有一个精彩的片段涵盖了这一点。

对于标签编码,假设您为所有分类列中的每个唯一值创建一个二进制列。具有测试集中但不在训练集中的类别的列将全部编码为0。即使您决定对整个训练和测试数据集一起使用标签编码,当您构建模型时,所有不在训练集中的类别都将设置为0,并且不会影响您的模型-这些未知类别的权重将简单地添加到偏差单元中。

在实际使用中,不能做第二个。

不要忘记,交叉验证只是为了估计未来数据的错误,而您还没有。

这意味着您需要将场景设置为尽可能接近真实情况,即假装测试数据不存在

其次,在归一化中包含测试数据可能会导致过拟合!例如,假设您想要预测一家公司的股票价值。如果你使用整个系列进行标准化,然后进行拆分,我可以将训练集的平均值与0进行比较,以"预测"股票是上涨还是下跌。但面对真实的数据,这是失败的——因为这种方法过于适合你从测试到训练中泄露的信息。

对于二进制属性,规范化更为困难不要认为标准化对编码数据有好处-问题是,在编码时,你引入了相关的变量,而标准化最终会给它们带来太多的权重。

相关内容

  • 没有找到相关文章

最新更新