为什么 k 折交叉验证 (CV) 过拟合?或者为什么CV和测试集之间会出现差异?

数据挖掘 交叉验证 过拟合
2021-09-22 12:31:59

最近在做一个项目,发现我的交叉验证错误率很低,但是测试集错误率很高。这可能表明我的模型过度拟合。为什么我的测试集过拟合时我的交叉验证没有过拟合?

更具体地说,我有大约 200 万个观测值,有 100 个变量 (n>>p)。我将数据集随机拆分为 80/20 的训练和测试。然后,我在训练集上使用 5 折交叉验证拟合了一个模型(即 XGboost),估计的错误率非常低。然后,我使用相同的参数设置并使用整个训练集来拟合模型。令人惊讶的是,当我使用测试集来评估模型的性能时,错误率明显高于 CV 错误率。为什么?

编辑:

(关于错误率)

错误率实际上是多项式对数损失我实现了 1.320044 (+/- 0.002126) 的 CV 错误率和 1.437881 的测试错误率。盯着这两个数字可能看起来很接近,但实际上并非如此。我不知道如何证明这一点,但我确信它们在这个项目的性能范围内是不同的,从 ~1.55 到 ~1.30。

5折交叉验证的方式如下,

  1. 将火车组分成5组。
  2. 迭代地在 4 个集合上拟合模型并在其余集合上测试性能。
  3. 平均所有五次迭代的性能。

我的意思是,如果我的参数设置使模型过拟合,那么我应该在这个交叉验证过程中看到它,对吧?但是直到我使用测试集才看到它。在地球上什么情况下会发生这种情况?

谢谢!

添加:

我能想到为什么 CV 错误率与测试集错误率不同的唯一原因是

如果您拥有的数据不能代表您将尝试预测的数据,则交叉验证对外部数据的效果不佳! ——这里

但我随机 8/2 拆分了 200 万个样本数据集,我相信训练集和测试集应该具有相同的变量分布。

(请原谅我在这里也发布了同样的问题。)

编辑:

(关于数据泄露)

我从 @darXider 在 crossvalidate 中得到了一个有趣的表扬他说,

有时在进行特征工程时,您必须小心避免训练集和测试集之间的任何数据泄漏。例如,如果您对原始、未触及的数据进行 PCA,将 PC1 和 PC2 用作“新”特征,然后将数据集拆分为训练和测试,那么您将信息从训练集中泄漏到测试集中。这会提高你的分数。您提到经过一些特征工程后,您的 CV 分数和测试分数开始出现不一致。这可能表明训练集和测试集之间存在某种信息泄漏。

我想知道究竟什么是“数据泄漏”,为什么拆分的特征工程仍然会导致“数据泄漏”?

1个回答

我同意您从 Cross Validated 收到的评论 -数据泄漏符合此问题设置,因为已知与测试分数相比,它会导致过于乐观的 CV 分数。如果您提供了有关您已采取的数据预处理步骤的信息,我们可以确认这实际上是一个数据泄漏问题。

数据泄漏意味着信息从测试数据泄漏到训练数据,导致训练模型高估预期性能,并且对未见数据的泛化能力很差,因为泄漏的信息允许模型学习一些否则它不会学习的东西学习。

举个例子,假设你只有少量的训练样例,你最终合成了更多的训练样例,这些训练样例在某种程度上与其他训练样例相似。如果您在 CV 循环之前而不是在其内部(在每个折叠内)实施综合,您的 CV 准确度会飙升,但测试准确度会很低。除了数据合成之外,其他预处理步骤也可能发生数据泄漏,例如缩放数据、输入缺失值或执行特征选择。