测试集和验证集有什么区别?


431

当我在Matlab中使用神经网络工具箱时,我感到困惑。
它将原始数据集分为三个部分:

  1. 训练集
  2. 验证集
  3. 测试集

我注意到在许多训练或学习算法中,数据通常分为训练集和测试集两部分。

我的问题是:

  1. 验证集和测试集有什么区别?
  2. 验证集是否真的特定于神经网络?或者它是可选的。
  3. 更进一步,在机器学习的上下文中,验证和测试之间有区别吗?

56
该问题在《统计学习的要素》第222页一书中得到了回答。验证集用于模型选择,最终模型的测试集(通过选择过程选择的模型)预测错误。
mpiktas

@mpiktas您是指“模型评估和选择”一章吗?
Celdor

2
是。页码来自第5印刷版。
mpiktas 2015年

13
@mpiktas很特别。这是实际的文本:The training set is used to fit the models; the validation set is used to estimate prediction error for model selection; the test set is used for assessment of the generalization error of the final chosen model. Ideally, the test set should be kept in a “vault,” and be brought out only at the end of the data analysis.
2016年

1

Answers:


254

通常,要执行监督学习,您需要两种类型的数据集:

  1. 在一个数据集(您的“黄金标准”)中,您将获得输入数据以及正确/预期的输出。此数据集通常是人为准备的,或者是通过半自动化方式收集的一些数据。但重要的是,这里的每个数据行都应有预期的输出,因为在监督学习中需要此输出。

  2. 您将模型应用到的数据。在很多情况下,这是您对模型输出感兴趣的数据,因此,您在此处没有任何“预期”输出。

在执行机器学习时,请执行以下操作:

  1. 训练阶段:通过将输入与预期输出配对来呈现“黄金标准”中的数据并训练模型。
  2. 验证/测试阶段:为了估算模型的训练水平(取决于数据的大小,要预测的值,输入的值等)并估算模型的属性(数值预测器的平均误差,分类器的分类错误,IR模型的召回率和精度等)
  3. 应用阶段:现在,您将新开发的模型应用于实际数据并获得结果。由于这种类型的数据通常没有任何参考值(否则,为什么需要您的模型?),因此只能使用验证阶段的结果推测模型输出的质量。

验证阶段通常分为两个部分

  1. 在第一部分中,您只需查看模型,然后使用验证数据(=验证)选择性能最佳的方法
  2. 然后,您可以估算所选方法(=测试)的准确性。

因此分离到50/25/25。

如果您不需要从几种相互竞争的方法中选择合适的模型,则只需将您的集合重新划分为基本上只有训练集和测试集即可,而无需验证训练后的模型。然后,我个人将它们划分为70/30。

另请参阅此问题


21
我为什么不基于测试集选择性能最好的模型,而完全放弃验证集呢?
塞巴斯蒂安·格拉夫

4
是因为过度拟合吗?还是因为我们想要基于测试结果的一些独立统计信息,仅用于误差估计?
塞巴斯蒂安·格拉夫

12
@Sebastian [如果仅使用测试集,则:“”最终选择的模型的测试集错误将低估真实的测试错误,有时会低估“ [Hastie等]
user695652 2015年

23
验证集通常用于调整超参数。例如,在深度学习社区中,调整网络层大小,隐藏单元数,正则化项(无论是L1还是L2)取决于验证集
xiaohan2012 2015年

2
拆分集合的正确方法是什么?选择应该是随机的吗?如果您有相似的图片怎么办?这不会损害您的概括能力吗?如果您在不同的位置上有两组,那么将一组作为训练组而将另一组作为测试组会更好吗?
Yonatan Simson '02

263

训练集:用于学习的一组示例:适合分类器的参数在多层感知器(MLP)的情况下,我们将使用训练集通过反向传播规则找到“最佳”权重

验证集:用于调整分类器参数的一组示例在MLP情况下,我们将使用验证集来找到“最佳”隐藏单元数或确定反向传播算法的停止点

测试集:仅用于评估经过全面训练的分类器性能的一组示例在MLP案例中,我们在选择最终模型(MLP大小和实际权重)之后,将使用该测试来估计错误率。测试集上的最终模型,您不得再进一步调整模型!

为什么要分开测试和验证集? 由于使用验证集选择最终模型,因此最终模型在验证数据上的错误率估计将存在偏差(小于真实错误率)。进一步!

来源:里卡多·古铁雷斯-奥苏纳得克萨斯州A&M大学模式分析导论


42
+1表示“您绝不能进一步调整模型!”
stmax 2014年

6
“拟合参数”和“调整参数”有什么区别?
Metariat

18
@stmax不必太花哨,但是一旦我们遇到最终的测试错误并且对结果不满意,如果我们无法进一步调整模型,该怎么办?...我经常想知道这种情况。
Spacey

5
@Tarantula,您可以继续调整模型,但必须收集新的测试集。当然,没有人会这样做;)但是违反该规则(尤其是当您重复几次)可能会导致模型拟合测试集-这会导致分数不切实际/过于乐观。
stmax,2016年

