目录:
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 留一法(Leave-One-Out,LOO)
- 自助法(bootstrapping)
- 总结
前提:
总数据集D,数据集大小为n;
训练集S;
测试集T。
1、留出法(hold-out)
直接将数据集D分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T,即$D=S \cup T,S \cap T= \varnothing $,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
需要注意:
- 训练集和测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响
实际上,实验中无法保证数据划分时可以保持分布的一致性,什么叫划分时保证了分布的一致性呢?如图所示,假设总数据集的分布如下图所示:
如果数据采样得到的是红点,则采样保持了数据分布的一致性(采样数据保持了原始数据的分布),如果采样数据是绿点,那么就没有保持原始数据的分布,我们当然希望抽样时能抽到红点类似的分布,但即使是随机抽样,也是有可能不幸的抽到绿点类似的分布。
一般的解决办法是进行若干次的随机划分,重复进行实验评估后取平均值作为留出法的评估结果(概率上而言不大可能100次都抽到绿点类似的分布,抽到红点类似分布才是常规情况)。
- 划分时样本的顺序不同,也会得到不一样的结果
如果划分的结果是前多少个数据(S)和后多少个数据(T),或者是其他的某种划分方式,实验后得到的评估结果也会不一样。
所以一般会对数据集打乱顺序再进行采样。
- 如何确定训练集和测试集的大小呢?训练集 / 测试集窘境
我们希望评估的是用D训练出的模型的性能,但留出法需要一部分数据作为测试数据,不进行模型的训练,这样的话,就出现了训练集 / 测试集窘境:
-
- 若令S很大,则训练的模型更加接近D训练的模型,但是此时T比较小,评估结果可能不够稳定准确;
- 若令T较大,虽说评估结果更稳定了,但是训练出来的模型和D训练的模型的差别就变大了;
2、交叉验证法(cross validation)
交叉验证法将数据集分成K个互斥的大小相似的子集,每个子集$D_i$尽可能保证数据的一致性(可以通过分层抽样得到);然后每次用K-1个子集作为训练集,剩下的作为测试集;这样就可以得到K组训练集 / 测试集了,从而可以进行K次训练和测试,得到K个模型和评估结果,最终的结果是这K个评估结果的均值。
根据K的不同,称为K折交叉验证,最常用的K是10,另外还有5和20也比较常用。以下为10折交叉验证的示意图:
交叉验证法中抽取了K个大小相似的数据分布接近的互斥数据集,这样就尽可能的规避了在留出法中依赖数据划分的问题。
3、留一法(Leave-One-Out,LOO)
留一法是交叉验证的一种极端的情况,每次只留一个数据作为测试,用n-1(n为总的数据集的数目)个数据作为训练集,训练n次,得到n个模型和评估结果,最终结果是这n和结果的均值。
- 留一法中实际被评估的模型(S(n-1个数据)训练出来的模型)和期望被评估的模型(D训练出来的模型)非常的接近(因为只少了一个数据),因此,留一法的结果往往被认为比较准确
- 留一法在训练数据集比较大时,计算的开销是非常大的(比如100万个数据,就要训练100万个模型(未考虑调参时))
- 留一法的估计结果也未必永远比其他评估方法准确(根据没有免费的午餐定理)
注:
没有免费的午餐定理:所有的算法的性能的期望都是一样的!
4、自助法(bootstrapping)
在留出法和交叉验证法中,留出了一部分数据做测试集,不参与训练,这样实际评估模型所使用的数据集比D小,这样必然会引入因训练样本规模不同造成的估计偏差,留一法虽然受训练样本规模的影响小,但是计算成本太大。
自助法以自助采样法为基础:从D中有放回的抽取n次样本,得到D'(D'中n个样本有重复),可以证明,D中有大约36.8%的样本没有出现在D'中,用D'作为训练集,D-D'作为测试集,这样既有n个训练集,规避了训练数据集规模不同造成的误差,又有不同与训练数据的数据作为测试集。
- 自助法在数据量小,难以有效的划分训练 / 测试集时很有用
- 自助法能从初始数据集中产生多个不同的数据集,这对集成学习等方法有很大的好处
- 自助法改变了原始数据集的分布,这会引入估计偏差,因此,在数据量足够大时,留出法和交叉验证法更常用
5、总结
- 如何抉择交叉验证法和留出法?
交叉验证法无疑比留出法更加的耗时,在数据量比较大的时候,一般而言,留出法就足够了,不需要用交叉验证法,但是数据量的大小如何去评估也是个问题。一般而言,我们可以将交叉验证法和留出法得到的结果进行比对,如果它们的值差别不大,那就没有必要用交叉验证了,直接用留出法就好了。