之前的文章中写过,我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择。
为此,需使用一个“测试集"(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测
试误差”(testing error)作为泛化误差的近似。通常我们假设测试样本也是从样本真实分布中独立同
分布采样而得。但需注意的是,测试集应该尽可能与训练集互斥。
互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。
测试样本为什么要尽可能不出现在训练集中呢?为理解这一点,不妨考虑这样一个场景:
老师出了10道习题供同学们练习,考试时老师又用同样的这10道题作为试题,这个考试成绩能否
有效反映出同学们学得好不好呢?
答案是否定的,可能有的同学只会做这10道题却能得高分。
回到我们的问题上来,我们希望得到泛化性能强的模型,好比是希望同学们对课程学得很好、获得
了对所学知识“举一反三"的能力;训练样本相当于给同学们练习的习题,测试过程则相当于考试。
显然,若测试样本被用作训练了,则得到的将是过于“乐观”的估计结果。
可是,我们只有一个包含个样例的数据集
既要训练,又要测试,怎样才能做到呢?答案是:通过对D进行适当的处理,从中产生出训练集
S和测试集T。
下面我们一起总结一下几种常见的做法:留出法、交叉验证法、自助法
1. 留出法
“留出法”(hold-ou)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为
测试集T,即。在S上训练出模型后,用T来评估其测试误差,作为对
泛化误差的估计。大家在使用的过程中,需注意的是,训练/测试集的划分要尽可能保持数据分布
的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要
保持样本的类别比例相似。如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比
例的采样方式通常称为“分层采样"(stratified sampling)。
例如通过对D进行分层样而获得含70%样本的训练集S和含30%样本的测试集T。
若D包含500个正例、500个反