保留验证与交叉验证

机器算法验证 机器学习 交叉验证 验证
2022-01-20 01:18:53

对我来说,保留验证似乎没用。也就是说,将原始数据集分成两部分(训练和测试)并使用测试分数作为泛化度量,有点没用。

K 折交叉验证似乎提供了更好的泛化近似值(因为它在每个点上进行训练和测试)。那么,我们为什么要使用标准的保留验证呢?或者甚至谈论它?

4个回答

Hold-out 通常与独立测试集的验证同义,尽管随机拆分数据和为独立测试设计验证实验之间存在重要差异。

独立测试集可用于测量无法通过重采样或保留验证测量的泛化性能,例如未知未来案例的性能(= 稍后测量的案例,在训练完成后)。这对于了解现有模型可用于新数据多长时间很重要(例如考虑仪器漂移)。更一般地,这可以被描述为测量外推性能以定义适用性的限制。

保留实际上可能有益的另一种情况是:确保正确分离训练和测试数据非常容易 - 比重新采样验证容易得多:例如

  1. 决定拆分(例如随机分配案例)
  2. 措施
  3. 训练用例的测量和参考数据 => 建模\测试用例的测量和参考均不交给建模者。
  4. 最终模型 + 保留案例的测量 => 预测
  5. 将预测与保留案例的参考进行比较。

根据您需要的分离程度,每个步骤都可能由其他人完成。作为第一级,不将测试用例的任何数据(甚至不包括测量值)交给建模者可以非常确定没有测试数据泄漏到建模过程中。在第二层,最终的模型和测试用例测量可以移交给其他人,依此类推。

在某些领域/案例/应用中,我们认为这种明显的独立性非常重要,足以规定需要一个独立的组织进行验证*,例如在临床化学中(我们也这样做,例如为了车辆安全:保护您汽车的人不是和你的修理工一样,他们也有不同的业务)。

(* 我是化学计量学家/分析化学家。对我来说,验证湿实验室方法或计算机内方法(又名预测模型)之间在概念上没有太大区别。随着技术的进步,这种区别会变得更小机器学习,例如医疗诊断。)

是的,与重采样验证相比,保留估计的效率较低,您为此付出了代价。但是我看过很多论文,我怀疑重采样验证没有正确区分案例(在我的领域中,我们有很多集群/分层/分组数据)。

当我发现在我的拆分过程(索引计算中的错字)中有一个以前未被检测到的(通过同时运行置换测试)泄漏时,我通过在提交后一周撤回手稿来吸取关于重新采样的数据泄漏的教训。

有时,坚持比寻找愿意花时间检查重采样代码(例如,对于集群数据)以获得相同程度的结果确定性的人更有效。但是,恕我直言,在您处于无论如何都需要测量未来性能(第一点)的阶段之前执行此操作通常效率不高 - 换句话说,当您无论如何都需要为现有模型设置验证实验时。

OTOH,在小样本量的情况下,保留是没有选择的:您需要保留足够的测试用例,以便测试结果足够精确以得出所需的结论(请记住:3 个分类测试用例中的 3 个正确意味着二项式 95% 置信区间,其范围远低于 50:50 的猜测!)弗兰克·哈雷尔(Frank Harrell)会指出至少 ca。需要 100 个(测试)案例才能以有用的精度正确测量比例 [例如正确预测案例的比例]。


更新:在某些情况下,适当的拆分特别难以实现,交叉验证变得不可行。考虑一个有许多混杂因素的问题。如果这些混杂因素是严格嵌套的,那么拆分很容易(例如,有多个患者的研究有每个患者的多个样本并分析每个样本的多个细胞):您在采样层次结构的最高级别进行拆分(针对患者) . 但是您可能有独立的非嵌套混杂因素,例如由运行测试的不同实验者引起的日常变化或差异。然后,您需要确保拆分对所有人都是独立的最高级别的混杂因素(嵌套混杂因素将自动独立)。如果仅在研究期间识别出一些混杂因素,则处理此问题非常困难,并且设计和执行验证实验可能比处理几乎没有数据用于训练或替代模型测试的拆分更有效。

注意:这个答案是旧的,不完整的,并且完全过时了。它在 2014 年发布时只是有争议的正确性,我不确定它是如何获得如此多的赞成票或它如何成为公认的答案。我推荐这个答案,由该领域的专家撰写(并且有更多的支持)。我在这里留下我的答案仅用于历史/档案目的。


我唯一的猜测是你可以坚持三个小时的编程经验;另一个原则上需要一周,实践需要六个月。

原则上它很简单,但编写代码既乏味又耗时。正如 Linus Torvalds 所说的那样,“糟糕的程序员担心代码。优秀的程序员担心数据结构及其关系。” 许多做统计的人都是糟糕的程序员,这不是他们自己的错。在 R 中有效地进行 k 折交叉验证(我的意思是,以一种不会令人沮丧地调试和多次使用的方式)需要对数据结构有模糊的理解,但数据结构通常在“介绍”中被跳过到统计编程”教程。就像老人第一次上网一样。真的不难,第一次弄出来只需要多花半个小时左右,但它是全新的,让人困惑,所以很容易忽略。

您有这样的问题:如何在 R 中实施保留验证无论如何,对提问者没有任何冒犯的意思。但是很多人就是不识代码。人们正在做交叉验证这一事实足以让我高兴。

这听起来很愚蠢和微不足道,但这来自个人经验,曾经是那个人,并且与很多人一起工作过。

只是想添加一些简单的指导方针,Andrew Ng 在我们斯坦福的 CS 229 课程中提到的关于交叉验证的指导。这些是他在自己的工作中遵循的做法。

m是数据集中的样本数:

  • 如果m20使用留一法交叉验证。

  • 如果20<m100使用相对较大的 k 折交叉验证km牢记计算成本。

  • 如果100<m1,000,000使用常规的 k 折交叉验证(k=5). 或者,如果没有足够的计算能力并且m>10,000,使用保留交叉验证。

  • 如果m1,000,000使用保留交叉验证,但如果计算能力可用,您可以使用 k 折交叉验证 (k=5)如果您想从模型中挤出额外的性能。

稍微澄清一下术语可能会很有用。如果我们让k是小于(或等于)的某个整数n在哪里n是样本大小,我们将样本划分为k唯一的子样本,那么您所说的保留验证实际上只是 2 倍(k= 2) 交叉验证。交叉验证只是一种用于估计特定模型的样本外错误率(或泛化性)的工具。估计样本外错误率的需求是一种常见的需求,并且催生了整个文献。对于初学者,请参阅ESL的第 7 章。

所以回答问题:

  1. 为什么要谈论它?教学法。值得将 Hold-out 验证视为一种特殊的 - 并且只是偶尔有用的 - 一种非常有用的方法的案例,它有很多很多变体。

  2. 为什么要使用它?如果一个人有幸拥有一个庞大的数据集(就观察而言,n),然后将数据分成两半——一半训练,另一半测试——是有意义的。由于计算原因,这很有意义,因为只需要拟合一次并预测一次(而不是k次)。从“大样本估计”的角度来看,这是有道理的,因为您有大量的观察结果可以拟合您的模型。

我学到的一个经验法则是:当n很大,k可以很小,但是当n是小,k应该接近n.