在交叉验证后使用完整数据集进行训练?


139

在交叉验证后训练整个数据集总是一个好主意吗?换一种说法,它是确定与培训所有在我的数据集的样本,能够检查这个特定的装置overfits


问题的一些背景:

假设我有一个由α参数化的模型系列。还说我有一组N个数据点,并且我通过k倍交叉验证进行模型选择,以选择最能概括数据的模型。αN

对于模型选择,我可以例如通过对每个候选者进行k倍交叉验证来在上进行搜索(例如,网格搜索)。在每个交叉验证的褶皱的,我结束了学习的模型β αα βα

交叉验证的重点是,对于每个折叠,我都可以通过在“看不见的数据”上进行测试来检查学习的模型是否过拟合。根据结果,我可以选择的型号的参数了解到→交通α最好的网格中的搜索交叉验证过程中广义最好的。βbestαbest

Nαbestβfull βfull 在任何看不见的数据上。解决此问题的正确方法是什么?


2
几乎完全重复:stats.stackexchange.com/questions/52274,其中有很多有价值的答案。也许这些线程应该合并,但是我不确定哪个方向。双方都接受了非常好的答案。
amoeba

Answers:


111

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

α

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

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

GC Cawley和NLC Talbot,模型选择中的过拟合和性能评估中的后续选择偏差,《机器学习研究期刊》,2010年。11,第2079-2107页,2010年7月。(wwwpdf

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

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

因此,您的问题的答案是(i)是,您应该使用完整的数据集来生成最终模型,因为您使用的数据越多,推广的可能性就越大;但(ii)确保通过嵌套交叉验证,并可能考虑对交叉验证统计信息进行惩罚,以进一步避免模型选择过拟合。


3
+1:回答问题:“如果您使用交叉验证来估计模型的超参数(αs),然后使用那些超参数将模型拟合到整个数据集,那么很好……”
尼尔G

4
@soufanom,不,使用“初始实验”对模型进行选择可能会导致过度拟合,并且几乎可以肯定的是,性能分析中会引入乐观的偏见。用于性能分析的交叉验证必须在每个折叠中重复用于独立拟合模型的每个步骤。我的论文中的实验表明,内核模型可能对这种偏差非常敏感,因此至关重要的是,要尽可能严格地执行模型选择和性能评估。
迪克兰有袋博物馆,2012年

3
对于诸如SVM之类的内核方法,通常可以在几乎没有计算成本的情况下执行留一法式交叉验证(请参阅我的答案中列出的论文)。我使用这种“虚拟的”留一法式交叉验证来调整超参数,并嵌套在k倍交叉验证中以进行性能评估。这样的成本是相当合理的。在我看来,使用任何过程都无法通过对超参数进行调整而使性能评估产生偏差的做法是不可接受的。获得可靠的估计值是值得的计算费用。
迪克兰有袋博物馆,2012年

2
@DikranMarsupial。我不太明白你的回答中的第三段。如果我进行嵌套交叉验证,则对于外部 CV的每一折叠,我将获得不同的超参数集(即,通过在参数网格上运行内部 CV而获得一组超参数)。然后,如何选择最佳的超参数集?
阿梅里奥·瓦兹克斯·雷纳

1
交叉验证基本上是估计的性能的手段方法拟合模型,而不是方法本身的。因此,在执行嵌套的交叉验证以获取性能估计之后,只需使用交叉验证的过程(包括选择超参数),使用整个数据集重建最终模型。
迪克兰有袋博物馆,

23

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

不要忽略rms包的强大之处,而是caret让您几乎可以适应R中可用的每种学习方法,而validate仅适用于rms方法(我认为)。

caret软件包是用于预处理数据,拟合和评估任何流行模型的单一基础结构,因此,它易于用于所有方法,并提供了许多性能指标的图形化评估(某些问题可能会在过拟合问题旁边显着影响模型的选择,因为以及您的网格和可变的重要性。

参见vignettes包以开始使用(使用非常简单)使用插入符号进行
数据预处理
变量选择使用插入
符号进行变量建模的
重要性

您还可以查看插入符号网站,以获取有关该软件包的更多信息以及特定的实现示例:
官方插入符号网站


谢谢。您是否知道,在选择模型后(通过调用train),是否可以在插入符号中训练完整的数据集?
2013年

不确定这是个好主意还是为什么要这么做,但是您可以将火车返回的最终模型拟合到完整的数据集。
Momo 2013年

16

我相信Frank Harrell建议使用引导程序验证,而不是交叉验证。Bootstrap验证可让您验证装配在完整数据集上的模型,并且比交叉验证更稳定。您可以使用validateHarrell的rms软件包在R中进行操作。

有关更多信息,请参见Harrell所著的“回归建模策略”和/或Efron和Tibshirani所著的“ Bootstrap入门”。


9
省略关于“不良CV”的下一个神话,这是一个术语问题-Harrell的“交叉验证”表示N倍CV,“引导验证”表示重新采样CV。显然,我同意第二种味道更稳定且总体上更好,但这也是交叉验证的一种。

1
mark999或@mbq,您介意引导程序如何使人们验证适合整个数据集的模型吗?
2013年

1
@ user27915816好吧,原则上是这样;交叉验证的思想是,您测试给定的训练方法是否确实在与最终模型非常相似的集合上可靠地制作了良好的模型,如果是,则在无任何假设的情况下将这种观察推广到整个集合,并保持沉默而且您使用的CV方法也不会有偏见。当然,这几乎总是足够好,但是您仍然无法确定基于所有数据构建的模型不会过拟合。

14

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

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

事实是,您只能对一个事物使用(一个)验证步骤:用于参数优化,(x)或用于评估泛化性能。

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

因此,这是本文的问题:k折交叉验证后,使用完整的数据集进行训练是一个好主意吗?还是坚持使用在交叉验证拆分之一中学习的模型中的一种来获得更好的效果更好?

使用交叉验证模型之一通常比对完整模型进行训练更糟糕(至少如果您的学习曲线性能= f(nsamples)仍在增加。实际上,这是:如果不是,则您可能已经设置了交叉验证模型除了独立的测试仪。)

如果您发现交叉验证模型之间的差异很大(具有相同的参数),那么您的模型将不稳定。在那种情况下,与使用对整个数据训练的一个模型相比,对模型进行汇总可以提供帮助,并且实际上会更好。

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

这是我们使用该技术的论文:
Beleites,C.&Salzer,R .:在小样本量情况下评估和改进化学计量学模型的稳定性,Anal Bioanal Chem,390,1261-1271(2008)。
DOI:10.1007 / s00216-007-1818-6

也许最重要的是,我该如何训练数据集中的所有点并仍然与过度拟合作斗争?

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


...If you observe a large variation between the cross validation models (with the same parameters), then your models are unstable. In that case, aggregating the models can help...您能再解释一下吗?例如,如果我以10 k交叉验证的设置运行logistic回归并最终得到10组系数,您是否建议汇总coeff估计值以形成最终模型?如果是这样,仅采取手段如何做到?
朱巴卜2014年

您可以详细说明@cbeleites If the d.f. are actually appropriate for the cross validation models。根据我的理解,您认为训练/验证集与完整数据集相比不是很大,对吗?
jpcgandre 2014年

1
@jpcgandre:选择一种替代模型以进一步使用实际上是一种数据驱动的模型选择,这意味着您需要外部独立的验证级别。通常,除非您有足够的案例,否则您实际上可以在测试的基础上进行具有统计意义的模型比较1k

1
更重要的是:迭代的交叉验证代理模型共享同一组超参数。也就是说,它们在您认为很重要的所有方面都是等效的,但可以随意选择培训和测试用例。因此,选择一个“好的”模型实际上首先应该选择一个好的测试/培训集组合-从根本上讲,这通常是我们通常希望的:我们希望选择一个能够很好地概括并因此不仅适用于有利情况的选择。从这个角度来看,从“正常”交叉验证中选择代理模型对我来说没有任何意义。
cbeleites 2014年

1
@jpcgandre:(df)我认为选择适合于训练的模型复杂度11k

6

您要做的不是交叉验证,而是某种随机优化。

CV的想法是通过在对象的子集上执行几轮模型构建并在其余对象上进行测试来模拟看不见数据的性能。所有回合的平均结果是在整个训练集上训练的模型的性能近似值

在选择模型的情况下,您应该为每个参数集执行完整的CV,从而为每个设置获得完整的性能近似值,这似乎是您想要的。

但是,请注意,不能完全保证最佳近似精度的模型实际上是最好的-您可以对整个模型选择过程进行交叉验证,以查看参数空间中存在一定范围的差异。模型的准确性并不重要。


2
β

@AmV如果是这样,那么好-正如我所写,CV已经测试了完整的场景,如果没有新数据,您不能说更多。同样,您最多可以进行嵌套的CV来查看模型选择本身是否没有过拟合(如果选择提供了很好的改进或数据比较嘈杂,则这样做的风险会很大)。
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.