折交叉验证中的最佳折叠数:留一法CV始终是最佳选择吗?


47

除了计算能力方面的考虑之外,是否有任何理由相信交叉验证中折叠数的增加会导致更好的模型选择/验证(即,折叠数越多越好)?

极端地讲,与折交叉验证相比,留一法交叉验证是否必然导致更好的模型?K

这个问题的一些背景:我正在处理一个很少有实例的问题(例如10个正值和10个负值),并且担心我的模型可能无法很好地归纳出很好的数据/如果数据太少,可能会过度拟合。


1
一位年长的相关话题:钾抉择K-折交叉验证
变形虫说恢复莫妮卡2015年

这个问题不是重复的,因为它只限于小型数据集和“不考虑计算能力”。这是一个严重的局限性,使得该问题不适用于那些具有大型数据集和具有计算复杂度的训练算法的实例数至少线性(或至少实例数的平方根)的训练算法。
Serge Rogatch

Answers:


46

留一法交叉验证通常不会产生比K倍更好的性能,并且更可能变差,因为它具有相对较高的方差(即,其值在不同数据样本中的变化多于K 值)。 k倍交叉验证)。这在模型选择标准中是不利的,因为这意味着可以仅通过利用特定数据样本中的随机变化来优化模型选择标准,而不是对性能进行真正的改善,即,您更可能过度拟合模型选择标准。在实践中使用留一法交叉验证的原因是,对于许多模型,作为拟合模型的副产品,可以非常廉价地对其进行评估。

如果计算费用不是主要问题,则更好的方法是执行重复的k倍交叉验证,其中,每次用不同的随机分区将k倍交叉验证过程重复为k个不相交的子集。这减少了方差。

如果只有20种模式,则很可能会过分拟合模型选择标准,这在统计和机器学习中是一个被忽略的陷阱(无耻的插件:请参阅我关于该主题的论文)。您可能最好选择一个相对简单的模型,并尽量不要对其进行积极地优化,或者采用贝叶斯方法对所有模型选择进行平均,并对其合理性进行加权。IMHO优化是统计中万恶之源,因此最好不要进行不必要的优化,并在每次操作时都要谨慎进行优化。

另请注意,如果要执行模型选择,则还需要性能评估(例如,需要将模型选择作为模型拟合过程的组成部分并对其进行交叉验证),则需要使用嵌套交叉验证之类的方法。以及)。


8
+1。我喜欢您的“优化是统计中所有邪恶的根源”的信息……
S. Kolassa-恢复莫妮卡

5
谢谢@DikranMarsupial。我不太明白。为什么通过留一法学习的模型比使用常规k倍交叉验证的方差更高?我的直觉告诉我,由于跨折我们只移动一个数据点,所以跨折的训练集有很大的重叠,因此我希望模型之间几乎没有差异。或朝另一个方向,在K折中,如果K低,则每个折的训练集将完全不同,并且所得模型更有可能不同。我错了吗?
阿梅利奥·瓦兹克斯·雷纳

就其本身而言,这是一个非常好的问题,所以我建议您将它作为一个新问题进行提问,我将考虑如何回答!
迪克兰有袋博物馆,

谢谢@DikranMarsupial我遵循了您的建议,并在此处提出了另一个问题。
阿梅里奥·瓦兹克斯·雷纳

1
@DikranMarsupial我以为我会在这里提到,我已经开始一个多线程在这个答案“在统计优化”的评论你的启发。您的评论使我从习惯的更广泛角度来看过度拟合。
Amelio Vazquez-Reina

8

通过考虑学习曲线来选择K倍数

我想指出,选择合适数量的折在很大程度上取决于学习曲线的形状和位置,这主要是由于其对偏差的影响。这种论点延伸到一劳永逸的简历,主要取自《统计学习的要素》这本书的第7.10章,第243页。K

有关的讨论影响上的差异这里K

总而言之,如果学习曲线在给定的训练集大小下具有明显的斜率,则五倍或十倍的交叉验证将高估真实的预测误差。这种偏见在实践中是否是一个缺点,取决于目标。另一方面,留一法交叉验证的偏倚低,但方差高。

使用玩具示例的直观可视化

为了直观地理解此参数,请考虑以下玩具示例,其中我们将4级多项式拟合到嘈杂的正弦曲线:

在此处输入图片说明

从直觉上和视觉上,由于过度拟合,我们期望该模型在小型数据集上的表现不佳。此行为反映在学习曲线中,在该曲线中我们绘制了均方误差与训练大小以及 1标准偏差。请注意,我选择在此处绘制1-MSE以重现ESL第243页中使用的插图1±

在此处输入图片说明

讨论论点

随着训练规模增加到50个观察值,模型的性能显着提高。例如,将数量进一步增加到200只带来很小的好处。请考虑以下两种情况:

  1. 如果我们的训练集有200个观察值,则倍交叉验证将在160的训练大小上估计性能,这实际上与训练大小为200的性能相同。因此,交叉验证不会受到太大的偏见和将增加到较大的值不会带来太大的好处(左侧图5K

  2. 但是,如果训练集有观察值,则倍交叉验证将评估模型在大小为40的训练集上的性能,并且从学习曲线来看,这将导致有偏差的结果。因此,在这种情况下增加将趋于减小偏差。(右图)。505K

在此处输入图片说明

[更新]-对方法的评论

您可以在此处找到此仿真的代码。该方法如下:

  1. 产生从分发50000点其中的真实方差是已知sin(x)+ϵϵ
  2. 重复次(例如100或200次)。在每次迭代中,通过从原始分布中重新采样个点来更改数据集iN
  3. 对于每个数据集: i
    • 执行K-折交叉验证用于一个值K
    • 存储整个K折的平均均方误差(MSE)
  4. 一旦完成对的循环,对于相同的值,计算数据集上MSE的平均值和标准偏差iiK
  5. 一直对范围内的所有重复上述步骤,直到达到LOOCVK{5,...,N}

一种替代方法是不在每次迭代时对新数据集进行重新采样,而是每次都对同一数据集进行重新洗改。这似乎给出了相似的结果。



@谢谢你的代码!我已经运行了代码,但是我不明白您怎么知道真正的(代码中的)。我还认为,如果您定义两个函数,一个用于引导程序样本(随机播放= False),一个用于KFold(随机播放= True),则您的代码将更加紧凑:)1MSE1112
meTchaikovsky

@me_Tchaikovsky回想一下,可以将预测变量的MSE分解为并且当模型与真正的基础函数匹配时假设没有偏差,那么我们将得到误差项。均匀rv的方差是所以在这种情况下为MSE=Var+Bias2ϵU(.5,.5)1/12(ba)21/12
Xavier Bourret Sicotte
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.