交叉验证和自举以估计预测误差之间的差异


Answers:


88

它归结为方差和偏见(照常)。CV偏向性较低,但K折CV具有相当大的差异。另一方面,自举趋向于大大减少方差,但给出更多的偏差结果(它们趋于悲观)。其他自举方法已被调整来应对自举偏差(例如632和632+规则)。

另两种方法是“ Monte Carlo CV”,也称为“ leave-group-out CV”,它对数据进行许多随机分割(类似于小型训练和测试分割)。这种方法的方差非常低,并且如果保持中的数据百分比较低,则偏差也不会太差。此外,重复的CV会进行多次K折叠,并将结果平均化为常规K折叠。我对此最不满意,因为它保持了低偏差并减小了方差。

编辑

对于大样本量,方差问题变得不太重要,而计算部分则更多。对于小样本和大样本,我仍然会坚持重复简历。

下面是一些相关的研究(特别是Kim和Molinaro)。

参考文献

Bengio,Y.和Grandvalet,Y.(2005)。估计k折交叉验证方差的偏倚。复杂数据问题的统计建模和分析,75-95。

布拉加·内托(UM)(2004)。交叉验证是否适用于小样本微阵列分类生物信息学,20(3),374–380。doi:10.1093 / bioinformatics / btg419

Efron,B.(1983年)。估计预测规则的错误率:交叉验证的改进。美国统计协会杂志,316–331。

Efron,B.和Tibshirani,R.(1997)。交叉验证的改进:632+引导程序方法。美国统计协会杂志,548-560。

Furlanello,C.,Merler,S.,Chemini,C.,&Rizzoli,A.(1997)。引导程序632+规则对生态数据的应用。WIRN 97。

Jiang,W.,&Simon,R.(2007)。自举方法与调整后的自举方法的比较,用于估计微阵列分类中的预测误差。医学统计学,26(29),5320-5334。

Jonathan,P.,Krzanowski,W.和McCarthy,W.(2000)。关于使用交叉验证来评估多元预测中的性能。统计与计算,10(3),209-229。

金俊勋 (2009)。估计分类错误率:反复进行交叉验证,反复进行保留和引导。计算统计与数据分析,53(11),3735-3745。doi:10.1016 / j.csda.2009.04.009

Kohavi,R.(1995)。交叉验证和自举的研究,用于准确性估计和模型选择。国际人工智能联合会议,第1137至1145页,第14页。

Martin,J。和Hirschberg,D。(1996)。分类错误率的小样本统计信息I:错误率测量。

Molinaro,AM(2005)。预测误差估计:重采样方法的比较。生物信息学,21(15),3301–3307。doi:10.1093 / bioinformatics / bti499

Sauerbrei,W。和Schumacher1,M。(2000)。引导和交叉验证,以评估数据驱动的回归模型的复杂性。医学数据分析,26-28。

Tibshirani,RJ和Tibshirani,R.(2009)。交叉验证中最小错误率的偏差校正。Arxiv预印本arXiv:0908.2904。


2
Bootstrap偏见不是悲观的,而是乐观的(Simple Bootstrap不是.0632)。这是因为Bootstrap使用了大量的训练元素来测试模型,从而导致样本误差中的很多权重。
D1X

33

@Frank Harrell在这个问题上做了很多工作。我不知道具体的参考文献。

但是我宁愿将这两种技术用于不同的目的。在确定模型时,交叉验证是一个很好的工具-它可以帮助您避免在认为自己过度拟合时就认为自己有一个好的模型。

固定模型后,使用引导程序就更有意义了(至少对我而言)。

http://www.burns-stat.com/pages/Tutor/bootstrap_resampling.html上使用R对这些概念进行了介绍(包括置换测试)


2
首先使用CV选择模型,然后在相同的数据上使用自举来评估您的估计误差是否有意义?具体来说,我想对未知非高斯噪声的数据使用ML进行线性回归。
sebhofer

9

