机器学习数据集(训练集、测试集)划分方法

  一个模型的好坏终归还是需要一个客观的评价标准,但是现有标准都比较难以适用于单次评估,毕竟单次评估过于具有偶然性,这个问题的解决方法就是多训练几次模型,综合评估一下。
  但是训练模型总不能,在相同的数据集上,一直运行,一直评估。一个比较好的解决方法就是对数据集进行不同的划分,然后多训练几个模型,最后指标综合一下。这篇文章整理一下机器学习中数据集划分的方法,当然划分的主要目的还是为了多方面的评估模型。
  划分数据集的过程中主要目的就是为了把数据划分为不同的训练集和测试集,一般文献中也会将验证集隐含在训练集中,两者都是在训练过程中使用的。数据集选择的过程中有几点要求需要遵循。

  • 训练集应尽可能的与测试集互斥
  • 一定程度上,要保持训练和测试数据分布的一致性,这样有利于模型学习

   如果数据的采样过程中,想要保留类别比例,也就是说把每一个类别的数据作为采样单元,这样的采样方式就称为分层采样了。以下介绍几种基础的数据集选择方式。

留出(Hold-out)法

  直接将数据集D划分为两个互斥的集合,分别作为训练集和测试集。不同的划分能够导致不同的效果,因此单次使用留出法得到的估计结果往往不够可靠稳定,一般采用若干次随机划分, 重复试验之后取平均值作为评估结果。
  因为数据集被分成了数据集和测试集,这就导致了使用训练集训练的模型与整个数据集有差异。通常需要对S(训练集)和T(测试集)的比例进行权衡,一般使用 2 3 4 5 \frac{2}{3}到\frac{4}{5} 比例的样本用于训练。但是随着现在数据量越来越庞大,测试集的比例可以进一步的缩小,基本保证能够覆盖各种类型特征即可。
  留出法无法避免的一个困境就是大小权衡,若训练集S较大,则测试集T就会小,评估结果具有偶然性;若S较小,S训练出的模型与T训练出的模型差异过大,性能上不去。

交叉验证(cross validation)法

  相比于留出法的随机选择,交叉验证法更加确定了一点点。经常用于数据不充足的时候。
  通过重复的使用数据,对给定数据进行切分,将切分的数据集组合为训练集与测试集,以此来进行模型选择。切分的份数k就是k折(k-fold)交叉验证。
  具体做法是,先将数据集D划分为k个大小相似的互斥子集,每个子集 D i D_i 尽可能保持数据分布的一 致性(即分层采样),然后每次用k-1个子集的并集,作为训练集。剩下的一份用作测试集,这样可以得到k个组合,然后训练k个模型,最终返回k组测试结果的均值和方差。经常看到k=10,也就是10折交叉验证。
  与留出法一样,为了减少因不同的划分而带来偏差,通常又要随机使用不同的划分,进行p次, 这就是p次k折交叉验证。
   如果令k=样本数m,最后留下一个分组,也就是一个样本,选择1个样本作为验证,就是留一(leave-one-out)法,这样使得S尽可能的接近了D,同时避免了划分带来的差别,但是就需要训练m个分类器,工作量可能是极其巨大的,往往在数据缺乏的情况下使用。这样能够最大程度保证训练集和原始数据集一致。
  这里补充一点,留一验证也是留k验证的特例,但是留k法需要选择其中k个样本,这就是一个从m个样本中选择其中k个的佩列问题,排列组合数目过于庞大,所以使用留一更加简单。

自助法(bootstrap)

  以自助采样为基础,每次随机有放回的从数据集D中抽取训练数据,一共m个数据,我们抽取m次,会有相当多的数据一次都没有被抽取到,我们用作测试集。
  自助法在数据集较小、难以有效划分时很有用,此外自助法可以从初始数据中产生多个不同的训练集,自助法改变了初始数据集的分布,通常会引入估计偏差,不适用于数据量充足的情况。
  有返回采样,每个样本每次被选中的概率就是 1 m \frac1m ,则不被选中的概率就是 1 1 m 1-\frac1m ,难么采样m次,仍然不被选中的概率就是 ( 1 1 m ) m \left (1-\frac1m\right)^m ,这个表达式很熟悉,没错就是重要极限里的核心部分。这个表达式是一个关于m的增函数,也就是说样本不会被采样到的概率随着m增大而增大。但是最终有上界,就是 1 e \frac1e ,所以测试集的比例从下界趋向于这个值。
  从样本中采样了m次,显然最终的训练集中,有的样本被重复采样了。
  以上几种数据集划分是常用的几种方式,但是合适的数据划分方式是不明显的,因为我们很难保证独立同分布。也很难知道多大的数据量适合训练。但是多尝试几个方法可以给我们更多的视野。

猜你喜欢

转载自blog.csdn.net/m0_38065572/article/details/106584904