我正在尝试学习各种交叉验证方法,主要是打算应用于有监督的多元分析技术。我遇到的两个是 K-fold 和 Monte Carlo 交叉验证技术。我读过 K-fold 是 Monte Carlo 的一种变体,但我不确定我是否完全理解 Monte Carlo 的定义。有人可以解释这两种方法之间的区别吗?
K-fold 与 Monte Carlo 交叉验证
折叠交叉验证
假设您有 100 个数据点。对于折交叉验证,这 100 个点被分成个大小相等且互斥的“折叠”。对于 =10,您可以将点 1-10 分配给折叠 #1,将 11-20 分配给折叠 #2,依此类推,最后将点 91-100 分配给折叠 #10。接下来,我们选择一个折叠作为测试集,并使用剩余的折叠来形成训练数据。对于第一次运行,您可以使用点 1-10 作为测试集,使用点 11-100 作为训练集。然后下一次运行将使用点 11-20 作为测试集,并在点 1-10 加上 21-100 上进行训练,依此类推,直到每个折叠都被用作测试集一次。
蒙特卡洛交叉验证
蒙特卡洛的工作方式略有不同。您随机选择(不替换)一部分数据来形成训练集,然后将其余点分配给测试集。然后多次重复此过程,每次都(随机)生成新的训练和测试分区。例如,假设您选择使用 10% 的数据作为测试数据。那么您在 rep #1 上的测试集可能是点 64、90、63、42、65、49、10、64、96和48。在下一次运行中,您的测试集可能是90、60、23、67、16、78、42、17、73和26。由于每次运行的分区都是独立完成的,同一点可以多次出现在测试集中,这是蒙特卡洛和交叉验证之间的主要区别。
比较
每种方法都有自己的优点和缺点。在交叉验证下,每个点都只测试一次,这似乎很公平。但是,交叉验证仅探索了您的数据可能已被分区的几种可能方式。Monte Carlo 可让您探索更多可能的分区,尽管您不太可能获得所有分区 - 有种可能的方法来 50/50 分割 100 个数据点放(!)。
如果您尝试进行推理(即,统计比较两种算法),对折交叉验证运行的结果进行平均可以获得算法性能的(几乎)无偏估计,但方差很大(如您所愿)期望只有 5 或 10 个数据点)。由于原则上您可以根据需要/负担得起的时间运行它,因此蒙特卡洛交叉验证可以为您提供更少的变量,但更偏向的估计。
一些方法融合了这两者,如 5x2 交叉验证(见Dietterich (1998)的想法,虽然我认为从那时起有一些进一步的改进),或者通过纠正偏差(例如,Nadeau 和 Bengio,2003) .
假设是数据集的大小, 是折子集的数量,是训练集的大小,是验证集的大小。因此,对于 ,对于 Monte Carlo 交叉验证,
折交叉验证(kFCV) 将个数据点划分为个大小相等的互斥子集。然后,该过程将个子集中的一个作为验证集留出,并在剩余的子集上进行训练。这个过程重复次,每次都的大小可以从到 (称为留一法交叉验证)。[2] 中的作者建议设置或。
蒙特卡洛交叉验证(MCCV)数据点 进行抽样而不进行替换,个数据点简单地拆分为两个子集和。然后在子集 n_t 上训练模型并在子集进行验证。存在唯一训练集,但 MCCV 避免了运行这么多次迭代的需要。Zhang [3] 表明,唯一训练集次迭代的结果接近交叉验证。需要注意的是,文献缺乏对大 N 的研究。
和的选择会影响偏差/方差的权衡。或,偏差越低,方差越高。较大的训练集在迭代之间更相似,因此过度拟合训练数据。有关此讨论的更多信息,请参见 [2]。和水平可以使两种方法的偏差相等。两种方法的偏差和方差值显示在 [1] 中(本文将 MCCV 称为重复学习测试模型)。
[1] Burman, P. (1989)。普通交叉验证、折交叉验证和重复学习测试模型方法的比较研究。Bometrika 76 503-514。
[2] Hastie, T.、Tibshirani, R. 和 Friedman, J. (2011)。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格。
[3] 张平(1993)。通过多重交叉验证进行模型选择。安。统计。 21 299–313
其他两个答案很好,我只添加两张图片和一个同义词。
K折交叉验证(kFCV):
蒙特卡罗交叉验证 (MCCV) = 重复随机子抽样验证 (RRSSV):
参考:
图片来自(1)(第64和65页),同义词在(1)和(2)中提到。
(1) Remesan、Renji 和 Jimson Mathew。水文数据驱动建模:案例研究方法。卷。1. 施普林格,2014 年。
(2) Dubitzky、Werner、Martin Granzow 和 Daniel P. Berrar 合编。基因组学和蛋白质组学中数据挖掘的基础。施普林格科学与商业媒体,2007 年。
在实践中呢?
在某些情况下(较小的数据),我将Monte Carlo 和 K-Fold CV组合成重复的嵌套交叉验证:
- 用于超参数选择的内 K-fold CV
- 用于估计泛化性能的外 K-fold CV
- 现在,多次重复步骤 1 和 2(蒙特卡洛)。
如果对于 2. 你使用 K=5,然后在步骤 3 中重复 100 次,你将有 5*100 = 500 的泛化性能估计。
这在 scikit-learn 中作为重复(分层)K 折交叉验证可用:scikit-learn docs。另请参阅嵌套与非嵌套交叉验证:scikit-learn docs