[转载]「交叉验证」到底如何选择K值?

「交叉验证」到底如何选择K值?

原文链接:https://cloud.tencent.com/developer/article/1410946
交叉验证(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折交叉验证可以 的效率降低模型的方差,从而提高模型的泛化能力,但实际情况并不是这样。主要问题在于我们所得到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值或许更为保险。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值