保持验证与交叉验证


54

在我看来,坚持验证是没有用的。也就是说,将原始数据集分为两部分(训练和测试)并将测试得分用作泛化度量,这是没有用的。

K折交叉验证似乎可以更好地概括(因为它在每个点上进行训练和测试)。那么,为什么我们要使用标准的保留验证?甚至谈论它?


10
你为什么认为它没用?您可以阅读《统计学习理论的要素》第7节,以对其专业和专业的形式进行正式分析。从统计学上讲,k倍更好,但使用测试集并不一定很糟糕。凭直觉,您需要考虑一个测试集(正确使用时)确实是训练中根本没有使用过的数据集。因此,从某种意义上说,它对于评估模型具有绝对的帮助。而且,k折非常昂贵,因此对k折的作用有点“近似”(但对于计算能力较低的人)。
查理·帕克

当然。从理论上讲,K折更精确,但计算量稍大。问题是:为什么不总是进行K折交叉验证?

2
我懂了。我认为原因主要是计算上的。K折更好地近似了泛化误差,因此从统计角度来看,K折是我认为的选择方法。保持很容易实现,并且不需要训练那么多模型。在实践中,训练模型可能非常昂贵。
查理·帕克

1
是的-但我认为“计算量太大”的论点相当脆弱。我们几乎一直都在致力于开发最准确的模型。然而,存在这种矛盾之处,文献中进行的许多实验都只有一个保留验证集。

1
问题-统计学习理论的第7.10.1节“ K折叠交叉验证”的元素似乎表明,将测试数据与训练数据完全分开(如在验证中)是理想的,而K折叠验证只是一种折衷,因为数据是稀缺的很多倍。我对统计还很陌生,您能指出交叉验证实际上是如何更精确的吗?
numX

Answers:


21

我唯一的猜测是,您可以拥有3个小时的编程经验来坚持学习;另一个原则上需要一个星期,而实际需要六个月。

从原则上讲,它很简单,但是编写代码既繁琐又耗时。就像Linus Torvalds所说的那样:“糟糕的程序员担心代码。好的程序员担心数据结构及其关系。” 许多从事统计工作的人都是糟糕的程序员,这并不是他们自己的错。在R中高效地进行k倍交叉验证(也就是说,以一种不会使调试和多次使用都令人沮丧的方式),需要对数据结构有模糊的了解,但是通常在“简介”中跳过了数据结构。统计编程”教程。就像老人第一次使用互联网。真的并不难,第一次就只需要花半个小时左右的时间,但是它是全新的,并且令人困惑,因此很容易忽略。

您有这样的问题:如何在R中实现保持验证。无论如何,对冒名者无意冒犯。但是许多人只是不懂代码。人们完全在进行交叉验证这一事实足以使我高兴。

这听起来很愚蠢和琐碎,但这是来自个人经验,曾经是那个家伙,并且与很多曾经是那个家伙的人一起工作过。


18
也许作为主修CS的人,我对此有一些偏见,但是,如果您可以正确实施保留验证(这已经意味着将数据集分为两部分,并使用一个部分进行训练,另一个用于测试),您唯一需要更改的就是拆分比例,然后将整个内容放入一个循环中。似乎很难相信这将是一个大问题。
Voo

3
@Voo:此外,这里的编程能力还不够:您必须充分理解问题,才能判断在拆分过程中需要考虑哪些混杂因素。参见例如stats.stackexchange.com/questions/20010/…。我认为我比“纯粹的”编码问题更多地看到这种问题(尽管人们永远不知道:几乎无法对数据矩阵中的行进行简单拆分的人通常也会犯更高级别的错误,即不拆分例如在患者级别)
cbeleites 2014年

还请注意,您可以通过分离测量仪器生成的文件来进行适当的(例如,患者/测量日/ ...)保留分离,而无需进行任何编程...
cbeleites 2014年

5
致选民:请注意,我问了一个单独的问题,对我的逻辑提出了质疑。stats.stackexchange.com/q/108345/36229
shadowtalker 2014年

1
我不认为解释两种交叉验证方法之间差异的答案应该是人类学习的时间,荒谬地有偏见且无济于事
rgalbo

40

尽管在随机分割数据和设计用于独立测试的验证实验之间存在重大差异,但通常将保留保留与独立测试集的验证同义使用。

可以使用独立的测试集来衡量无法通过重采样或保留验证来衡量的概括性能,例如,未知未来案例(=培训结束后稍后要衡量的案例)的性能。为了知道现有模型可用于新数据多长时间(例如考虑仪器漂移),这一点很重要。更一般地,这可以描述为测量外推性能以便定义适用范围。

