验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?相关的知识,希望对你有一定的参考价值。

参考技术A         测试集与验证集的存在主要是为了把调参与评估泛化能力分为两个相对独立的步骤,体现了正交化思想。

        验证集一般用于进一步确定模型中的超参数(例如正则项系数、神经网络中隐层的节点个数,k值等),而测试集只是用于评估模型的精确度(即泛化能力)。

        举个例子:假设建立一个BP神经网络,对于隐含层的节点数目我们并没有很好的方法取确定,此时一般将节点数设为某一具体的值,通过训练出相应的参数后,再由验证集取检测该模型的误差;然后再改变节点数,重复上述过程,直到模型在验证集上误差最小。此时的节点数可以认为是最优节点数。但是这只是在验证集上的表现最优而已,事实上在调整节点数的这个过程当中,我们已经不知不觉的让调整节点数的方向往达到验证集最小误差这个目标去了。但事实上,在验证集误差最小通常并不代表在整个数据集上的误差也会小(因为我们是利用验证集上的表现来调整超参数的,因此在调整超参数的过程当中,验证集的误差在不断减少是必然的),因此需要另外一个数据集来测试模型真正的泛化能力,即测试集。

        测试集是在模型确定好所有参数之后,根据测试误差来评判这个模型好坏的一个数据集。

        (测试集用的次数越少越好。)

神经网络中的训练集、验证集和测试集有啥区别?

【中文标题】神经网络中的训练集、验证集和测试集有啥区别?【英文标题】:What's is the difference between train, validation and test set, in neural networks?神经网络中的训练集、验证集和测试集有什么区别? 【发布时间】:2011-02-27 22:05:13 【问题描述】:

我正在使用this library 来实现一个学习代理。

我已经生成了训练用例,但我不确定验证集和测试集是什么。 老师说:

70% 应该是训练用例,10% 是测试用例,其余 20% 应该是验证用例。

编辑

我有这个训练代码,但我不知道什么时候停止训练。

  def train(self, train, validation, N=0.3, M=0.1):
    # N: learning rate
    # M: momentum factor
    accuracy = list()
    while(True):
        error = 0.0
        for p in train:
            input, target = p
            self.update(input)
            error = error + self.backPropagate(target, N, M)
        print "validation"
        total = 0
        for p in validation:
            input, target = p
            output = self.update(input)
            total += sum([abs(target - output) for target, output in zip(target, output)]) #calculates sum of absolute diference between target and output

        accuracy.append(total)
        print min(accuracy)
        print sum(accuracy[-5:])/5
        #if i % 100 == 0:
        print 'error %-14f' % error
        if ? < ?:
            break

编辑

验证数据的平均误差为 0.2,经过大概 20 次训练迭代后,应该是 80%?

平均误差 = 给定验证数据输入/验证数据大小,验证目标和输出之间的绝对差之和。

1
        avg error 0.520395 
        validation
        0.246937882684
2
        avg error 0.272367   
        validation
        0.228832420879
3
        avg error 0.249578    
        validation
        0.216253590304
        ...
22
        avg error 0.227753
        validation
        0.200239244714
23
        avg error 0.227905    
        validation
        0.199875013416

【问题讨论】:

"...应该是 80%?"不,平均错误和正确百分比是两个不同的东西。假设您的目标值为 5.0,而您的神经元返回 4.8(即误差为 0.2)。根据数据,0.2 的误差可能是可以接受的,因此如果误差足够小,那么您可能会认为该实例已正确指定。因此,如果您有 10 个目标,其中 7 个目标的分类误差在可接受范围内,那么您将正确分类 70% 的数据。 你的老师要求的终止条件是什么? 【参考方案1】:

训练和验证集在训练期间使用。

for each epoch
    for each training data instance
        propagate error through the network
        adjust the weights
        calculate the accuracy over training data
    for each validation data instance
        calculate the accuracy over the validation data
    if the threshold validation accuracy is met
        exit training
    else
        continue training

完成训练后,您可以针对您的测试集运行并验证准确性是否足够。

训练集:该数据集用于调整神经网络上的权重。

验证集:该数据集用于最小化过拟合。您不是在使用此数据集调整网络的权重,您只是在验证训练数据集的准确性的任何提高实际上都会对之前未向网络显示的数据集产生准确性的提高,或者至少网络没有对其进行训练(即验证数据集)。如果训练数据集的准确度增加,但验证数据集的准确度保持不变或降低,那么您的神经网络过度拟合,您应该停止训练。

测试集:该数据集仅用于测试最终解决方案,以确认网络的实际预测能力。

【讨论】:

它的 python :x 我只是无法获得停止标准.. 值收敛.. 但总是有一些波动.. @Daniel,是训练准确率波动还是验证准确率波动?您的验证准确度可能会波动,但训练准确度波动的可能性较小。当您说“输入,目标 = p”时,是否意味着您将两者都设置为 p? 我对 python 不是很好,所以代码看起来有点让我困惑......一般来说,当你的验证准确度达到某个阈值时,你想停止训练,比如 70% 或 90 %,对您的数据域有意义的任何内容。 验证集用于训练过程。测试集不是。测试集允许 1)查看训练集是否足够,以及 2)验证集是否起到了防止过拟合的作用。如果您在训练过程中使用测试集,那么它将只是另一个验证集,并且不会显示在网络中输入新数据时会发生什么。 @AntonAndreev 我不明白。根据您的回答,validation settest set 均未用于调整神经网络的权重。为什么不能使用与validation settest set 相同的数据集,而不是用于训练权重?将它们分开有什么好处?【参考方案2】:

训练集:一组用于学习的例子,即拟合 分类器的参数[即权重]。