4
我认为这种命名方式令人困惑。使用测试集后,您说正确的话是正确的,但是……您打算做什么?停止工作了吗?实际上,您需要测试集的整个层次结构。1:验证集-用于调整模型; 2:测试集,用于评估模型,并查看是否应返回绘图板; 3:超级测试集,用于最终决赛算法,以了解如何很好,它是4:超级测试集,在研究人员开发MNIST算法10年后使用,以查看它们有多么疯狂地过拟合……等等。等等
Timmmm

66

我在计算机科学领域的5年经验告诉我,没有什么比简单更好。

“培训/交叉验证/测试”数据集的概念就这么简单。如果数据集较大,建议将其分为三部分:

++训练集(原始数据集的60%):用于构建我们的预测算法。我们的算法尝试将自身调整为训练数据集的怪癖。在此阶段,我们通常创建多种算法,以比较交叉验证阶段的性能。

++交叉验证集(原始数据集的20%):此数据集用于比较基于训练集创建的预测算法的性能。我们选择性能最佳的算法。

++测试集(占原始数据集的20%):现在,我们选择了首选的预测算法,但尚不知道它将如何在完全看不见的真实数据上执行。因此,我们将选择的预测算法应用于测试集,以了解其性能如何,以便我们可以了解算法在看不见的数据上的性能。

笔记:

-请记住,不建议跳过测试阶段,这一点非常重要,因为在交叉验证阶段执行良好的算法实际上并不意味着它确实是最好的算法,因为算法是基于交叉比较的-验证集及其怪癖和噪音...

-在测试阶段,目的是查看最终模型如何在野外处理,因此,如果其性能非常差,我们应该从培训阶段开始重复整个过程。


1
将这些集合称为阶段是容易且令人困惑的,反之亦然。
Matt O'Brien

2
@innovIsmail如果我跳过验证步骤怎么办?假设我有很多算法,并且在火车上对它们进行了训练,然后将它们全部应用到测试仪上,然后我选择了在测试仪上性能最佳的算法
KevinKim

3
在我看来,您好像只是跳过测试步骤。
Mihai Danila'5

1
>比较预测算法的性能-在这种情况下什么是“算法”?您的模型不是算法吗?是否必须建立多个模型并分别进行训练以得到多个阶段进行验证?
Boppity Bop'17

2
这种简单性是一种错觉,因为在非巨大样本量的情况下,如果重复随机拆分,人们将获得截然不同的预测算法和验证结果。
弗兰克·哈雷尔

33

在要求您做出决定的每一步(即,从多个选项中选择一个选项),您都必须有一个额外的集合/分区来衡量您选择的准确性,以便您不会简单地选择随机性和将分布的尾端误认为中心1。左边是悲观主义者。权利是乐观主义者。中心是实用主义者。成为实用主义者。

在此处输入图片说明

步骤1)训练:每种算法都有自己的参数选项(神经网络中的层数,随机森林中的树数等)。对于每种算法,必须选择一个选项。这就是为什么要进行培训的原因。

步骤2)验证:现在,您有了算法的集合。您必须选择一种算法。这就是为什么要使用测试仪。大多数人会选择在验证集上表现最好的算法(没关系)。但是,如果您没有在测试集上衡量性能最高的算法的错误率,而仅在验证集上采用其错误率,那么您就将“最佳方案”误认为是“最可能的方案”。那是灾难的秘诀。

