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

机器算法验证 交叉验证 模型选择
2022-01-28 13:30:16

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

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

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

在这个过程结束时,我们最终得到了个模型(是外循环中的折叠数)。这些模型是在内部 CV 中的网格搜索中获胜的模型,并且它们可能是不同的(例如,具有不同内核的 SVM,使用可能不同的特征进行训练,具体取决于网格搜索)。KK

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

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

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

4个回答

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

简短的回答:你没有。

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

  • 个外部代理模型等价于使用所有数据构建的“真实” 模型kmodel.fitting.procedure
  • 或者,在情况 1. 发生故障(重采样验证的悲观偏差)的情况下,至少个外部代理模型彼此等价。 这允许您汇集(平均)测试结果。这也意味着您不需要在它们之间进行选择,因为您假设它们基本相同。第二个较弱的假设的崩溃是模型不稳定性。k

不要选择看似最好的个代理模型——这通常只是“收获”测试不确定性并导致乐观偏差。k

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

内部CV进行选择。

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

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

  • 没有相同的测试数据:因为您想在事后声称测试结果概括为从未见过的数据,这不会产生影响。
  • 没有相同的训练数据:
    • 如果模型是稳定的,这没有什么区别:这里的稳定意味着如果训练数据通过用其他案例替换一些案例而受到“扰动”,则模型不会改变(很多)。
    • 如果模型不稳定,三个考虑因素很重要:
      1. 您实际上可以通过使用迭代/重复 折交叉验证来衡量这种情况是否以及在何种程度上是这种情况。这使您可以比较相同案例的交叉验证结果,这些结果是由基于略有不同的训练数据构建的不同模型预测的。k
      2. 如果模型不稳定,则在折交叉验证的测试结果中观察到的方差会增加:您不仅因为总共只测试了有限数量的案例而具有方差,而且还有额外的方差由于模型的不稳定性(预测能力的差异)。k
      3. 如果不稳定性是一个真正的问题,您就无法很好地推断“真实”模型的性能。

这让我想到了你的最后一个问题:

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

  • 检查预测的稳定性(使用迭代/重复交叉验证)
  • 检查优化的超参数的稳定性/变化。
    一方面,大量分散的超参数可能表明内部优化不起作用。另一方面,这可以让您在未来类似情况下无需昂贵的优化步骤就可以决定超参数。由于成本高昂,我不是指计算资源,而是指这种“成本”信息可能更好地用于估计“正常”模型参数的事实。

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


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

首先,在外部 CV 循环中检测模型在这方面没有产生稳定的预测与检测预测误差对于应用程序来说太高并没有真正的不同。这是模型验证(或验证)的可能结果之一,暗示我们拥有的模型不适合其目的。

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

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

但是,这里有一个特点,恕我直言,在仔细考虑了确切情况,恕我直言“最终”模型的进一步更改:正如我们确实检测到过度拟合,对模型的任何提议更改(更少的 df/更多限制性或聚合)都会朝着太过拟合的方向发展(或者至少是不太容易过拟合的超参数)。独立测试的重点是检测过拟合——欠拟合可以通过已经在训练过程中使用的数据来检测。

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

此外,从已经可用的结果中,包括和袋外模拟 CV 性能估计在内的聚合是可能的——这是我愿意在这里考虑的模型的另一种类型的“后处理”。再一次,如果研究从一开始就设计为检查聚合没有提供优于个体预测的优势(这是另一种说法,个体模型是稳定的),那就更好了。


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

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

在使用嵌套交叉验证来了解我可以合理地期望从该模型中获得的性能之后,我将通过将模型(包括模型选择)拟合到整个数据集来制作我的最终模型。

我认为没有人真正回答第一个问题。通过“嵌套交叉验证”,我认为他的意思是将它与 GridSearch 结合起来。通常 GridSearch 内置了 CV,并接受我们希望测试的折叠次数的参数。将这两者结合起来,我认为这是一个很好的做法,但来自 GridSearch 和 CrossValidation 的模型并不是你的最终模型。你应该选择最好的参数并最终用你的所有数据训练一个新模型,或者甚至在这里对看不见的数据进行交叉验证,然后如果模型真的那么好,你就用你的所有数据训练它。那是你的最终模型。

正如cebeleites的回答已经指出的那样,内部和外部CV循环有不同的用途:内部CV循环用于获得最佳模型,外部CV循环可以用于不同的目的。它可以帮助您以更公正的方式估计最佳性能模型的泛化误差。此外,它还让您深入了解内部 CV 循环的“稳定性”:性能最佳的超参数是否与不同的外部折叠一致?对于此信息,您付出了高昂的代价,因为您将优化过程重复 k 次(k-Fold 外部 CV)。如果您的目标只是估计泛化性能,我会考虑下面描述的另一种方法。

根据Bergstra 和 Bengio 的这篇论文:超参数优化的随机搜索(4000 次引用,截至 2019 年):

目标:进行超优化以获得最佳模型并报告/了解其泛化错误

您的可用数据只是通常未知分布的一小部分。简历可以通过给你一个期望的平均值而不是一个单一的期望来提供帮助。CV 可以帮助您选择最佳模型(最佳超参数)。您也可以在此处跳过 CV,但代价是更少的信息(不同数据集的期望均值、方差)。

最后,您将从内部循环中选择性能最佳的模型(例如随机搜索有/无 CV 的超参数)。

现在你有了你的“最佳”模型:它是超优化循环的赢家。

在实践中,会有几种不同的模型表现得几乎一样好。在报告您的测试错误时,您必须小心:

然而,当不同的试验具有接近最优的验证手段时,就不清楚要报告哪个测试分数,而稍微不同的 λ [单个固定超参数集]选择可能会产生不同的测试误差。解决选择困难获胜者,我们报告所有测试集分数的加权平均值,其中每个分数都由其特定 λ(s) 实际上是最佳的概率加权。

有关详细信息,请参阅论文。它涉及计算您在超优化循环中评估的每个模型的测试误差。这应该比嵌套的 CV 便宜!

所以:这种技术是从超优化循环中选择的模型估计泛化误差的替代方法!

注意:在实践中,大多数人只进行一次超优化(通常使用 CV)并报告测试集的性能。这可能过于乐观了。