其中,保持退出实际上是有益的另一种情况是:它很容易,以确保训练和测试数据分割正确-比重新取样验证容易得多:如

  1. 决定拆分(例如,随机分配案例)
  2. 测量
  3. 培训案例的测量和参考数据=>建模\测试案例的测量和参考都不会交给建模人员。
  4. 最终模型+保留案例的度量=>预测
  5. 将预测与保留案例的参考进行比较。

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

是的,您需要为此付出代价,因为与重新采样验证相比,保留估算的效率较低。但是我看过很多论文,我怀疑重采样验证不能正确区分案例(在我的领域中,我们有很多聚类/分层/分组数据)。

当我发现拆分程序(索引计算中的典型错误)之前发现之前从未检测到(通过同时进行置换测试)泄漏时,通过在提交后一周撤回手稿,我学到了有关数据泄漏的重采样课程。

有时,保持时间可能比找到愿意花时间检查重采样代码(例如,用于聚类数据)以便获得相同程度的确定性的人更有效。但是,恕我直言,在您仍然需要评估例如未来性能(第一点)的阶段之前执行此操作通常效率不高,换句话说,无论如何您仍需要为现有模型建立验证实验。

OTOH,在小样本量的情况下,保留是不可行的:您需要保留足够的测试用例,以使测试结果足够精确,以得出所需的结论(请记住:3个正确的测试用例中有3个正确,意味着分类二项式95%置信区间,远低于50:50的猜测范围!)弗兰克·哈雷尔(Frank Harrell)指出至少大约有50%的经验法则。需要100(测试)个案例以有用的精度正确地测量比例(例如正确预测的案例的比例)。


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


6
希望我能为这个非常详尽的答案提供+1以上的价钱。我特别喜欢您提到数据泄漏问题,因为它有效地说明了即使对于专家而言,排除此类问题也并非易事。这是一个很好的现实检查!
马克·克莱森

你不是在问这个问题吗?是的,由于混杂因素的影响,拆分很难,但是不管您是进行单个保留验证还是进行k倍交叉验证,这都是困难的,不是吗?(无论如何,感谢您提供有见地的答案!)
Nils von Barth

1
@NilsvonBarth:我不知道我的论点是如何循环的:OP询问“为什么[根本]使用保留验证”,我给出了许多实际原因。在统计上最有效地使用有限数量的案例并不总是研究设计的最重要属性。(尽管根据我的经验,由于案件数量极为有限,通常是这样:我经常建议重复/迭代k折CV而不是保留)。对于某些混杂因素,物理拆分是可能且容易的,并且是防止偷偷摸摸预览的非常有效的方法。谁知道我们是否会发现这个问题……
cbeleites '16

在某个时候可能需要针对太多假阳性论文进行盲目统计数据分析?
cbeleites '16

2
@NilsvonBarth:小心保持独立性:以这种方式很容易实现保持(通过对案例进行物理保持,即,将样本放下并仅在模型训练完成后进行测量),但是通常,术语“保留”用于实际上更像是对数据的单个随机拆分-然后,也可以通过保留来确定在拆分中出错的所有可能性!
cbeleites

8

稍微澄清一下术语可能很有用。如果我们让为小于(或等于),其中是样本大小,然后将样本划分为唯一的子样本,那么您所说的保留验证实际上就是2倍( = 2 )交叉验证。交叉验证仅是一种用于估计特定模型的样本外错误率(或通用性)的工具。估计样本外错误率的需求很普遍,并且催生了整个文献。首先,请参见ESL的第7章。Ñ Ñ ķ ķknnkk

因此,要回答以下问题:

  1. 为什么要谈论它?在教学上。值得一提的是,将保留验证作为一种特殊的且仅偶尔使用的方法,是一种非常有用的方法,具有许多不同的变化。

  2. 为什么要使用它?如果一个人很幸运能够拥有一个庞大的数据集(根据观察值),那么将数据分成两半-训练一半,然后测试另一半-是有意义的。出于计算原因,这是有意义的,因为所需的全部是拟合一次并预测一次(而不是次)。从“大样本估计”的角度来看,这是有道理的,因为您有大量的观测值适合模型。ķnk

我了解到的一个经验法则是:当大时,可以很小,但是当小时,应该接近。ķ Ñ ķ Ñnknkn


