交叉验证包括训练、验证和测试。为什么我们需要三个子集?

机器算法验证 机器学习 交叉验证
2022-01-22 01:52:40

我有一个关于交叉验证过程的问题。我正在学习 Cursera 上的机器学习课程。其中一个主题是关于交叉验证。我发现有点难以理解。我确实知道为什么我们需要 CV,因为我们希望我们的模型能够很好地处理未来(未知)数据,并且 CV 可以防止过度拟合。然而,这个过程本身是令人困惑的。

我所理解的是,我将数据分成 3 个子集:训练、验证和测试。训练和验证是找到模型的最佳复杂度。我不明白的是第三个子集。我知道我为模型采用了许多功能,对其进行训练并在验证子集上对其进行验证,并在我更改结构时寻找最小成本函数。当我找到它时,我会在测试子集上测试模型。如果我已经在验证子集上找到了最小成本函数,为什么我需要在测试子集上再次测试它???

有人可以为我澄清一下吗?

谢谢

3个回答
  • 训练集用于为给定模型选择最佳参数。请注意,使用训练集评估某些给定的参数集应该会给您一个无偏估计的成本函数 - 这是根据训练集选择优化成本函数估计的参数的行为,这会使它们提供的估计有偏差. 选择在训练集上表现最好的参数;因此,在训练集上评估的这些参数的明显表现将过于乐观。
  • 使用训练集进行训练后,验证集用于选择最佳模型。再次注意,使用验证集评估任何给定模型应该会给你一个具有代表性的成本函数估计——这是选择在验证集上表现最好的模型的行为,它会使它们提供的估计产生偏差。选择在验证集上表现最好的模型;因此,在验证集上评估的该模型的明显性能将过于乐观。
  • 使用训练训练每个模型,并使用验证集选择最佳模型后,测试集会告诉您最终选择的模型有多好。它为您提供了对运行时实际性能的无偏估计,了解这一点很重要,原因有很多。您不能为此使用训练集,因为参数偏向于它。而且您不能为此使用验证集,因为模型本身偏向于这些。因此,需要第三组。

如果我已经在验证子集上找到了最小成本函数,为什么我需要在测试子集上再次测试它

由于随机错误:通常您只有有限数量的案例。

验证(内部测试)性能的优化意味着您可能过度拟合该内部测试集。内部测试集有助于最终模型的估计,因此不独立于模型。

这意味着如果您想估计泛化属性,您需要有另一个(外部)测试集,该测试集独立于整个建模过程(包括所有优化和数据驱动的预处理或模型选择过程)。

我建议您进行模拟并比较您可以拥有的三种不同的误差估计

  • 重新替换:训练集的预测
    测量拟合优度
  • 内部测试(在您的命名法中:验证)集:优化器认为达到的质量
  • 外部测试集:泛化误差,与模型训练无关。

在模拟中,您也可以轻松地将它们与适当的、大型的、独立生成的测试集进行比较。如果设置正确,则外部测试应该是无偏的(使用它评估的代理模型,而不是基于整个数据集的“最终”模型)。内部测试通常是乐观的,而重新代入则更加乐观。

在我的领域中,内部测试很容易将泛化误差低估 2 - 5 倍(对于激进的优化方案来说要高得多)。


注意:集合的命名不是通用的。在我的领域(分析化学)中,验证通常意味着证明最终程序的性能 - 因此您的“测试”集所做的比您的“验证”集所做的更多。

因此,我更喜欢谈论内部和外部测试集,或优化测试集(= 内部测试集),然后验证集将意味着外部测试集。

在训练模型时,必须为模型选择元参数(例如,正则化参数),甚至从多个模型中进行选择。在这种情况下,验证子集用于参数选择,而测试子集用于最终预测估计。