本文原载于微调的知乎专栏「数据说」。
交叉验证(cross validation)一般被用于评估一个机器学习模型的表现。更多的情况下,我们也用交叉验证来进行模型选择(model selection)。往远了说,交叉验证可以用于评估任何过程,但本文仅讨论机器学习评估这个特定领域。
交叉验证有很长的历史,但交叉验证的研究有不少待解决的问题。拿最简单的K折交叉验证来说,如何选择K就是一个很有意思的话题。而更有意思的是,交叉验证往往被用于决定其他算法中的参数,如决定K近邻算法中K的取值。因此我们必须首先决定K折交叉验证中的K。
K折交叉验证(K-fold cross validation)指的是把训练数据D 分为 K份,用其中的(K-1)份训练模型,把剩余的1份数据用于评估模型的质量。将这个过程在K份数据上依次循环,并对得到的K个评估结果进行合并,如求平均或投票。如下图所示的10折交叉验证,训练数据D被分为 ,每次取其中9份数据作为训练集,1份作为测试集,最终将循环后所有的评估结果取平均。
10折交叉验证(图片来源: 周志华, 机器学习, 清华大学出版社, 2016)
1. 首先第一个问题,为什么要用交叉验证?
根本原因是我们的数据是有限的。当数据量不够大的时候,如果把所有的数据都用于训练模型容易导致模型过拟合。通过交叉验证对数据的划分+对评估结果的整合,我们可以“有效”的降低模型选择中的方差。换句话说,我们期望模型在训练集的多个子数据集上表现良好,这胜过单单在整个训练数据集上表现良好。简单来说,交叉验证也可以用方差偏差分解的思路来看,从某个角度和集成学习及bootstrapping也有相似点。此处不再赘述,可以看知乎讨论[4]。
所以理论保障就是,使用了交叉验证,模型方差“应该”降低了。首先在理想情况下,我们认为K折交叉验证可以 O(1/k) 的效率降低模型的方差,从而提高模型的泛化能力,但实际情况并不是这样。主要问题在于我们所得到K折数据之间并非独立,而存在相关性。因此实际情况下,K折交叉验证到底能降低多少方差还不确定,同时带来的偏差上升有多少也还存疑。
2. K到底该取多少?或者说,为什么大部分人都说要取10?
交叉的折数(fold)取多少一直没有准确的答案。往大了说这是个历史遗留问题,10这个数字也就被一直沿用了下来[2]。一般有两种流行的取值:(i) K=10 (ii) K=n,n指的是训练数据的总数,这种方法也叫做留一法(LOOCV)。
让我们思考交叉验证的两种极端情况:
完全不使用交叉验证是一种极端情况,即K=1。在这个时候,所以数据都被用于训练,模型很容易出现过拟合,因此容易是低偏差、高方差(low bias and high variance)。
留一法是K折的另一种极端情况,即K=n。随着K值的不断升高,单一模型评估时的方差逐渐加大而偏差减小。但从总体模型角度来看,反而是偏差升高了而方差降低了。
所以当K值在1到n之间的游走,可以理解为一种方差和偏差妥协的结果。以K=10为例,在训练时我们的训练集数量仅为训练数据的90%。对比不使用交叉验证的情况,这会使得偏差上升,但对于结果的平均又会降低模型方差,最终结果是否变好取决于两者之间的变化程度。而这种直觉上的解释,并不总是有效。如Hastie曾通过实验证明 K折交叉验证比留一法的方差更小[1],这和我们上面的结论不一样。
另一个值得一提的看法是,交叉验证需要思考场景,而不是普适的。其中关系最大的就是评估模型的稳定性。在2015年的一项研究中,作者发现留一法有最好或者接近最好的结果[2],在他们的实验中 K=10和K=5的效果都远不如留一法或者K=20。
对于稳定模型来说,留一法的结果较为统一,值得信赖。对于不稳定模型,留一法往往比K折更为有效[2]。换句话说,那就是留一法结果较为可靠。
3. 那么是否K的取值越大越好?
不一定,首先要考虑的是计算的开销。当数据量较大时,使用留一法的计算开销远远超过了我们的承受能力,需要谨慎对待。2017年的一项研究给出了另一种经验式的选择方法[3],作者建议 且保证 ,此处的n代表了数据量,d代表了特征数。感兴趣的朋友可以对照论文进一步了解。
这篇文章的目的不是为了说明K到底该取什么值,而只是为了再次讨论K值其实还是一种方差和偏差之间妥协。K=10或者5并不能给与我们绝对的保障,这还要结合所使用的模型来看。当模型稳定性较低时,增大K的取值可以给出更好的结果。
但从实验角度来看,较大的K值也不一定就能给出更小的方差[2],一切都需要具体情况具体讨论。相对而言,较大的K值的交叉验证结果倾向于更好。但同时也要考虑较大K值的计算开销。
另一个交叉验证需要关注的点是,当你的数据集太小时,较小的K值会导致可用于建模的数据量太小,所以小数据集的交叉验证结果需要格外注意。建议选择较大的K值。
所以总结来看,交叉验证还是一个比较复杂的过程,与模型稳定性,数据集大小等都息息相关。K=10的10折交叉验证不是万灵药,也不是万无一失的真理,但不失为一个良好的尝试。如果计算能力允许,增大K值或许更为保险。
[1] Krstajic, D., Buturovic, L.J., Leahy, D.E. and Thomas, S., 2014. Cross-validation pitfalls when selecting and assessing regression and classification models. Journal of cheminformatics, 6(1), p.10.
[2] Zhang, Y. and Yang, Y., 2015. Cross-validation for selecting a model selection procedure. Journal of Econometrics, 187(1), pp.95-112.
[3] Jung, Y., 2017. Multiple predicting K-fold cross-validation for model selection. Journal of Nonparametric Statistics, pp.1-19.
[4] 偏差和方差有什么区别?