步骤3)测试:我想如果您的算法没有任何参数,那么您将不需要第三步。在这种情况下,您的验证步骤将是您的测试步骤。Matlab可能不要求您提供参数,或者您选择不使用它们,这就是造成混淆的原因。

1在假设所有选项都相同(例如,所有参数都相同或所有算法都相同)的假设(无效假设)下进入每个步骤通常会很有帮助,因此我参考了分布。

2此图像不是我自己的。我已从以下网站上获取它:http : //www.teamten.com/lawrence/writings/bell-curve.png


3
我认为第一句话比其他任何答案都更能说明这个问题的基本答案。“要求您做出决定的每一步(即,从多个选项中选择一个选项),您都必须具有一个附加的组/分区,以衡量您选择的准确性……”
kobejohn

问题:如果我想找到最好的RandomForest(RF)并假装只有RF的一个超参数,即树的数量(N),那么在步骤1中,我运行了许多具有不同N的RF来建立森林; 在步骤2中,将它们应用于验证测试,并选择误差比验证测试最低的N *的RF,然后在步骤3中,将具有N *的RF应用到测试集,并获得该RF的真实测试误差的无偏估计N *。但是我可以将所有RF应用于测试集,并选择测试误差最小的那个,可能不是N *。这就是进行验证步骤2的重点吗?
KevinKim

1
@KevinKim:如果将测试集应用于所有RF,然后使用结果进行进一步选择(选择其他模型),那么您只需重复验证步骤。您已经确定要“我需要使模型的误差降到最低!”。那就是培训和验证的重点,而不是测试的重点。测试仅涉及:我已经训练并选择了一个模型,现在让我们看看它的“总体性能”。显然,“通用”测试集只是可能过度拟合或可能过度拟合的另一部分数据,但要点是,您没有故意选择地使模型过度拟合。
Honeybear '18

