嵌套交叉验证,用于模型选择


91

如何使用嵌套交叉验证进行模型选择

根据我在网上阅读的内容,嵌套的简历的工作方式如下:

  • 在内部CV循环中,我们可以进行网格搜索(例如,对每种可用模型进行K折运算,例如,超参数/功能的组合)
  • 在外部CV循环中,我们在一个单独的外部折叠中测量在内部折叠中获胜的模型的性能。

在此过程结束时,我们得到模型(是外部循环中的折叠数)。这些模型是在内部CV的网格搜索中获胜的模型,并且它们可能是不同的(例如,具有不同内核的SVM,根据网格搜索而训练有可能具有不同的功能)。KK

如何从此输出中选择模型?在我看来,从这获胜的模型中选择最佳模型并不是一个公平的比较,因为每个模型都是在数据集的不同部分进行训练和测试的。K

那么如何使用嵌套的简历进行模型选择呢?

我也阅读了一些有关讨论嵌套模型选择对分析学习过程如何有用的话题。我从外部K折中得到的分数可以进行哪些类型的分析/检查?

Answers:


76

如何从此[外部交叉验证]输出中选择模型?

简短的回答:您没有。

内部交叉验证视为模型拟合过程的一部分。这意味着包括超参数的拟合(内部交叉验证隐藏的地方)的拟合与任何其他模型估算例程一样。
外部交叉验证估计了此模型拟合方法的性能。为此,您使用通常的假设

  • 该外替代模型相当于通过内置的“真实”的模式 与所有数据。kmodel.fitting.procedure
  • 或者,在情况1.崩溃(重采样验证的悲观偏差)的情况下,至少外部替代模型彼此等效。 这使您可以汇总(平均)测试结果。这也意味着您无需在它们之间进行选择,因为您假定它们基本相同。第二个较弱的假设的失败是模型的不稳定性。k

不要挑看似最好的替代机型-通常是只“收获”测试的不确定性,导致了偏向乐观。k

那么如何使用嵌套的简历进行模型选择呢?

内部 CV作选择。

在我看来,从这K个获胜的模型中选择最佳模型并不是一个公平的比较,因为每个模型都是在数据集的不同部分进行训练和测试的。

您说对了,选择代理模型中的一个不是一个好主意。但是你错了的原因。真正原因:见上文。他们没有在相同的数据上训练和测试的事实在这里不会“伤害”。k

  • 没有相同的测试数据:如您稍后要声称测试结果一般适用于从未见过的数据,这不会有所作为。
  • 没有相同的训练数据:
    • 如果模型是稳定的,则没有任何区别:这里的稳定意味着,如果通过用其他情况替换一些情况而“干扰”了训练数据,则模型不会改变(太多)。
    • 如果模型不稳定,则三个注意事项很重要:
      1. 您可以通过使用迭代/重复的 倍交叉验证来实际测量情况是否如此以及在何种程度上。这样一来,您就可以比较由基于略有不同的训练数据的不同模型预测的同一案例的交叉验证结果。k
      2. 如果模型不稳定,则在倍交叉验证的测试结果上观察到的方差会增加:由于仅总共测试了有限数量的案例,您不仅会有方差,而且还有其他方差由于模型的不稳定性(预测能力的差异)。k
      3. 如果不稳定是一个真正的问题,则不能很好地推断“真实”模型的性能。

这使我想到了您的最后一个问题:

我从外部K折中得到的分数可以进行哪些类型的分析/检查?

  • 检查预测的稳定性(使用迭代/重复交叉验证)
  • 检查优化的超参数的稳定性/变异性。
    一方面,疯狂散布的超参数可能表明内部优化无效。另一方面,这可能使您无需在未来类似情况下进行昂贵的优化步骤即可决定超参数。对于昂贵的我,我不是指计算资源,而是指这样的事实:该“开销”信息可以更好地用于估计“正常”模型参数。

  • 检查所选模型的内部和外部估计之间的差异。如果差异很大(内部过于优化),则存在内部优化由于过度拟合而无法正常工作的风险。


更新@ user99889的问题:如果外部简历发现不稳定,该怎么办?

首先,在外部CV循环中检测模型在这方面未产生稳定的预测与检测前兆误差对于应用程序而言并没有太大不同。这是模型验证(或验证)的可能结果之一,表明我们拥有的模型不适合其目的。

在回复@davips的评论中,我正在考虑解决内部 CV中的不稳定性-即作为模型优化过程的一部分。

但是您当然是对的:如果我们基于外部CV的发现更改模型,则还需要对更改后的模型进行另一轮独立测试。
但是,外部CV的不稳定性也会表明优化设置不正确-因此,找到外部CV的不稳定性就意味着内部CV不会以必要的方式惩罚不稳定性-这就是我的主要观点在这种情况下批评。换句话说,为什么优化允许/导致严重过度拟合的模型?

但是,这里有一个特殊之处,即IMHO 在仔细考虑了确切的情况后,可能会为“最终”模型的进一步更改辩解:由于我们确实发现了过度拟合,因此对该模型的任何提议更改(较少df /更严格的限制或汇总)都会在的方向较少过度拟合(或在较不倾向于过度拟合至少超参数)。独立测试的目的是检测过度拟合-训练过程中已经使用的数据可以检测出过度拟合。