验证集: 一组示例用于调整分类器的参数 [即架构,而不是权重],例如选择神经网络中隐藏单元的数量。

测试集: 一组示例,仅用于评估完全指定的分类器的性能 [泛化]。

来自ftp://ftp.sas.com/pub/neural/FAQ1.txt部分“什么是总体、样本、训练集、设计集、验证

对于数据集中的不同数据集(批量学习),误差面会有所不同。因此,如果您为您的测试集数据找到一个非常好的局部最小值,那可能不是一个很好的点,并且可能是由其他一些数据集针对同一问题生成的表面中的一个非常糟糕的点。因此,您需要计算这样一个模型,它不仅可以为训练集找到良好的权重配置,而且还应该能够以良好的误差预测新数据(不在训练集中)。换句话说,网络应该能够泛化示例,以便它学习数据,而不是通过过度拟合训练数据来简单地记住或加载训练集。 p>

验证数据集是您要学习的功能的一组数据,您不直接使用它来训练网络。您正在使用一组称为训练数据集的数据训练网络。如果您使用基于梯度的算法来训练网络,那么某个点的误差面和梯度将完全取决于训练数据集,因此训练数据集直接用于调整权重。为确保您不会过度拟合网络,您需要将验证数据集输入网络并检查错误是否在某个范围内。由于验证集没有直接用于调整网络的权重,因此验证集和测试集的良好错误表明网络对训练集示例的预测良好,并且预计在新的时候表现良好将未在训练过程中使用的示例呈现给网络。

提早停止是停止训练的一种方式。有不同的变体可用,主要轮廓是,训练和验证集的误差都被监控,训练误差在每次迭代(反向传播和兄弟)时都会减小,并且首先验证误差会减小。在验证错误开始上升的那一刻停止训练。此时的权重配置表示一个模型,它很好地预测了训练数据,以及网络看不到的数据。但是因为验证数据实际上间接影响了权重配置来选择权重配置。这就是测试集的用武之地。这组数据从未在训练过程中使用。一旦基于验证集选择模型,测试集数据将应用于网络模型,并发现该集的错误。此错误代表我们可以从针对同一问题的全新数据中预期的错误。

编辑:

另外,如果您没有足够的数据用于验证集,您可以使用crossvalidation 调整参数以及估计测试错误。

【讨论】:

我知道我不应该像这样发布毫无意义的 cmets,但我想告诉你,我非常感谢这个答案:)【参考方案3】:

交叉验证集用于模型选择,例如,对于给定的参数集,选择误差最少的多项式模型。然后使用测试集报告所选模型的泛化错误。从这里:https://www.coursera.org/learn/machine-learning/lecture/QGKbr/model-selection-and-train-validation-test-sets

【讨论】:

我也在上 Andrew Ng 的课程,我同意你的看法。验证集应该是训练的一部分。它应该只用于转动超参数。【参考方案4】:

简单地说定义训练集、测试集、验证集

训练集:用于寻找最近邻。 验证集:用于寻找适用于训练集的不同 k。 测试集:用于寻找最大准确度和未来未见数据。

【讨论】:

这个答案中训练集和验证集的定义是错误的。【参考方案5】:

假设您在训练集上训练模型,然后在测试集上测量其性能。您认为仍有改进的空间并尝试调整超参数(如果模型是神经网络 - 超参数是层数或层中的节点)。现在你得到了稍微好一点的性能。但是,当模型受到其他数据(不在测试和训练集中)的影响时,您可能无法获得相同水平的准确度。这是因为您在调整超参数以在测试集上获得更好的准确性时引入了一些偏差。您基本上已经调整了模型和超参数,以便为该特定训练集生成最佳模型。

一种常见的解决方案是进一步拆分训练集以创建一个验证集。现在你有

训练集 测试集 验证集

您像以前一样继续,但这次您使用验证集来测试性能并调整超参数。更具体地说,您在缩减的训练集(即完整的训练集减去验证集)上训练具有各种超参数的多个模型,然后选择在验证集上表现最佳的模型。

一旦你在验证集上选择了表现最好的模型,你就可以在整个训练集(包括验证集)上训练最好的模型。 集),这给了你最终的模型。

最后,您在测试集上评估这个最终模型以获得泛化误差的估计值。

【讨论】:

【参考方案6】:

训练数据集:用于拟合模型的数据样本。

验证数据集:数据样本用于在调整模型超参数时对训练数据集上的模型拟合进行无偏评估。随着验证数据集的技能被纳入模型配置,评估变得更加有偏见。

测试数据集:用于对训练数据集拟合的最终模型进行无偏评估的数据样本。

【讨论】:

【参考方案7】:

我们创建一个验证集来

在训练期间衡量模型的泛化程度 告诉我们何时 停止训练模型;当验证损失停止减少时(尤其是当 验证损失开始增加,训练损失仍然 减少)

为什么使用验证集

【讨论】:

【参考方案8】:

训练数据用于更新权重。如果我们谈论简单的多层感知器神经网络,权重会在反向传播期间根据训练数据上的误差进行更新。

验证数据用于检查模型的过拟合。它也被用作训练的停止标准。 Keras 中的不同回调依赖于验证数据。例如,我们可以根据验证数据设置提前停止。我们总是在验证数据的训练过程中检查模型的准确性。

测试数据与训练过程无关。保存训练好的模型后,将使用测试数据检查模型在未见数据上的性能。

【讨论】:

以上是关于验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要划分训练集、验证集和测试集

训练集验证集和测试集的意义(转)

训练集验证集和测试集的作用和区别

机器学习:验证数据集与交叉验证

验证集与测试集的区别

测试数据集 和验证数据集 之间的区别