k折交叉验证后如何选择预测模型?


148

我想知道在进行K折交叉验证后如何选择预测模型。

这句话可能有些尴尬,所以让我更详细地解释一下:每当我进行K折交叉验证时,我都会使用K个训练数据子集,最后得到K个不同的模型。

我想知道如何选择K个模型中的一个,以便可以将其呈现给某人并说“这是我们可以生产的最好的模型”。

可以选择K个型号中的任何一个吗?还是涉及某种最佳实践,例如选择实现中位数测试误差的模型?


2
:您可能会发现答案在以下问题很有帮助stats.stackexchange.com/questions/2306/...
BGreene

您将需要重复5倍CV 100次并取平均结果以获得足够的精度。@bogdanovist的答案就在现场。您可以通过更少的模型拟合从引导程序获得相同的精度估计精度。
Frank Harrell

@弗兰克·哈雷尔(Frank Harrell),为什么您说必须重复100次(我通常会在10折上使用10次重复),这是经验法则,因为OP没有提供任何细节?
BGreene

2
对于10倍的简历,最好重复。5倍需要更多重复。这些是经验法则。一个10倍的简历将给出一个不稳定的答案,即重复10次拆分,您将获得足够多的其他答案,您可以放心。50
Frank Harrell 2013年

几乎完全重复:stats.stackexchange.com/questions/11602,其中包含许多有价值的答案。也许这些线程应该合并,但是我不确定哪个方向。双方都接受了非常好的答案。但是另一个比较老,并且有更多的视图/投票,因此将这个合并到另一个可能是有意义的。
amoeba

Answers:


200

我认为您对交叉验证的目的尚缺乏理解。

让我们直接讲一些术语,通常当我们说“模型”时,我们指的是一种特定的方法,用于描述某些输入数据与我们要预测的内容之间的关系。通常,我们通常不会将该方法的特定实例称为不同的模型。因此,您可能会说“我有线性回归模型”,但是不会将两组不同的训练系数称为不同模型。至少不是在模型选择的情况下。

因此,当您进行K折交叉验证时,您正在测试模型能够通过某些数据进行训练的能力,然后预测未看到的数据。我们为此使用交叉验证,因为如果您使用所拥有的所有数据进行训练,那么您将没有任何数据可以进行测试。您可以执行一次操作,例如使用80%的数据进行训练而使用20%的数据进行测试,但是如果您碰巧选择了20%的数据进行测试会碰巧包含一堆特别容易(或特别困难)的点,该怎么办?预测?我们将不会对模型的学习和预测能力提出最佳估计。

我们要使用所有数据。因此,继续上面的80/20拆分示例,我们将通过对80%的数据进行5次训练并对20%的数据进行测试,进行5次交叉验证。我们确保每个数据点仅在20%测试集中结束一次。因此,我们已经使用每个数据点来帮助理解我们的模型执行从某些数据中学习并预测一些新数据的任务的效果。

但是交叉验证的目的不是要提出最终模型。我们不使用我们训练后的模型的这5个实例来进行任何真实的预测。为此,我们要使用所有数据,我们必须提供最佳模型。交叉验证的目的是模型检查,而不是模型构建。

现在,假设我们有两个模型,例如线性回归模型和神经网络。我们如何说哪​​种模式更好?我们可以进行K折交叉验证,看看哪种方法在预测测试设定点方面更有效。但是,一旦我们使用交叉验证来选择性能更好的模型,便会在所有数据上训练该模型(无论是线性回归还是神经网络)。对于最终的预测模型,我们不使用在交叉验证过程中训练的实际模型实例。

请注意,有一种称为引导程序聚合的技术(通常简称为“装袋”),该技术使用以类似于交叉验证的方式生成的模型实例来构建集成模型,但这是一种超出范围的高级技术。您的问题在这里。


8
我完全同意这一点,并考虑使用所有数据。就是说,如果我们使用整个数据集来训练最终模型,那么这是否会导致过度拟合从而破坏未来的预测?
Berk U.

19
没有!过度拟合与模型的复杂性有关,与用于训练模型的数据量无关。模型的复杂性与模型使用的方法有关,而不是参数所取的值。例如,是否在回归模型中包括x ^ 2系数以及x系数。
Bogdanovist

17
@Bogdanovist:我想说的是,过度拟合与模型太复杂的训练案例太少有关。因此,它(也)与培训案例的数量有关。但是,拥有更多的培训案例将减少过度拟合的风险(对于恒定的模型复杂性)。
cbeleites

