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

我正在使用 这个图书馆来实现一个学习代理。

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

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
179220 次浏览

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

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

一旦完成了培训,然后对照测试集运行并验证准确性是否足够。

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

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

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

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

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

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

来自 Ftp://ftp.sas.com/pub/neur/FAQ1.txt节“ 什么是人口,样本,训练集,设计集,验证

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

验证数据集是要学习的函数的一组数据,您不会直接使用它们来训练网络。你正在用一组数据训练网络,你称之为训练数据集。如果使用基于梯度的算法来训练网络,那么在某一点上的误差曲面和梯度将完全依赖于训练数据集,因此训练数据集被直接用来调整权重。为了确保网络不会过载,您需要将验证数据集输入到网络中,并检查错误是否在某个范围内。由于验证集没有直接用来调整网络的权重,因此验证和测试集的误差较大,表明该网络对列车集样本的预测性能良好,并且当新样本提交给训练过程中未使用的网络时,预测性能良好。

早停是停止训练的一种方式。有不同的变化可用,主要纲要是,列车和验证集误差都被监控,列车误差减少在每次迭代(支柱和兄弟) ,首先验证误差减少。在验证错误开始上升时停止训练。此时的权重配置指示一个模型,该模型可以很好地预测训练数据和 电视台看不到的数据。但是由于验证数据 事实上间接地影响权重配置以选择权重配置。这就是测试集的用武之地。这组数据在培训过程中从未使用过。一旦根据验证集选择了模型,测试集数据将应用于网络模型,并找到该集的错误。这个错误是一个代表性的错误,我们可以期望从绝对新的数据为同一个问题。

编辑:

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

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

用简单的语言定义训练集、测试集、验证集

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

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

一个常见的解决方案是进一步分割训练集以创建 验证集

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

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

一旦您选择了验证集上的最佳性能模型,就可以在完整的训练集(包括 valida -)上训练最佳模型 这就给出了最终的模型。

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

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

验证数据集 : 在调优模型超参数的同时,用于提供适合于训练数据集的模型的无偏评估的数据样本。随着验证数据集上的技能被合并到模型配置中,评估变得更加有偏见。

Test Dataset : 用于对训练数据集上的最终模型提供无偏评估的数据样本。

我们创建一个验证集,以

  • 在培训期间,测量模型的概括性
  • 告诉我们什么时候行动 停止训练模型; 当验证损失停止减少时(特别是当 验证损失开始增加,训练损失仍然是 下降)

为什么使用验证集 :

Why validation set used

训练数据 用于更新权重。如果我们讨论的是简单的多层感知机神经网络,权重在反向传播过程中根据训练数据的误差进行更新。

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

测试数据 与训练过程无关。一旦训练好的模型被保存,测试数据就被用来检查模型在未知数据上的性能。