一.引言
给定一个数据集,划分方式一般有两种:
1.把整个数据集划分成训练集和测试集。
2.把整个数据集划分成为训练集、验证集和测试集(一般的比例是6:2:2,参考NG《ML》)。其中训练集用于训练出模型的参数(除超参数外的惨呼),验证集用于模型优化,即寻找最优的超参数,测试集用于评估最终模型的泛化性能。
一般而言,方式2的数据划分方式是最理想的情况,它能在训练模型的同时对模型进行调优。而方式1的划分方式,很难进行调参;如果根据测试集进行调参的话,就无法评估模型的泛化能力了。所以,一定尽可能的采用方式2。
然而,在实际情况中,有时数据量并不够充足,这时如果采用方式2来进行数据划分的话,可能会导致训练集数量过少,从而导致训练出的模型过拟合。此时就可以考虑对训练集进行交叉验证了,即把数据集划分成训练集和测试集,然后对训练集进行交叉验证。(注:无论是方式1还是方式2,亦或采用交叉验证,都需要划分出训练集和测试集)
二.交叉验证的定义(此处指的是K折交叉验证)
交叉验证,指的是把初始的数据集进行分组,一部分做为训练集来训练模型,另一部分做为验证集来评价模型。对于K折交叉验证的话,先将数据集D随机划分成k个大小相同的互斥子集,对于每个子集,尽可能保持数据分布的一致性(正负比例在训练集和验证集中相同);然后,每次用k - 1个子集的并集作为训练集,剩下的那个子集作为验证集,这样就获得了K组训练/验证集,从而可以进行K次训练和验证,此时给你一些模型性能的指标(如:准确率),最终的返回的是K个测试结果的均值,即整体的性能度量。(即对于一组模型参数,它对应K组数据有K个结果,取K组结果的平均值作为这组参数的结果,以此来选出最优参数)
三.为什么要使用交叉验证法?
- 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
- 还可以从有限的数据中获取尽可能多的有效信息,即尽可能多的利用数据集的信息。
- 但是需要注意的一点是,交叉验证只是对训练集的进一步有效利用,它并不能体现出模型的泛化能力,最终还是要通过未使用过的数据(测试集)来体现它的泛化能力。
四.交叉验证法的作用
1.可用于模型调参
最典型的应用就是sklearn.grid_search库中的GridSearchCV类,不过此处它使用的是GridSearch算法来进行超参数的组合,并用交叉验证来评估超参数的组合的性能。最终选择交叉验证效果最好的那组超参数作为最终的参数。
不过这里有几点需要注意一下:
(1)交叉验证在此处仅仅是起一个性能评估的作用,实际的调参算法还是GridSearch。
(2)GridSearch算法(即"网格搜索")和穷举法类似,相当于遍历一遍所有可能的组合,最后返回最优的那个组合。“网格搜索”的方法很直观但是看起来有些原始。事实上有许多高级的算法,比如可以使用一些近似算法或启发式的搜索来降低复杂度。但是我们倾向于使用“网格搜索”这一简单的方法。
(3)除了GridSearch外,也可以设定一个范围,利用for循环遍历范围中的所有取值,进行手动进行调参。
2.可用于评估模型
根据交叉验证法的特性,K折交叉验证法在训练的过程中可以采用不同的模型,所以根据最后测试集结果的平均值就可以粗略的判断模型的好坏。
3.可用于特征的选择
其基本的原理,也是基于多种特组合,选择交叉验证效果最好的那一组作为最终的特征集。
关于交叉验证在调参、评估模型和特征选择中具体的实现,可以参考:https://blog.csdn.net/jasonding1354/article/details/50562513
================================================================总结===========================================================================
交叉验证的核心在于它能够充分利用数据集中的信息,它相当于利用整个训练集完成模型训练和模型优化(调参)这两个任务。当然了,并不是只有当数据量不充足的时候再利用交叉验证,想进一步提升模型性能的话或者进一步挖掘数据信息的话,也可以使用交叉验证法。
并且交叉验证法的结果往往比单纯的方式2的效果更好,但是训练的代价更大,更耗时。
参考:https://www.cnblogs.com/wei-li/archive/2011/12/01/2270244.html
https://blog.csdn.net/u014248127/article/details/78899195