在训练集和测试集中分别缩放?

机器算法验证 正常化
2022-04-04 01:08:49

在我看来,当你缩放一个数值变量时,你应该在训练集和测试集中分别进行。

例如,如果您有一个数值变量 X。归一化 X 为:( X - m(X) ) / s(X)。当您拥有训练集和测试集时,应针对每个总体计算 m(X) 和 s(X)。如果不是某些信息(包含在全局 m 和 s 中),则通过全局标准化变量从训练传递到测试集。

这样想对吗?感谢您的回答。

2个回答

从数据中“获取”信息的任何类型的数据表示转换都应该只“拟合”在训练数据上。这是因为:

  1. 如果您使用所有数据,则验证或测试(也称为:holdout)数据中的信息会泄漏到模型中。这是禁止的!因此,您的验证/测试分数估计会出现偏差。
  2. 该模型也应该只针对特定的数据表示进行训练。在大多数情况下,数据表示转换应该像在训练阶段一样应用(例外示例:某种在线设置)。

因此,在通常的带有 ERM 评估的批量训练或深度学习中的随机优化的情况下,这种归一化应该只在训练阶段进行。

这也是为什么在大多数 ML 库设计中,这种转换与模型一起被分组到一个管道中的原因。因为这样它们就可以安装在一起,也可以作为一个整体部署。

当然,这可能会导致在运行时打破假设。假设您 min-max-normalize,您会期望该属性属于[0,1]后。说最大值是m,那么很可能新数据具有具有值的属性x>m, 因此应用 min-max-normalization 你会得到一个转换后的值x~>1. 这在某些情况下效果不佳,因此您需要进行某种截断并将值设置为1. 如果你预计会有很多异常值,你可能想看看scikit-learn 中的RobustScaler

您应该使用训练数据的均值和标准。偏差。例如,在 scikit-learn 库的 StdScaler 类中,您将首先对训练数据使用 fit() 函数,对测试数据使用 transform() 函数,它使用从训练数据计算的拟合 m 和 s 值转换给定的测试数据你有。如果您的均值和标准显着不同。开发。如果您拥有的训练集和测试集的值,那么您的训练集可能不能很好地代表您的整体人口,这可能会导致更严重的问题,而不仅限于您所要求的标准缩放。或者,您的测试集非常倾斜。如果它是倾斜的,当您对其进行标准缩放时,您的测试样本可能与您的训练样本具有相似的性质,例如异常情况可能看起来很正常。还,