K-fold 与 Monte Carlo 交叉验证

机器算法验证 交叉验证 蒙特卡洛
2022-01-15 13:55:31

我正在尝试学习各种交叉验证方法,主要是打算应用于有监督的多元分析技术。我遇到的两个是 K-fold 和 Monte Carlo 交叉验证技术。我读过 K-fold 是 Monte Carlo 的一种变体,但我不确定我是否完全理解 Monte Carlo 的定义。有人可以解释这两种方法之间的区别吗?

4个回答

k折叠交叉验证

假设您有 100 个数据点。对于折交叉验证,这 100 个点被分成个大小相等且互斥的“折叠”。对于 =10,您可以将点 1-10 分配给折叠 #1,将 11-20 分配给折叠 #2,依此类推,最后将点 91-100 分配给折叠 #10。接下来,我们选择一个折叠作为测试集,并使用剩余的折叠来形成训练数据。对于第一次运行,您可以使用点 1-10 作为测试集,使用点 11-100 作为训练集。然后下一次运行将使用点 11-20 作为测试集,并在点 1-10 加上 21-100 上进行训练,依此类推,直到每个折叠都被用作测试集一次。kkkk1

蒙特卡洛交叉验证

蒙特卡洛的工作方式略有不同。您随机选择(不替换)一部分数据来形成训练集,然后将其余点分配给测试集。然后多次重复此过程,每次都(随机)生成新的训练和测试分区。例如,假设您选择使用 10% 的数据作为测试数据。那么您在 rep #1 上的测试集可能是点 64、90、63、42、65、49、10、64、9648。在下一次运行中,您的测试集可能90、60、23、6716、78、42、17、73和26。由于每次运行的分区都是独立完成的,同一点可以多次出现在测试集中,这是蒙特卡洛和交叉验证之间的主要区别

比较

每种方法都有自己的优点和缺点。在交叉验证下,每个点都只测试一次,这似乎很公平。但是,交叉验证仅探索了您的数据可能已被分区的几种可能方式。Monte Carlo 可让您探索更多可能的分区,尽管您不太可能获得所有分区 - 有种可能的方法来 50/50 分割 100 个数据点放(!)。(10050)1028

如果您尝试进行推理(即,统计比较两种算法),对折交叉验证运行的结果进行平均可以获得算法性能的(几乎)无偏估计,但方差很大(如您所愿)期望只有 5 或 10 个数据点)。由于原则上您可以根据需要/负担得起的时间运行它,因此蒙特卡洛交叉验证可以为您提供更少的变量,但更偏向的估计。k

一些方法融合了这两者,如 5x2 交叉验证(见Dietterich (1998)的想法,虽然我认为从那时起有一些进一步的改进),或者通过纠正偏差(例如,Nadeau 和 Bengio,2003) .

假设是数据集的大小, 折子集的数量,是训练集的大小,是验证集的大小。因此,对于 ,对于 Monte Carlo 交叉验证,NkkntnvN=k×nvkN=nt+nv

k折交叉验证(kFCV) 将个数据点划分为个大小相等的互斥子集。然后,该过程将个子集中的一个作为验证集留出,并在剩余的子集上进行训练。这个过程重复次,每次都的大小可以从称为留一法交叉验证)。[2] 中的作者建议设置NkkkkkN2k=Nk=510

蒙特卡洛交叉验证(MCCV)数据点 进行抽样而不进行替换,个数据点简单地拆分为两个子集然后在子集 n_t 上训练模型并在子集进行验证。存在唯一训练集,但 MCCV 避免了运行这么多次迭代的需要。Zhang [3] 表明,唯一训练集次迭代的结果接近交叉验证。需要注意的是,文献缺乏对大 N 的研究。 Nntnvntntnv(Nnt)N2(Nnt)

的选择会影响偏差/方差的权衡。偏差越低,方差越高。较大的训练集在迭代之间更相似,因此过度拟合训练数据。有关此讨论的更多信息,请参见 [2]。水平可以使两种方法的偏差相等两种方法的偏差和方差值显示在 [1] 中(本文将 MCCV 称为重复学习测试模型)。kntkntknt


[1] Burman, P. (1989)。普通交叉验证、折交叉验证和重复学习测试模型方法的比较研究。Bometrika 76 503-514。v

[2] Hastie, T.、Tibshirani, R. 和 Friedman, J. (2011)。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格。

[3] 张平(1993)。通过多重交叉验证进行模型选择。安。统计。 21 299–313

其他两个答案很好,我只添加两张图片和一个同义词。


K折交叉验证(kFCV):

在此处输入图像描述

蒙特卡罗交叉验证 (MCCV) = 重复随机子抽样验证 (RRSSV):

在此处输入图像描述


参考:

图片来自(1)(第64和65页),同义词在(1)和(2)中提到。

在实践中呢?

在某些情况下(较小的数据),我将Monte Carlo 和 K-Fold CV组合成重复的嵌套交叉验证:

  1. 用于超参数选择的内 K-fold CV
  2. 用于估计泛化性能的外 K-fold CV
  3. 现在,多次重复步骤 1 和 2(蒙特卡洛)。

如果对于 2. 你使用 K=5,然后在步骤 3 中重复 100 次,你将有 5*100 = 500 的泛化性能估计。

这在 scikit-learn 中作为重复(分层)K 折交叉验证可用:scikit-learn docs另请参阅嵌套与非嵌套交叉验证:scikit-learn docs