三向拆分只是一种非常常见的方法(A),可让您大致了解模型是如何用有限的精力概括(B)以及(C)观察到的数据有限的。如果要在(B)方面做得更好,则可以按照您的建议进行操作:使用不同的验证集对泛化进行微调。使用有限的数据(称为交叉验证):使用不同的训练和测试集重复训练和验证(对于神经网络而言,训练可能需要数周的时间,这不是问题。
Honeybear '18

1
但是,该模型将如何“在现实世界中”执行仍是未知的。这只是一个经过验证和测试的假设,它将在看不见的数据上表现良好,出于科学目的,通常认为这已经足够。如果您现在再次去生成并选择模型,直到一个模型完全符合验证集和测试集,那么您就可以将测试集退化为验证集。最好对此进行交叉验证。如果您的性能在测试集上持续显着变差,则始终可以选择这样一种选择,即您的数据被严重拆分,并且您想使用重新组合的集重新启动。
Honeybear

21

并不需要您以任何方式拆分数据。引导程序可以将整个样本用于开发和测试模型,从而提供较小的预测准确性的均方误差估计。


1
因此,您不主张通过分割大型数据集进行交叉验证来进行预测模型测试/验证吗?
OFish

9
否,除非数据集很大或信噪比高。根据我的经验,交叉验证并不像引导程序那样精确,并且它不会使用整个样本量。在许多情况下,您必须重复进行50-100次交叉验证才能获得足够的精度。但是,在您的数据集中有20,000个以上的主题中,诸如拆分样本验证之类的简单方法通常是可以的。
Frank Harrell 2014年

2
真的很高兴知道!谢谢。从您那里获得的信息是绝佳的“来源”。干杯!
OFish

1
分割样本验证通常比严格的引导性能差。创建一个外部引导程序外观,该外观重复所有有监督的学习步骤(所有使用Y的步骤)。Efron-Gong乐观引导程序在不保留数据的情况下估计了预测模型在算法看不到的数据中的分解程度。
弗兰克·哈雷尔

1
是的,强调重复。这是一个有问题的分裂。
弗兰克·哈雷尔

13

典型的机器学习任务可以可视化为以下嵌套循环:

while (error in validation set > X) {
    tune hyper-parameters
    while (error in training set > Y) {
        tune parameters
    }
}

通常,外部循环是由验证集上执行的,内部循环是由机器训练集上执行的。然后,您需要一个第三测试集来评估模型的最终性能。

换句话说,验证集是针对人类的训练集。


9

考虑这三个集合的一种方法是,其中三个(trainingvalidation)来自过去,而这三个集合test来自“未来”。应该使用“过去”(training/ validation数据)中的数据来构建和调整模型,但绝不要test使用来自“未来”中的数据。

举一个实际的例子,假设我们正在建立一个模型来预测棒球运动员将来的表现。我们将使用1899-2014年的数据来创建testvalidation。一旦建立了模型并根据这些数据进行了调整,我们将使用2015年(实际上是过去!)中的数据作为测试集,从模型的角度来看,这些数据看起来像“未来”数据,并且不会影响模型的创建。 。(显然,从理论上讲,如果我们真的想要的话,我们可以等待2016年的数据!)

显然,我在各处都使用了引号,因为数据的实际时间顺序可能与实际的未来不符(根据定义,所有数据生成都可能发生在实际的过去)。实际上,test集合可能只是与您“坚持” 的training/ validation集合来自同一时间段的数据。这样,它对调整模型没有影响,但是那些保留的数据实际上并非来自未来。


4
阅读完所有其他答案后,此答案对我来说是“单击”!您使用训练集进行训练,检查您是否未过度使用验证集(并且模型和超参数可用于“未知数据”),然后使用测试集进行评估-“新数据”-是否现在有任何预测能力..!
stolsvik

从某种意义上来说,这是一种公平的对待方式,即test数据永远不应成为训练过程的一部分:而且,如果我们将其视为“未来”数据,那么这将是一个不可能犯的错误。
javadba

7

大多数监督数据挖掘算法遵循以下三个步骤:

  1. 训练集用于构建模型。其中包含一组已预先分类了目标变量和预测变量的数据。
  2. 通常,使用保留数据集或测试集来评估模型对训练集以外的数据的处理效果。测试集包含预分类的结果数据,但是当测试集数据在模型中运行到最后,将预分类的数据与模型结果进行比较时,才使用它们。调整模型以最大程度地减少测试集上的误差。
  3. 在步骤#2中,使用另一个保留数据集或验证集来评估调整后的模型,在该步骤中,再次对调整后的模型运行验证集数据,并将结果与​​未使用的预分类数据进行比较。

4

有人对我们为什么使用验证集感到困惑,因此,我将简单,直观地说明如果不使用验证数据集会发生什么。

如果不使用验证集,则必须选择超参数并根据测试数据集上模型的性能决定何时停止训练。如果您根据模型在测试数据集上的性能来决定何时停止训练,则只需在模型在测试数据集上表现良好时就停止训练。然后,当您报告结果时,您将报告测试数据集的准确性。问题在于,您可以说您的模型确实表现出色,而实际上这只是一个随机变化,导致它在测试集上的表现更好。

如果您使用验证集来决定何时停止训练,则测试集上模型的准确性通常更公正地反映了模型在任务上的执行情况,这表明您并未优化建模只是为了在测试集上表现良好。


2

我想在这里添加其他非常好的答案,方法是指向机器学习中一种相对较新的方法,称为“差异隐私”(请参阅​​Dwork的论文;有关更多信息,请参见Win Vector Blog)。这个想法允许在不影响最终模型性能的情况下实际重用测试集。在典型设置中,测试集仅用于估计最终性能。理想情况下,甚至不允许查看它。

正如在Win Vector博客中所描述的(也请参见其他条目)一样,可以“使用”测试集而不会影响模型的性能。这可以通过称为“差异隐私”的特殊过程来完成。学习者将无法直接访问测试集。


-1

我的想法是,神经网络工具箱中的这些选项是为了避免过拟合。在这种情况下,仅为训练数据指定权重,而不显示全局趋势。通过设置验证集,迭代可适应于训练数据错误减少导致验证数据减少和验证数据错误增加的地方;随着训练数据错误的减少,这证明了过度拟合现象。


我敢说测试集在整个过程中增加了健全性检查。您可以拥有一条训练曲线,该曲线可以在每个时期复制验证/损失曲线。但是,如果您的测试仪精度没有随着时间的推移或坦克的提高而提高,那么您将无济于事。你太过拟合了。
agcala
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.