首先需要知道的是,机器学习想要能够解决业务中的问题,简单可以分为两个阶段:离线和线上(离线指的是模型未部署到生产环境之前,线上是指模型部署到生产环境之后)。在离线阶段,首先需要先训练一个模型,然后对训练好的模型进行离线评估来了解下模型的性能情况。
留出法(hold-out)是指将数据集D划分成两份互斥的数据集,一份作为训练集S,一份作为测试集T,在S上训练模型,在T上评估模型效果。
留出法的优点是简单好实现,但是也会有一些明显的缺点。比如说划分后的训练集和测试集的大小会严重影响模型最终的评估结果。如果说训练集S比较大,测试集T比较小,那么评估结果的不够稳定准确,可信度较低;如果说训练集S比较小,测试集T比较大,那么得到的模型很可能与全量数据集D得到的模型有很大的差别,这就降低了评估结果的真实性。通常的做法是,将全量数据集的2/3~4/5的样本作为训练集,剩余样本作为测试集。
除了划分得到的训练集S和测试集T的数据量会影响评估结果外,它们的数据分布也会影响评估结果,尽量保证训练集S和测试集T的数据分布一致,避免由于数据划分引入额外的偏差而对最终结果产生影响。举个具体的例子来说明,有一个包含了1500条正样本和1500条负样本的数据集,现在使用二分类模型来进行自动分类,假设将1/3的数据作为测试集,应该使得测试集正负样本均在500条左右;如果测试集由50条正样本和950条负样本组成,那么评估结果将会因为样本分布差异而导致很大的偏差。
因此,考虑到单次留出法的结果往往不够稳定可靠,我们一般会进行多次留出法实验,每次随机划分,最终将多次得到的实验结论进行平均。
但是在实际工作中,如果不分场景,任何时候都是用随机划分数据集可能会导致一些其他的问题,比如说数据泄露(穿越问题)等。
很明显,交叉验证评估结果的稳定性和保真性在很大程度上取决于k值的大小,所以交叉验证也叫做k折交叉验证(k-foldcrossvalidation)。k常用的取值有5、10和20。
假定数据集D中包含了m个样本,若令k=m,则得到了交叉验证法中的一个特例:留一法(leave-one-out,简称LOO)。留一法的优缺点都很明显。训练m个模型,每个模型基本上用到了全部的数据,得到的模型与全部数据集D得到的模型更接近,并且不再受随机样本划分方式的影响。但是当样本太多时,即m很大时,计算成本非常高。
由于存在不平衡分类问题(分类问题中样本里包含的标签的数量失衡,比如二分类中样本量包含的正负样本比例为10:1),基于此,存在一种叫做分层k折交叉验证法(stratified-k-fold)。这种方法对每个类别进行k折划分,使得每份数据子集中各类别的数据分布与完整数据集分布相一致。比如二分类中进行分层5折交叉验证,正样本有300条,负样本有30条,将数据划分成5分,并且每份数据中有60条正样本,6条负样本。
自助法(bootstrapping)以自主采样(bootstrapsampling)为基础,使用有放回的重复采样的方式进行训练集、测试集的构建。比如为了构建m条样本的训练集,每次从数据集D中采样放入训练集,然后有放回重新采样,重复m次得到m条样本的训练集,然后将将没有出现过的样本作为测试集。
这也就意味着,当数据量很大时,大约有36.8%的样本不会出现在训练集中,也就是这些样本都会作为测试集。
留出法和交叉验证法在训练模型时用的数据都只是整个数据集D的一个自己,得到的模型会因为训练集大小不一致导致一定的偏差。而自助法能够更好地解决这个问题。但自助法改变了初始数据集的分布,会引入估计偏差,所以在数据量足够时,一般采用留出法和交叉验证法。
参考:
[1]周志华.机器学习.第二章第二节(评估方法)[2]美团算法团队.美团机器学习实战.第一章第三节(交叉验证)