13
我不认为保留与2倍验证相同,因为在2倍验证中,您将适合两个模型,然后对两个保留集之间的误差求平均。
亚历克斯(Alex)

8

如果由于主观或部分原因而无法对模型选择和拟合过程进行编码,那么(涉及查看图表等)保持支持验证可能是您最好的选择。(我想您可能会在每个CV折叠中使用诸如Mechanical Turk之类的东西,尽管我从未听说过它已经完成。)


6

只是想添加一些简单的准则,吴德祥在我们位于斯坦福的CS 229课程中提到了关于交叉验证的准则。这些是他在自己的工作中遵循的做法。

令为数据集中的样本数。如果使用留一法交叉验证。20mm20

如果使用k-较大的倍交叉验证,同时要考虑计算成本。ķ 20<m100km

如果使用常规k倍交叉验证。或者,如果计算能力不足并且,请使用保留交叉验证。ķ = 5 > 10 000100<m1,000,000(k=5)m>10,000

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


5

简短答案:

我建议始终使用至少 CV 用于:k=5

  • 复杂模型
  • 必须遵守有效性约束的最终结果

您可以为此放松一下:

  • 训练非常大的数据集
  • 训练简单模型
  • 时间成为问题的原型

你们中有些人提到,用R编程可能是一个问题。我建议您看一下“ mlr”包。它在统一的界面中包装了不同的程序包,还提供了真正的高级重采样和性能评估方法。

看看:http : //mlr-org.github.io/mlr-tutorial/release/html/resample/ 和:http : //mlr-org.github.io/mlr-tutorial/release/html/performance/索引

更多说明-CV真正做的是打破偏差方差的权衡:

现在,这两种方法都试图解决的问题是估计泛化误差,该误差取决于用于训练模型的数据。

保持存在偏见和差异问题:

通过减少要测试的数据量,我们将方差引入估计的泛化误差中,因为测试数据可能不再很好地表示基础分布。但是,这本身不会带来偏差,因为可以预期的是,估计的性能将是正确的。

但是,使训练集更小会带来悲观的偏见,因为基础分布仍然无法在数据中很好地表示,并且模型也无法拟合数据。使训练集非常小也会引入方差。

由于培训和测试集的大小相互决定,这给我们带来了一个权衡:悲观偏见与高方差。

k 1k折交叉验证通过保持训练集较大(每次迭代中都使用的数据的一部分进行训练)并通过重采样处理测试误差的方差来解决此问题。。在所有迭代之后,我们已经用一个学习者在数据集的每次观察中测试了性能。显然,这比简单的保持需要更多的计算时间。k1k

交叉验证对于更复杂(高方差)的学习者尤其重要。这些通常在计算上也比较昂贵,这可能会使整个过程非常耗时。


3

所有这些都是有用的评论。只需考虑一个。当您有足够的数据时,使用保留是评估特定模型(特定SVM模型,特定CART模型等)的一种方法,而如果您使用其他交叉验证程序,则您正在评估方法(在问题条件下) )而不是模型(SVM方法,CART方法等)。

希望这会有所帮助!


3

时间紧迫的数据建模对我来说是个例外。当您需要根据先前的数据预测未来时,K折在某些情况下不起作用。测试集必须是将来的数据,并且您永远都不能在训练阶段接触它们。预测卖出或股市。在这种情况下,坚持下去很有用。


时间认真的数据?
nbro

3

简单的说; 时间。交叉验证可将训练例程运行k次(即,对每个保持集执行一次)。如果您有大量数据,则可能只花一个小时甚至几天就可以针对一个数据集训练模型,因此在使用交叉验证时,您需要将其乘以k。

因此,尽管交叉验证是最好的方法,但是在某些情况下它是不可行的,并且可能会花费更多的时间来更好地花费时间以不同的方式对数据进行建模,或者尝试使用不同的损失函数以获得更好的模型。

我个人的喜好是从整个数据集中获取验证数据,因此,我不是从数据开头或结尾中提取单个10%的块,而是从数据集中的5个点中获取2%的数据。这使得验证数据更能代表整个数据。


尽管这是一个古老的问题和一个新的答案,但我对此表示赞成,因为它对毫无根据的断言提出了质疑,即“ K折更精确,但计算量稍大一些”,而其他答案则忽略或过快了。
Laconic

0

应该注意的是,并非总是可以应用交叉验证。考虑与时间有关的数据集,以便您希望使用历史数据来为将来的行为训练预测模型。在这种情况下,您必须应用保留验证。


2
在这种情况下,您应该进行正向验证。
尼尔·G
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.