神经网络中训练,验证和测试集之间有什么区别?


155

我正在使用该库来实现学习代理。

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

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

编辑

经过约20次训练迭代后,使用验证数据可以得到0.2的平均误差,应该是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

1
“ ...应该是80%?” 不,平均错误和正确百分比是两回事。假设您的目标值为5.0,而您的神经元返回了4.8(即误差为0.2)。根据数据,可接受的误差为0.2,因此,如果误差足够小,则可以认为该实例已正确指定。因此,如果您有10个目标,并且其中7个目标的分类误差在可接受的范围内,那么您应该正确分类了70%的数据。
基里尔2010年

您的老师要求的终止条件是什么?
基里尔2010年

Answers:


292

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

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

一旦完成培训,就可以针对测试集运行并验证准确性是否足够。

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

验证集:此数据集用于最小化过度拟合。您并没有使用此数据集来调整网络的权重,您只是在验证与训练数据集相比,准确性的提高实际上会导致其准确性比以前从未显示给网络的数据集有所提高,或至少网络尚未对其进行训练(即验证数据集)。如果训练数据集的准确性提高了,但验证数据集的准确性保持不变或降低,则说明您的神经网络过拟合,应该停止训练。

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


它的蟒蛇:西安只是不能得到一个停止标准..数值收敛..但总是与一些flutuation ..
丹尼尔·

@Daniel,培训准确性是否发生波动或验证准确性发生波动?您的验证准确性可能会有所波动,但培训准确性却不太可能波动。当您说“输入,目标= p”时,是否意味着您将两者都设置为p?
基里尔

我对python不太满意,所以代码对我来说有点困惑...通常来说,当您的验证精度达到某个阈值(例如70%或90%)时,您想停止训练,无论该域是否有意义您的数据。
基里尔2010年

5
在训练过程中使用验证集。测试集不是。测试集允许1)查看训练集是否足够,以及2)验证集是否起到了防止过度拟合的作用。如果您在训练过程中使用测试集,则它将只是另一个验证集,并且不会显示在网络中输入新数据时会发生什么。
安东·安德烈耶夫

2
@AntonAndreev我不明白。根据您的答案,validation settest set都不用于调整神经网络的权重。为什么你不能使用相同的数据集,而不是用来训练的权重,为validation settest set?将它们分开可以得到什么?
吉利

77

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

验证集:一组用于调整分类器的参数(即体系结构而非权重)的示例,例如用于选择神经网络中隐藏单元的数量。

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

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

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

验证数据集是您要学习的功能的一组数据,您没有直接使用它们来训练网络。您正在使用一组称为训练数据集的数据来训练网络。如果您使用基于梯度的算法来训练网络,则误差表面和某个点处的梯度将完全取决于训练数据集,因此训练数据集可直接用于调整权重。为了确保您不会过度拟合网络,您需要将验证数据集输入到网络中,并检查错误是否在一定范围内。由于验证集没有直接用于调整网络的权重,因此验证和测试集的错误均很大,这表明网络对火车集示例的预测很好,

早停是一种停止训练的方法。有不同的可用变化,主要概述是,监视火车和验证集错误,在每次迭代(反向传播和兄弟)中减少火车错误,并且首先验证错误减少。验证错误开始上升时,训练将停止。此时的权重配置表示一个模型,该模型可以很好地预测训练数据以及网络无法看到。但是因为验证数据实际上间接影响权重配置以选择权重配置。这就是测试集的来源。训练过程中永远不会使用这些数据集。根据验证集选择模型后,将测试集数据应用于网络模型,并找到该集的错误。此错误代表错误,对于相同的问题,我们可以从绝对新的数据中预期到。

编辑:

另外,如果没有足够的数据用于验证集,则可以使用交叉验证来调整参数以及估计测试误差。


11
我知道我不应该这样发布无意义的评论,但想告诉您,我非常感谢这个回答:)
Llamageddon


4

我们创建一个验证集

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

为什么使用验证集

为什么使用验证集


2

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

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

  • 训练集
  • 测试装置
  • 验证集

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

在验证集上选择性能最佳的模型后,即可在完整的训练集(包括验证集)上训练最佳模型,这将为您提供最终模型。

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


0

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

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

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


-15

用简单的话定义训练集,测试集,验证集

训练集:用于查找最近的邻居。验证集:用于找到应用于训练集的不同k。测试仪:用于寻找最大的精度和将来看不见的数据。

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.