我的理解是,自举是一种量化模型不确定性的方法,而交叉验证用于模型选择和测量预测精度。


非常感谢您的回答。我认为当您的数据集较小时(<30 obs),引导会更好。没有?
授予

我会这样认为。当样本量较小时,交叉验证可能不合理。您可以不做交叉验证,但这往往过于乐观。
Glen

还要注意,如小样本进行自举,将导致一些有偏差的估计,如Efron的原始论文所述。
格伦(Glen)

测量预测准确性不是量化不确定性的一种方法吗?我知道CV在模型选择中更为常见,但是假设我想估算LASSO的AUC,CV还是自举更好?
Max Ghenis'3

9

一个区别是交叉验证(例如折刀)会使用您的所有数据点,而自举(随机重采样数据)可能不会达到所有点。

您可以根据需要随意引导,这意味着需要进行更大的重采样,这对于较小的样本会有所帮助。

交叉验证平均值或折刀平均值将与样本平均值相同,而自举平均值与样本平均值不太可能相同。

由于交叉验证和折刀重量所有样本点均相同,因此置信区间应比自举法小(尽管可能不正确)。


2
尼尔,看来您的陈述中至少有2个陈述是错误的。1.即使每个特定的boostrap样本都覆盖了约63%的原始数据点,但如果像我们通常那样对许多(例如10k)自举样本进行采样,则每个点中至少有一个被覆盖的机会实质上是100%。2.我只是进行了快速的数值检查-引导程序样本和引导外样本的平均值非常接近整个数据平均值。您可以检查一下自己
Kochede

这是一个代码(单击“编辑”以查看其格式):将numpy导入为np,将熊猫导入为pd n = 1000 B = 1000 y = np.random.randn(n)meanb,meanoob = [],[]对于b in范围(B):ib = np.random.choice(n,n,replace = True)meanb = y [ib] .mean()meansb.append(meanb)indoob = np.ones(n,dtype = bool)indoob [ib] =假meanoob = y [indoob] .mean()意味着oooob.append(意味着ooob)pd.Series(意味着b).hist(histt​​ype ='step')pd.Series(意味着oob).hist(histt​​ype ='step' )print np.mean(meansb),np.mean(meansoob),pd.Series(y)
.mean

@Kochede“基本上是100%”不是100%。“非常接近平均值”与平均值完全不同。您正在使用鼬鼠单词。我没看错
Neil McGuigan's

因此,您不仅给出了错误的答案,而且还应坚持下去,好吧。引导样本的预期数据覆盖率会随着样本数量的增加而迅速收敛到100%。在上面的实验中,少于10个引导程序样本后,所有数据点都被引导程序击中。同样,自举样本平均值的期望值等于样本平均值。在上述实验中,经过1000个引导程序样本后的差异小于0.1%(使用np.random.rand代替randn,因为
randn的

这是更新的代码供您参考:numpy作为np导入,pandas作为pd导入;n = 1000;B = 1000;y = np.random.rand(n); meansb = []; Covered = np.zeros(n,dtype = bool); 覆盖率= [];#开始b在范围(B)中的循环:ib = np.random.choice(n,n,replace = True); Covered [ib] = True;coverage.append(covered.sum()* 1.0 / n); meanb = y [ib] .mean(); meansb.append(meanb); #end循环打印覆盖率[:10]; 打印np.mean(meansb),pd.Series(y).mean(); 打印(np.mean(meansb)-pd.Series(y).mean())/ pd.Series(y).mean();
科彻德

2

这是两种重采样技术:

在交叉验证中,我们将数据随机分为kfold,这有助于过度拟合,但是这种方法有其缺点。由于它使用随机样本,因此某些样本会产生重大误差。为了使CV最小化,它具有一些技术,但是在分类问题上却没有那么强大。Bootstrap可以帮助解决此问题,它可以通过自己的示例检查改善错误。有关详细信息,请参阅。

https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/cv_boot.pdf

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.