在我看来,坚持验证是没有用的。也就是说,将原始数据集分为两部分(训练和测试)并将测试得分用作泛化度量,这是没有用的。
K折交叉验证似乎可以更好地概括(因为它在每个点上进行训练和测试)。那么,为什么我们要使用标准的保留验证?甚至谈论它?
在我看来,坚持验证是没有用的。也就是说,将原始数据集分为两部分(训练和测试)并将测试得分用作泛化度量,这是没有用的。
K折交叉验证似乎可以更好地概括(因为它在每个点上进行训练和测试)。那么,为什么我们要使用标准的保留验证?甚至谈论它?
Answers:
我唯一的猜测是,您可以拥有3个小时的编程经验来坚持学习;另一个原则上需要一个星期,而实际需要六个月。
从原则上讲,它很简单,但是编写代码既繁琐又耗时。就像Linus Torvalds所说的那样:“糟糕的程序员担心代码。好的程序员担心数据结构及其关系。” 许多从事统计工作的人都是糟糕的程序员,这并不是他们自己的错。在R中高效地进行k倍交叉验证(也就是说,以一种不会使调试和多次使用都令人沮丧的方式),需要对数据结构有模糊的了解,但是通常在“简介”中跳过了数据结构。统计编程”教程。就像老人第一次使用互联网。真的并不难,第一次就只需要花半个小时左右的时间,但是它是全新的,并且令人困惑,因此很容易忽略。
您有这样的问题:如何在R中实现保持验证。无论如何,对冒名者无意冒犯。但是许多人只是不懂代码。人们完全在进行交叉验证这一事实足以使我高兴。
这听起来很愚蠢和琐碎,但这是来自个人经验,曾经是那个家伙,并且与很多曾经是那个家伙的人一起工作过。
尽管在随机分割数据和设计用于独立测试的验证实验之间存在重大差异,但通常将保留保留与独立测试集的验证同义使用。
可以使用独立的测试集来衡量无法通过重采样或保留验证来衡量的概括性能,例如,未知未来案例(=培训结束后稍后要衡量的案例)的性能。为了知道现有模型可用于新数据多长时间(例如考虑仪器漂移),这一点很重要。更一般地,这可以描述为测量外推性能以便定义适用范围。
其中,保持退出实际上是有益的另一种情况是:它很容易,以确保训练和测试数据分割正确-比重新取样验证容易得多:如
根据您需要的分离级别,每个步骤都可以由其他人完成。作为第一级,没有将测试用例的任何数据(甚至没有测量结果)移交给建模者,可以非常确定没有测试数据泄漏到建模过程中。在第二层,可以将最终模型和测试用例的测量结果移交给其他人,依此类推。
是的,您需要为此付出代价,因为与重新采样验证相比,保留估算的效率较低。但是我看过很多论文,我怀疑重采样验证不能正确区分案例(在我的领域中,我们有很多聚类/分层/分组数据)。
当我发现拆分程序(索引计算中的典型错误)之前发现之前从未检测到(通过同时进行置换测试)泄漏时,通过在提交后一周撤回手稿,我学到了有关数据泄漏的重采样课程。
有时,保持时间可能比找到愿意花时间检查重采样代码(例如,用于聚类数据)以便获得相同程度的确定性的人更有效。但是,恕我直言,在您仍然需要评估例如未来性能(第一点)的阶段之前执行此操作通常效率不高,换句话说,无论如何您仍需要为现有模型建立验证实验。
OTOH,在小样本量的情况下,保留是不可行的:您需要保留足够的测试用例,以使测试结果足够精确,以得出所需的结论(请记住:3个正确的测试用例中有3个正确,意味着分类二项式95%置信区间,远低于50:50的猜测范围!)弗兰克·哈雷尔(Frank Harrell)指出至少大约有50%的经验法则。需要100(测试)个案例以有用的精度正确地测量比例(例如正确预测的案例的比例)。
更新:在某些情况下,很难实现适当的拆分,并且交叉验证变得不可行。考虑许多混杂因素的问题。如果严格混杂这些混杂因素,则拆分很容易(例如,有多个患者的研究具有每个患者的多个标本,并分析每个标本的多个单元格):您在采样层次结构的最高级别(患者方面)进行拆分。但是您可能会有独立的混杂因素,这些混杂因素没有嵌套,例如,由运行测试的不同实验者引起的日常变化或差异。然后,您需要确保拆分对所有对象都是独立的最高级别的混杂器(嵌套的混杂器将自动独立)。如果仅在研究过程中发现了一些混杂因素,要解决这一问题就非常困难,并且设计和执行验证实验可能比处理几乎没有数据用于训练或替代模型测试的分割更有效。
稍微澄清一下术语可能很有用。如果我们让为小于(或等于),其中是样本大小,然后将样本划分为唯一的子样本,那么您所说的保留验证实际上就是2倍( = 2 )交叉验证。交叉验证仅是一种用于估计特定模型的样本外错误率(或通用性)的工具。估计样本外错误率的需求很普遍,并且催生了整个文献。首先,请参见ESL的第7章。Ñ Ñ ķ ķ
因此,要回答以下问题:
为什么要谈论它?在教学上。值得一提的是,将保留验证作为一种特殊的且仅偶尔使用的方法,是一种非常有用的方法,具有许多不同的变化。
为什么要使用它?如果一个人很幸运能够拥有一个庞大的数据集(根据观察值),那么将数据分成两半-训练一半,然后测试另一半-是有意义的。出于计算原因,这是有意义的,因为所需的全部是拟合一次并预测一次(而不是次)。从“大样本估计”的角度来看,这是有道理的,因为您有大量的观测值适合模型。ķ
我了解到的一个经验法则是:当大时,可以很小,但是当小时,应该接近。ķ Ñ ķ Ñ
如果由于主观或部分原因而无法对模型选择和拟合过程进行编码,那么(涉及查看图表等)保持支持验证可能是您最好的选择。(我想您可能会在每个CV折叠中使用诸如Mechanical Turk之类的东西,尽管我从未听说过它已经完成。)
简短答案:
我建议始终使用至少 CV 用于:
您可以为此放松一下:
你们中有些人提到,用R编程可能是一个问题。我建议您看一下“ mlr”包。它在统一的界面中包装了不同的程序包,还提供了真正的高级重采样和性能评估方法。
看看:http : //mlr-org.github.io/mlr-tutorial/release/html/resample/ 和:http : //mlr-org.github.io/mlr-tutorial/release/html/performance/索引
更多说明-CV真正做的是打破偏差方差的权衡:
现在,这两种方法都试图解决的问题是估计泛化误差,该误差取决于用于训练模型的数据。
保持存在偏见和差异问题:
通过减少要测试的数据量,我们将方差引入估计的泛化误差中,因为测试数据可能不再很好地表示基础分布。但是,这本身不会带来偏差,因为可以预期的是,估计的性能将是正确的。
但是,使训练集更小会带来悲观的偏见,因为基础分布仍然无法在数据中很好地表示,并且模型也无法拟合数据。使训练集非常小也会引入方差。
由于培训和测试集的大小相互决定,这给我们带来了一个权衡:悲观偏见与高方差。
k − 1折交叉验证通过保持训练集较大(每次迭代中都使用的数据的一部分进行训练)并通过重采样处理测试误差的方差来解决此问题。。在所有迭代之后,我们已经用一个学习者在数据集的每次观察中测试了性能。显然,这比简单的保持需要更多的计算时间。
交叉验证对于更复杂(高方差)的学习者尤其重要。这些通常在计算上也比较昂贵,这可能会使整个过程非常耗时。
简单的说; 时间。交叉验证可将训练例程运行k次(即,对每个保持集执行一次)。如果您有大量数据,则可能只花一个小时甚至几天就可以针对一个数据集训练模型,因此在使用交叉验证时,您需要将其乘以k。
因此,尽管交叉验证是最好的方法,但是在某些情况下它是不可行的,并且可能会花费更多的时间来更好地花费时间以不同的方式对数据进行建模,或者尝试使用不同的损失函数以获得更好的模型。
我个人的喜好是从整个数据集中获取验证数据,因此,我不是从数据开头或结尾中提取单个10%的块,而是从数据集中的5个点中获取2%的数据。这使得验证数据更能代表整个数据。