今天与朋友交流的时候,我竟然把验证集和测试集搞反了.....另外还有就是数据划分的问题,我也是忘了,所以再次复习一下....

问题一:什么是训练集、验证集、测试集以及它们的作用?

1、训练集

参与训练,模型从训练集中学习经验,从而不断减小训练误差。这个最容易理解,一般没什么疑惑。

2、验证集

不参与训练,用于在训练过程中检验模型的状态,收敛情况。验证集通常用于调整超参数,根据几组模型验证集上的表现决定哪组超参数拥有最好的性能。

同时验证集在训练过程中还可以用来监控模型是否发生过拟合,一般来说验证集表现稳定后,若继续训练,训练集表现还会继续上升,但是验证集会出现不升反降的情况,这样一般就发生了过拟合。所以验证集也用来判断何时停止训练。

3、测试集

不参与训练,用于在训练结束后对模型进行测试,评估其泛化能力。在之前模型使用【验证集】确定了【超参数】,使用【训练集】调整了【可训练参数】,最后使用一个从没有见过的数据集来判断这个模型的好坏。 需要十分注意的是:测试集仅用于最终评价模型的好坏,在测试集上得到的指标可以用来和别人训练的模型做对比,或者用来向别人报告你的模型效果如何。切记千万不能根据模型在测试集上的指标调整模型超参数(这是验证集应该干的事情),这会导致模型对测试集过拟合,使得测试集失去其测试效果的客观性和准确性。

三者区别

为了方便理解,人们常常把这三种数据集类比成学生的课本、作业和期末考:

验证集参与训练了吗?

训练集是拿来训练模型参数的,对于所有的训练集,训练一个epoch之后,我们会用验证集来测试一下模型在上面的性能,由于训练集和验证集的不可交性,所以在验证集上面的结果是有参考意义的。

但是重点是:

  1. 验证集并没有参与训练过程梯度下降过程的,狭义上来讲是没有参与模型的参数训练更新的。
  2. 但是广义上来讲,验证集存在的意义确实参与了一个“人工调参”的过程,我们根据每一个epoch训练之后模型在valid data上的表现来决定是否需要训练进行early stop,或者根据这个过程模型的性能变化来调整模型的超参数,如学习率,batchsize等等。
  3. 因此,我们也可以认为,验证集也参与了训练,但是并没有使得模型去overfit验证集

问题二:能不能只要训练集和测试集,不要验证集呢?

在机器学习中,开发模型时人们总需要手动调节模型的参数,比如改变权重、选择层数或每层的大小,这个调节过程需要在训练的模型上通过验证集数据的表现来提供一个反馈信号(例如验证集上的损失大小、生成的图像质量如何),去修改网络模型及参数。

因为如果你只看训练集上的信息(例如验证集上的损失大小、生成的图像质量如何),可能效果很好了(因为模型可以“看得到”训练集的数据,然后一直根据训练集更新参数,然后过拟合),此时你将一个模型从来没有见过的数据“验证集”丢给模型,然后看模型在验证集上的表现,就可以在一定程度上知道模型的泛化能力,然后你根据这个结果再去手动调整超参数(自动机器学习除外)。

训练集、验证集、测试集的划分比例?

数据划分的方法并没有明确的规定,不过可以参考3个原则:

  1. 对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集。
  2. 对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集。
  3. 超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集。

能不能只要训练集和测试集,不要验证集呢? - 知乎

训练集、验证集、测试集(附:分割方法+交叉验证) - 腾讯云开发者社区-腾讯云

发表回复