机器学习中的数据集及其划分

  • 训练集、验证集和测试集
  • 数据集的划分


训练集、验证集和测试集

训练集(Training Dataset)是用来训练模型使用的,通过前向传播和反向传播更新模型中的权重等参数。
验证集(Validation Dataset)根据每一个epoch训练之后模型在新数据上的表现来调整超参数(如学习率等),或是否需要训练的early stop,让模型处于最好的状态。但注意验证集是没有参与模型中权重等参数的调整。
测试集(Test Dataset)来做模型最终的评估,得到一系列评估指标,测试模型的泛化能力。
举一个例子:

  • 训练集——课本:学生上课学习课本知识;
  • 验证集——作业:通过作业了解学生的学习情况(知识掌握程度、进步的快慢等)
  • 测试集——考试:考试题目是平常没有见过的,用来评判学生的真实能力。

数据集的划分

  • 留出法(Holdout cross validation)

按照固定比例将数据集静态的划分为训练集、验证集、测试集的方式就是留出法。
对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集。若不划分验证集,则常用的分配比例为70% 训练集和30% 测试集。
对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集。

  • 留一法(Leave one out cross validation)

一般在数据集缺乏时使用。将数据集分为训练集和测试集,将测试集放在一边,将训练集逐一切分,每次的验证集都只有一个样本,要进行 m 次训练和预测。 这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。

  • k 折交叉验证(k-fold cross validation)

静态的「留出法」对数据的划分方式比较敏感,有可能不同的划分方式得到了不同的模型。「k 折交叉验证」是一种动态验证的方式,这种方式可以降低数据划分带来的影响。具体步骤如下:

  1. 将数据集分为训练集和测试集,将测试集放在一边;
  2. 将训练集分为 k 份;
  3. 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集;
  4. 通过 k 次训练后,我们得到了 k 个不同的模型;
  5. 评估 k 个模型的效果,从中挑选效果最好的超参数;
  6. 使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型。

k 一般取 10 数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。 数据量大的时候,k 可以设小一点。