3
@Bogdanovist- For that we want to use all the data we have to come up with the best model possible.使用K折交叉验证进行网格搜索时,这是否意味着您将使用网格搜索找到的最佳参数并将模型拟合整个训练数据,然后使用测试集评估泛化性能?
2016年

4
@arun,如果您使用了k倍交叉验证,并选择了具有最佳参数和超参数的最佳模型,那么在将最终模型拟合到训练集之后,则无需再次使用测试集。这是因为您已经检查了带有指定参数的模型在看不见的数据上的表现。
Sandeep S. Sandhu

29

除了Bogdanovist的回答,让我提出几点意见

如您所说,您训练了不同的模型。它们的区别在于,训练数据的1 /(k-1)与其他情况进行了交换。这些模型有时称为代理模型,因为针对这些模型测得的(平均)性能被视为在所有情况下训练的模型的性能的替代。k

现在,在此过程中有一些假设。

  • 假设1:替代模型等效于“整个数据”模型。
    打破这种假设是很常见的,其症状是众所周知的倍交叉验证(或其他基于重采样的验证方案)的悲观偏见。如果学习曲线仍然具有正斜率(即较少的训练样本会导致较差的模型),则替代模型的性能平均比“整体数据”模型的性能差。k

  • 假设2是假设1的较弱版本:即使代理模型平均比整个数据模型差,我们也假设它们彼此等效。这样可以将代理模型的测试结果汇总为一个平均性能。 模型的不稳定性导致此假设的失效:在训练案例上训练的模型的真实性能差异很大。您可以通过执行倍交叉验证(对个子集的新随机分配)的迭代/重复并查看同一情况下不同代理模型的预测之间的方差(随机差异)来衡量此结果。N k 1k
    ķķNk1kkk

  • 有限数量的案例意味着性能测试将由于有限数量的测试案例而受到随机误差(方差)的影响。这种方差源不同于(因此增加了)模型不稳定方差。

观察到的性能差异是由于这两个差异来源所致。

您考虑的“选择”是一个数据集选择:选择一个替代模型意味着选择训练样本的子集,并声称该训练样本的子集会产生上级模型。尽管可能确实如此,但通常“虚伪”是虚假的。无论如何,由于选择“最佳”替代模型是数据驱动的优化,因此您需要使用新的未知数据来验证(衡量性能)该选择的模型。此交叉验证中的测试集不是独立的,因为它用于选择代理模型。

您可能想看一下我们的论文,它是关于分类的,通常情况比回归要糟糕。但是,它显示了这些方差和偏差源是如何相加的。
Beleites,C.和Neugebauer,U.和Bocklitz,T.和Krafft,C.和Popp,J .:分类模型的样本规模规划。肛门Chim Acta,2013,760,25-33。
DOI:10.1016 / j.aca.2012.11.007
在arXiv上接受的手稿:1211.1323


您和Bogdanovist意见不一致picking "the best" of the surrogate models is a data-driven optimization, you'd need to validate (measure performance) this picked model with new unknown data. The test set within this cross validation is not independent as it was used to select the surrogate model.,他说But once we have used cross-validation to select the better performing model, we train that model (whether it be the linear regression or the neural network) on all the data.这很普遍,并且指定一种标准化的方法至关重要
jpcgandre 2014年

特别是对于小型数据集,其中可能遗漏了CV数据是不可行的,但是过拟合模型的风险也很高!需要参考以澄清此问题。
jpcgandre 2014年

5
@jpcgandre:我没有任何分歧。Bogdanovist解释了如何根据通过交叉验证选择的超参数实际计算选择的模型,我补充说,选择之后,模型需要进行另一个(外部)独立验证级别。换句话说,例如嵌套验证设计:用于超参数选择的内部验证循环,用于测试所选模型的外部循环(如果碰巧有足够的情况,您也可以选择独立的测试集)。
cbeleites 2014年

5
内部/外部验证设置是用于交叉验证的,称为双重或嵌套交叉验证,我也看到它也称为交叉模型验证(dx.doi.org/10.1016/j.chemolab.2006.04.021)。对于独立的测试集,它对应于三组拆分:训练/(优化)验证/测试(=最终验证)。如果您遇到的情况如此之少,以至于您无法遗漏第二层CV的数据,那么我认为您应该通过其他方法来修复您的超参数,而不是尝试通过选择其中一个超参数来进行优化。
cbeleites 2014年

