交叉验证后对完整数据集进行训练?

机器算法验证 机器学习 交叉验证 模型选择
2022-02-04 12:08:19

TL:DR:在将 ML 模型投入生产之前,在所有可用数据上训练一个 ML 模型是不是一个好主意?换句话说,是否可以对所有可用数据进行训练而不检查模型是否过拟合,或者最终读取模型的预期性能?


假设我有一系列参数化的模型例如,我可以通过对每个候选者运行 k 折交叉验证来对αα

使用交叉验证来选择的要点是,我可以通过在每次 CV 迭代(验证集)中对“未见过的数据”进行测试来检查特定学习模型是否具有例如过度拟合。在遍历所有之后,我可以选择一个模型学习的参数似乎在网格搜索中表现最好,例如平均所有折叠。αβiαiαiβαα

现在,假设在选择模型之后,我想使用所有可用的数据来尝试在生产中提供最好的模型。为此,我可以使用通过交叉验证的网格搜索选择 ) 数据集上训练模型后,我将获得一个的学习模型αFβαF

问题是,如果我使用我的整个数据集进行训练, 我无法可靠地检查这个新的学习模型 是否过拟合或者它在看不见的数据上的表现。那么这是一个很好的做法吗?思考这个问题的好方法是什么?βαF

4个回答

考虑交叉验证的方法是估计使用构建模型的方法获得的性能,而不是估计模型的性能。

如果您使用交叉验证来估计模型的超参数( s),然后使用这些超参数将模型拟合到整个数据集,那么这很好,只要您认识到交叉验证估计的绩效很可能(可能相当大)有乐观的偏见。这是因为已经选择了部分模型(超参数)来最小化交叉验证性能,所以如果交叉验证统计量具有非零方差(并且它会),则存在过拟合的可能性模型选择标准。α

如果要选择超参数并估计结果模型的性能,则需要执行嵌套交叉验证,其中外部交叉验证用于评估模型的性能,并且在每个折叠交叉验证中验证用于分别确定每个折叠中的超参数。您通过对整个集合使用交叉验证来选择超参数来构建最终模型,然后使用优化的超参数在整个数据集上构建分类器。

这当然在计算上是昂贵的,但值得,因为不正确的性能估计引入的偏差可能很大。看我的论文

GC Cawley 和 NLC Talbot,模型选择中的过度拟合和性能评估中的后续选择偏差,机器学习研究杂志,2010 年。研究,第一卷。11,第 2079-2107 页,2010 年 7 月。( www , pdf )

但是,在模型选择中仍然可能存在过度拟合(嵌套交叉验证只允许您对其进行测试)。我发现一种有用的方法是在交叉验证错误中添加一个正则化项,以惩罚可能导致过于复杂的模型的超参数值,请参阅

GC Cawley 和 NLC Talbot,通过超参数的贝叶斯正则化防止模型选择中的过度拟合,机器学习研究杂志,第 8 卷,第 841-861 页,2007 年 4 月。(wwwpdf

所以你的问题的答案是 (i) 是的,你应该使用完整的数据集来生成你的最终模型,因为你使用的数据越多,它就越有可能很好地概括,但是 (ii) 确保你通过以下方式获得无偏的性能估计嵌套交叉验证,并可能考虑惩罚交叉验证统计量,以进一步避免模型选择中的过度拟合。

只是为了补充@mark999 的答案,Max Kuhn 的caret包(分类和回归训练)是 R 中基于引导交叉验证或 N 折 CV 以及其他一些方案的模型选择最全面的来源。

不要忽视rms软件包的伟大之处,而是caret让您适应 R 中几乎所有可用的学习方法,而validate仅适用于rms方法(我认为)。

caret软件包是预处理数据、拟合和评估任何流行模型的单一基础设施,因此它易于用于所有方法,并提供对许多性能度量的图形评估(紧挨过拟合问题可能会显着影响模型选择,因为好)超过你的网格和可变的重要性。

请参阅包 vignettes 以开始使用(使用起来非常简单)
Data Preprocessing
Variable Selection with caret
Model Building with caret
Variable Importance

您还可以查看 caret 网站以获取有关该软件包的更多信息以及具体实施示例:
官方 caret 网站

我相信 Frank Harrell 会推荐引导验证而不是交叉验证。Bootstrap 验证将允许您验证适合完整数据集的模型,并且比交叉验证更稳定。你可以在 R 中使用validateHarrell 的rms包来完成。

有关详细信息,请参阅 Harrell 的“回归建模策略”和/或 Efron 和 Tibshirani 的“Bootstrap 简介”一书。

我认为您在这里有很多不同的问题:

问题是,如果我使用数据集中的所有点进行训练,我无法检查这个新学习的模型 βfull 是否过拟合!

问题是,您只能将(一个)验证步骤用于一件事:用于参数优化,(x)或用于估计泛化性能。

因此,如果您通过交叉验证(或任何其他类型的数据驱动参数确定)进行参数优化,您需要独立于那些训练和优化样本的测试样本。Dikran 称之为嵌套交叉验证,另一个名字是双重交叉验证。或者,当然,一个独立的测试集。

所以这篇文章的问题是:在 k 折交叉验证之后用完整的数据集进行训练是个好主意吗?还是坚持使用在 αbest 的交叉验证拆分之一中学习的模型之一更好?

使用其中一种交叉验证模型通常比在完整集上进行训练更糟糕(至少如果您的学习曲线性能 = f (nsamples) 仍在增加。在实践中,它是:如果不是,您可能会设置除了一个独立的测试集。)

如果您观察到交叉验证模型(具有相同参数)之间的巨大差异,那么您的模型是不稳定的。在这种情况下,聚合模型可以帮助并且实际上比使用在整个数据上训练的一个模型更好。

更新:这种聚合是套袋背后的想法,它应用于不带替换的重采样(交叉验证),而不是带替换的重采样(引导/引导外验证)。

这是我们使用此技术的论文:
Beleites, C. & Salzer, R.:Assessing and Improvement the stability of Chemistry Models in small sample size situation, Anal Bioanal Chem, 390, 1261-1271 (2008)。
DOI: 10.1007/s00216-007-1818-6

也许最重要的是,我怎样才能在训练数据集中的所有点的同时仍然对抗过度拟合?

通过对“最佳”模型允许的自由度非常保守,即考虑到优化交叉验证结果的(随机)不确定性。如果 df 实际上适用于交叉验证模型,那么它们对于更大的训练集来说并不太可能是很好的。陷阱在于参数优化实际上是多次测试。您需要防止意外好看的参数集。