【K折交叉验证】采用合理的K折,告别经验取值,可提升模型性能
引言
想必做机器学习的,都不同程度的用过交叉验证(cross validation),通常使用交叉验证评估一个机器学习模型的表现。交叉验证有很长的历史,但交叉验证的研究有不少待解决的问题。就交叉验证的K值选取来讲,可能一部分人不加思考,只是泛泛的使用常规的10折,也可能一部分人思考过,但仍然会困惑。那么K值取多少合适呢?
10折交叉验证(图片来源: 周志华, 机器学习, 清华大学出版社, 2016)
一、K折交叉验证的实际目的
既然讨论K值的选取,交叉验证的概念就不再赘述,但必须清楚为什么要用交叉验证。
1、根本原因:数据有限,单一的把数据都用来训练模型,容易导致过拟合。
(反过来,如果数据足够多,完全可以不使用交叉验证)
2、理论上:使用了交叉验证,模型方差“应该”降低了。
在理想情况下,我们认为K折交叉验证可以 的效率降低模型的方差,从而提高模型的泛化能力,通俗地说,我们期望模型在训练集的多个子数据集上表现良好,要胜过单单在整个训练数据集上表现良好。(但实际上,由于我们所得到K折数据之间并非独立而存在相关性,K折交叉验证到底能降低多少方差还不确定,同时带来的偏差上升有多少也还存疑。)
3、从方差偏差分解的思路来看交叉验证
让我们思考交叉验证的两种极端情况:
- 完全不使用交叉验证是一种极端情况,即K=1。在这个时候,所以数据都被用于训练,模型很容易出现过拟合,因此容易是低偏差、高方差(low bias and high variance)。
- 留一法是K折的另一种极端情况,即K=n。随着K值的不断升高,单一模型评估时的方差逐渐加大而偏差减小。但从总体模型角度来看,反而是偏差升高了而方差降低了。
所以当K值在1到n之间的游走,可以理解为一种方差和偏差妥协的结果。以K=10为例,在训练时我们的训练集数量仅为训练数据的90%。对比不使用交叉验证的情况,这会使得偏差上升,但对于结果的平均又会降低模型方差,最终结果是否变好取决于两者之间的变化程度。 (而这种直觉上的解释,并不总是有效。如Hastie曾通过实验证明 K折交叉验证比留一法的方差更小,这和我们上面的结论不一样。)
另一个值得一提的看法是,交叉验证需要思考场景,而不是普适的。其中关系最大的就是评估模型的稳定性。在2015年的一项研究中,作者发现留一法有最好或者接近最好的结果[2],在他们的实验中 K=10和K=5的效果都远不如留一法或者K=20。
二. K到底该取多少?为什么大部分人都要取10?
由于实际情况中,交叉的折数(fold)受很多因素的影响,所以K值取多少也没能给出准确的答案。10作为做一种经验值也就被无脑地延续使用。一般有两种流行的取值:(i) K=10 (ii) K=n,n指的是训练数据的总数,这种方法也叫做留一法(LOOCV)。
1、对于稳定模型来说,留一法的结果较为统一,值得信赖。对于不稳定模型,留一法往往比K折更为有效。
2、模型稳定性较低时,增大K的取值可以给出更好的结果,但是要考虑计算的开销。
3、2017年的一项研究给出了另一种经验式的选择方法,作者建议 且保证
,n代表了数据量,d代表了特征数。感兴趣的朋友可以对照论文进一步了解。
总结
1、使用交叉验证的根本原因是数据集太小,而较小的K值会导致可用于建模的数据量太小,所以小数据集的交叉验证结果需要格外注意。建议选择较大的K值。
1、这篇文章的目的不是为了说明K到底该取什么值,而只是为了讨论K值其实还是一种方差和偏差之间妥协。K=10或者5并不能给与我们绝对的保障,这还要结合所使用的模型来看。当模型稳定性较低时,增大K的取值可以给出更好的结果。
2、但从实验角度来看,较大的K值也不一定就能给出更小的方差,一切都需要具体情况具体讨论。相对而言,较大的K值的交叉验证结果倾向于更好。但同时也要考虑较大K值的计算开销。
所以总结来看,交叉验证还是一个比较复杂的过程,与模型稳定性,数据集大小等都息息相关。K=10的10折交叉验证不是万灵药,也不是万无一失的真理,但不失为一个良好的尝试。如果计算能力允许,增大K值或许更为保险。
###欢迎加入全网音频视频课程共享群群,和各领域大佬一起讨论学习知识####