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

机器算法验证 r 交叉验证 数据转换 正常化 标准化
2022-02-11 06:16:32
  1. 我是否同时转换所有数据或折叠(如果应用了 CV)?例如

    (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](标准化)测试集?

1个回答

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

从本质上讲,程序 1 和 2 将有关响应或未来的信息从您的保留数据集中泄漏到模型的训练或评估中。这可能会在您的模型评估中导致相当大的乐观偏差。

模型验证的想法是模仿模型做出生产决策时的情况,而您无法获得真实的响应。结果是除了与预测值进行比较之外,您不能将测试集中的响应用于任何事情。

另一种方法是假设您一次只能访问一个数据点(生产模型的常见情况)。在这种假设下你不能做的任何事情你都应该非常怀疑。显然,你不能做的一件事是聚合过去和未来的所有新数据点以标准化你的生产数据流 - 所以对模型验证做同样的事情是无效的。

你不必担心你的测试集的平均值是非零的,这比让你的坚持性能估计有偏差更好。当然,如果测试确实来自与您的火车相同的潜在分布(统计学习中的一个基本假设),则所述平均值应该近似为零。