@cbeleites我有一个问题。然后,要获取最终模型参数,您是否需要从每个外部折叠中获取超参数的平均值,然后使用该平均超参数重新训练整个数据集?还是在常规CV中进行超参数搜索,然后使用重复的嵌套CV确认该方法的稳定性,还是可行的?
米歇尔

11

我发现这篇出色的文章《如何训练最终的机器学习模型》对消除我在机器学习中使用CV的所有困惑非常有帮助。

基本上,我们使用CV(例如80/20分割,k倍等)来估计您的整个过程(包括数据工程,模型选择(即算法)和超参数等)在未来看不见的情况下的表现如何数据。一旦您选择了获胜的“程序”,CV的拟合模型便已达到目的,现在可以丢弃。然后,您使用相同的获胜“过程”,并使用整个数据集训练最终模型。


1

这是一个非常有趣的问题。为了清楚起见,我们应该了解模型和模型评估的区别。我们使用完整的训练集来构建模型,并且我们希望最终会使用该模型。

K折交叉评估将建立K模型,但所有模型都将被丢弃。K模型仅用于评估。它只是产生了指标,以告诉您该模型与数据的吻合程度。

例如,您选择LinearRegression算法并在同一训练集上执行两项操作:一项具有10倍交叉验证,另一项具有20倍交叉验证。回归(或分类器)模型应该相同,但相关系数和根相对平方误差不同。

以下是使用weka进行10倍和20倍交叉验证的两次运行

第一轮10折

=== Run information ===
Test mode:    10-fold cross-validation
...
=== Classifier model (full training set) ===


Linear Regression Model  <---- This model is the same

Date = 844769960.1903 * passenger_numbers -711510446549.7296

Time taken to build model: 0 seconds

=== Cross-validation ===  <---- Hereafter produced different metrics
=== Summary ===

Correlation coefficient                  0.9206
Mean absolute error                35151281151.9807
Root mean squared error            42707499176.2097
Relative absolute error                 37.0147 %
Root relative squared error             38.9596 %
Total Number of Instances              144     

第二次跑20折

=== Run information ===
...
Test mode:    20-fold cross-validation

=== Classifier model (full training set) ===


Linear Regression Model   <---- This model is the same

Date = 844769960.1903 * passenger_numbers -711510446549.7296

Time taken to build model: 0 seconds

=== Cross-validation ===  <---- Hereafter produced different metrics
=== Summary ===

Correlation coefficient                  0.9203
Mean absolute error                35093728104.8746
Root mean squared error            42790545071.8199
Relative absolute error                 36.9394 %
Root relative squared error             39.0096 %
Total Number of Instances              144     

0

我不确定以上讨论是否完全正确。在交叉验证中,我们可以将每次运行的数据分为培训和测试。仅使用训练数据,就需要拟合模型并在所考虑的每一类模型中选择调整参数。例如,在神经网络中,调整参数是神经元的数量和激活功能的选择。为此,训练数据中进行交叉验证。

一旦找到每个类别中的最佳模型,便会使用测试数据评估最佳拟合模型。“外部”交叉验证循环可用于更好地评估测试数据性能以及评估可变性。然后,讨论可以比较不同类别(例如神经网络与SVM)的测试性能。选择一个模型类,并固定模型大小,现在使用全部数据来学习最佳模型。

现在,如果作为机器学习算法的一部分,您想要不断地选择最佳的模型类别(例如每周一次),那么即使是这种选择也需要在训练数据中进行评估!如果测试数据测量是动态选项,则不能用于判断模型类别的选择。


0

为什么我们使用k折交叉验证?

交叉验证是一种在看不见的数据上估算方法技巧的方法。就像使用火车测试拆分一样。

交叉验证可以在数据集的多个子集上系统地创建和评估多个模型。 反过来,这提供了大量的绩效指标

  • 我们可以计算这些度量的平均值,以了解该过程的平均性能。
  • 我们可以计算这些度量的标准偏差,以了解该过程的技能在实践中有望变化多少。

当您尝试选择要使用的算法和数据准备过程时,这也有助于将一个过程与另一个过程进行更细微的比较。

此外,此信息非常宝贵,因为您可以使用平均值和分布来给出实践中机器学习过程的预期性能的置信区间。

参考

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.