如果预测是目标,如何将标准化/标准化应用于训练和测试集?


47
  1. 是否同时转换所有数据或折叠(如果应用了简历)?例如

    (allData - mean(allData)) / sd(allData)

  2. 我是否要分别转换训练集和测试集?例如

    (trainData - mean(trainData)) / sd(trainData)

    (testData - mean(testData)) / sd(testData)

  3. 还是要转换训练集并在测试集中使用计算?例如

    (trainData - mean(trainData)) / sd(trainData)

    (testData - mean(trainData)) / sd(trainData)

我相信3是正确的方法。如果3是正确的,我必须担心平均值不为0或范围不在[0; 1]或[-1; 1](规范化)的测试集?


有没有一种优雅的方式来编写代码R?看到这个问题:stackoverflow.com/questions/49260862/…–
伯恩

Answers:


41

第三种方法是正确的。确切地说,为什么在《统计学习的要素》中有详细介绍,请参见“进行交叉验证的错误和正确方法”一节,以及股票市场示例中的“ 从数据学习 ”的最后一章。

从本质上讲,过程1和2将有关响应或将来的信息从您的保留数据集中泄漏到模型的训练或评估中。这可能会在模型评估中引起很大的乐观偏见。

模型验证的想法是模仿当您的模型无法做出实际决策时,您在模型制定生产决策时所处的情况。结果是,除了与您的预测值进行比较之外,您无法在测试集中使用响应。

解决该问题的另一种方法是,假设您一次只能从保持状态访问一个数据点(生产模型的常见情况)。在此假设下您无法做的任何事情都应引起高度怀疑。显然,您不能做的一件事是汇总过去和将来的所有新数据点,以标准化您的生产数据流,因此对模型验证执行相同操作是无效的。

您不必担心测试集的平均值为非零,这比将您的性能估算保持偏差要好得多。但是,当然,如果测试是从与火车相同的基础分布中真正得出的(统计学习中的基本假设),则均值应约为零。


那正是我所想。谢谢您的澄清!
DerTom

Clearly, one thing you cannot do is aggregate over all new data-points past and future to normalize your production stream of data。为什么不?
安莫尔·辛格·贾吉

1
@AnmolSinghJaggi它的“和未来”。如果您尚未真正收集数据,则无法正常使用它。
马修·德鲁里

4
@floodking如果您将训练数据视为“过去”数据,而将测试数据视为“当前或未来”,则通过汇总测试数据,您将隐式使用有关X 的未来的信息。数据泄漏不仅是将泄漏到您的数据中预测器,这也是关于从未来泄漏信息。一个好的经验法则是,您应该只能使用一行或测试数据进行预测,否则您将使用未来。y
马修·德鲁里

1
@MatthewDrury。感谢您的明确解释。我现在同意你的看法。只有第三种方法是正确的。
泛洪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.