训练集、测试集、验证集与交叉验证

初学者对于训练集(train set)、测试集(test set)、验证集(validation set)这三个概念和应用非常容易搞混,这里我结合各种博文和书籍上的讲解进行总结:

训练集

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

验证集

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

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

测试集

不参与训练,用于在训练结束后对模型进行测试,评估其泛化能力。在之前模型使用【验证集】确定了【超参数】,使用【训练集】调整了【可训练参数】,最后使用一个从没有见过的数据集来判断这个模型的好坏。

三者区别

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

  • 训练集——课本,学生根据课本里的内容来掌握知识
  • 验证集——作业,通过作业可以知道不同学生实时的学习情况、进步的速度快慢
  • 测试集——考试,考的题是平常都没有见过,考察学生举一反三的能力

使用时的注意事项

一般对于常用的公开数据集,训练集和测试集是划分好了的,以便于比较不同模型在特定任务上的好坏。验证集往往需要我们从训练集中抽取,抽取比例一般为20%。验证集不是必须的

需要注意的是:从主观上来讲,我们完全可以使用测试集来训练、使用训练集来进行测试。但在科研中,这样使用会违反一种统一的标准而失去了意义。比如,我们研究出一种新的模型,怎样证明我们的模型比已有的某个模型要更好呢?我们需要使用完全相同的训练集和测试集分别对两个模型进行训练和测试,然后对比准确率或者误差。举个极端的例子,如果别人仅使用10个训练样本进行训练,而你使用10000个训练样本,这样得到的结果是没有可比性的。

交叉验证

这里摘自:https://ph0en1xgseek.github.io/2018/04/01/cross_validation/

交叉验证法的作用就是尝试利用不同的训练集/测试集划分来对模型做多组不同的训练/测试,来应对单词测试结果过于片面以及训练数据不足的问题。

交叉验证的做法就是将数据集粗略地分为比较均等不相交的k份,即
训练集、测试集、验证集与交叉验证
然后取其中的一份进行测试,另外的k-1份进行训练,然后求得error的平均值作为最终的评价,具体算法流程西瓜书中的插图如下:
训练集、测试集、验证集与交叉验证

以上,如果有总结的不到位的地方欢迎指出。