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

Dan*_*iel 138 artificial-intelligence neural-network

我正在使用这个库来实现学习代理.

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

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
Run Code Online (Sandbox Code Playgroud)

编辑

在经过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
Run Code Online (Sandbox Code Playgroud)

Kir*_*ril 265

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

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
Run Code Online (Sandbox Code Playgroud)

完成培训后,您将对抗测试集并验证准确性是否足够.

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

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

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

  • 验证集用于培训过程.测试集不是.测试集允许1)查看训练集是否足够2)验证集是否完成防止过度拟合的工作.如果您在培训过程中使用测试集,那么它将只是另一个验证集,并且它不会显示在网络中提供新数据时会发生什么. (4认同)
  • @AntonAndreev 我不明白。根据您的回答,“验证集”和“测试集”均未用于调整神经网络的权重。为什么不能使用相同的数据集,而不是用于训练权重,作为“验证集”和“测试集”?将它们分开有什么好处? (3认同)

pho*_*xis 70

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

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

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

ftp://ftp.sas.com/pub/neural/FAQ1.txt部分" 什么是人口,样本,训练集,设计集,验证 "

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

验证数据集是您要学习的功能的一组数据,您不直接用于训练网络.您正在使用一组数据训练网络,您可以将其称为训练数据集.如果您使用基于梯度的算法训练网络,那么错误表面和某些点的梯度将完全取决于训练数据集,因此训练数据集直接用于调整权重.为确保不会过度使用网络,您需要将验证数据集输入网络并检查错误是否在某个范围内.因为验证集没有直接用于调整netowork的权重,因此验证和测试集的良好错误表明网络预测了列车集示例,

提前停止是一种停止训练的方法.有不同的变化可用,主要概述是,列车和验证集错误都被监控,列车错误在每次迭代时减少(backprop和兄弟),并且首先验证错误减少.在验证错误开始上升时停止训练.此时的权重配置表示模型,该模型可以很好地预测训练数据,以及网络未看到的数据.但实际上是因为验证数据间接影响重量配置以选择重量配置.这就是测试集的用武之地.这组数据从未在训练过程中使用过.一旦基于验证集选择了模型,就将测试集数据应用于网络模型,并找到该集的错误.此错误代表了我们可以从同一问题的绝对新数据中获得的错误.

编辑:

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

  • 我知道我不应该发布这样的无意义的评论,但是想告诉你我很欣赏这个答案:) (10认同)

Nil*_*ash 8

我们创建一个验证集

  • 在训练期间测量模型的泛化能力
  • 告诉我们什么时候停止训练模型;当验证损失停止减少时(尤其是当验证损失开始增加而训练损失仍在减少时)

为什么使用验证集

为什么使用验证集


use*_*953 6

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


Adi*_*tya 5

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

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

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

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

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

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