因此,如果我们要谈论的是进一步减少PLS模型中相对良性的潜在变量的数量(如果提议的更改将是完全不同的模型类型,比如说PLS而不是SVM,那么所有押注将不成立),如果我知道我们仍然处于建模的中间阶段,我会更加放松-毕竟,如果优化的模型仍然不稳定,那么毫无疑问需要更多的案例。另外,在许多情况下,您最终将需要进行旨在适当测试性能各个方面(例如,对将来获取的数据的概括)的研究。尽管如此,我仍然坚持需要报告整个建模过程,并且需要仔细讨论这些最新更改的含义。

同样,从已经存在的结果中可以进行包括性能的综合和袋外模拟CV评估 -这是我愿意在这里考虑的良性模型的另一种“后处理”。再一次,如果从一开始就设计该研究以检查聚合没有提供优于单个前提的优势(这是说单个模型稳定的另一种方式),那就更好了。


更新(2019):我对这些情况的思考越多,我越喜欢“显然没有嵌套的嵌套交叉验证”方法


Wrt模型选择,如果分类器不稳定,是否应该在最佳模型中选择性能中位数的模型?该选择类似于您将内部性能与外部性能进行比较的建议。
2014年

2
@davips:如果模型不稳定,则优化将无法进行(不稳定会导致额外的方差)。但是,选择一个具有中值(或平均)性能的模型将无济于事。相反,如果模型不稳定,建议您选择限制性更强的模型(例如,更强的正则化)或建立模型集合(与选择一个模型根本不同)。
cbeleites 2014年

1
@ user99889:请参阅更新的答案。
cbeleites

1
@ user99889:是的-但不要指望那里有奇迹。如果在80%的案例(k = 5)进行训练时稳定性是一个问题,那么在k = 10的情况下仍可能是个问题,即与80%/ k = 5的替代模型相比,n的90%=额外的12.5%。
cbeleites

1
@cbeleites:一个相关的假设。假设我决定搜索参数空间c:[1,2,3]。我在整个数据集上执行嵌套的简历,发现性能不是很好。因此,我将搜索空间扩展到c:[0.5,1,1.5,2,2.5,3,3.5,4]。我做得很糟糕吗?似乎我已经根据从测试数据中获得的知识本质上改变了参数空间(这是建模过程的一部分),因此需要对当前数据集外部的数据集进行评估吗?如果您认为这是最好的,那么很高兴将此问题单独提出。
user0

27

除了cebeleites最佳答案(+1),基本思想是交叉验证用于评估拟合模型的方法的性能,而不是模型本身。如果您需要执行模型选择,那么您需要在交叉验证过程的每一步中独立执行,因为它是模型拟合过程的组成部分。如果您使用基于交叉验证的模型选择过程,则意味着您将获得嵌套的交叉验证。考虑每个交叉验证的目的很有帮助-一个用于模型选择,另一个用于性能估计。

在使用嵌套的交叉验证来获得我可以合理地期望从该模型获得的性能的想法之后,我将通过使模型(包括模型选择)适合整个数据集来构建最终模型。


1
为什么需要get an idea of the performance
viyps

1
@davips通常,如果将统计方法用于某些实际目的,则用户通常会希望对它的运行情况有所了解(例如,医学筛查测试)。同样,如果您正在开发一种机器学习算法,那么与竞争对手的方法相比,对其性能有一个公正的估计会很有用。这也是验证该方法是否有效的一种有用方法(如果将交叉验证用于选择参数和评估性能,则该方法将无效)。
2014年

5
因此,要真正决定在最终模型中使用哪个参数,您将执行一次内部循环?因此,如果内部循环是10倍验证,您将支持1/10的数据序列,每个模型重复10次,然后选择平均误差最小的参数值?然后在整个数据集上使用该参数值重新训练模型?
emschorsch

2
对,那是正确的。r
Dikran有袋动物2015年

1
@FedericoTedeschi交叉验证需要嵌套,而不仅仅是不同的拆分,以便获得公正的性能估算器(请参阅我的论文jmlr.csail.mit.edu/papers/volume11/cawley10a/cawley10a.pdf的 5.3节) 。通常,我只将LOOCV用于可以高效计算的模型的模型选择,并且会对小型数据集的模型使用自举/袋装(OOB错误代替了外部交叉验证)。
迪克兰有袋动物协会

7

我认为没有人真正回答过第一个问题。我认为“嵌套交叉验证”是指将其与GridSearch结合使用。通常,GridSearch内置了CV,并采用一个参数来表示我们要测试的折叠数。结合这两者,我认为这是一个很好的做法,但是GridSearch和CrossValidation的模型不是您的最终模型。您应该选择最佳参数,并最终使用所有数据训练一个新模型,或者甚至在此处对看不见的数据也进行CrossValidation,然后,如果模型真的那么好,您就可以对所有数据进行训练。那就是你的最终模型。


3
需要说明的是,在python scikit-learn中,GridSearchCV(refit=True)实际上确实使用最佳参数对FULL数据重新拟合了模型,因此不需要额外的步骤。 查看文件
保罗

您对改装选项是正确的。我只是说很明显!
anselal '18年

“来自GridSearch的模型不是您的最终模型”。但是我的观点是,带有refit = True的网格搜索模型最终模型。您是说您和我在同一页面上吗?但是,我仍然看不到使用CV进行网格搜索时嵌套的位置。对我来说,似乎是CV的单层(例如,网格搜索中的5倍CV是CV的单层)。
保罗

关于改装,我们在同一页上。但是,使用嵌套的CV,我们的意思是您在GridSearch之外创建了另一个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.