偶然看到知乎上有人讨论这个问题,粗略看了一下各种各样所谓"大神"的解答,以及评论区里的各种见解,着实把一个很简单的概念给绕懵了,自己都差点被带进去。
K Fold基本原理:
下图来源自Youtube,李飞飞老师课程视频1

将原始数据分为N份,每次让模型在N-1份数据上训练,剩下1份上验证。最后把N次验证的分数取平均,来尽可能客观地评价模型算法的性能,从而达到所谓的“尽可能充分利用数据”的目的。
所以,k fold本来就是侧重于验证,而不是选择! (这点很多初学者都误解了,那些很多某乎的“大神”也是),并且k fold一般只有在现有数据量少的情况下才会用,一般数据量足够我们不会去使用!
为什么要用K Fold?
首先,在数据量较少的情况下,模型算法最可能出现的问题是under fitting。这种情况下,我们当然希望有越多数据train越好啊,(承接之前的把数据分为N份的setting) 我们巴不得把N份数据全部都用来train是不是? 无奈的是我们需要调参,必须评价模型的性能,所以只能不得已留出一小部分数据进行test。那么问题来了,本来数据总量就少,那么我们留出来的这一小部分数据的量不就是更加少得可怜?而那么一点点数据量来进行test,很有可能会面临很大的随机性,以至于这种情况下test获得的评估不够客观!
所以,这才有了k fold。既然一份test的评估结果不够客观,随机性大,那么就进行N次实验。虽然每次都是一点点的test数据进行评估,但是最后把N份评估取平均,最大程度上保证评估的客观和稳定(可以理解为把所有数据都用来进行了模型的评估)。
得益于此,我们也可以尽可能多地将大部分数据用来训练,而不用担心留下的test数据太少了(可以理解为尽可能多地把数据用来进行了模型的训练)。
把上面两句橘黄色的字结合在一起:充分地利用了数据!
这里举个一种最极端例子:leave-one-out cross validation
例如,现在有100条带标注的样本,把它分成100条。每次训练的时候,取其中99条样本训练,剩下1条样本测试。然后重复100次,汇报100次测试结果的平均值。
-
思考一下,这样做的好处是什么?
首先,99/100的样本都参与了训练,标注数据被充分地用作了训练;其次,100条样本,每一条都参与了最终的评估,标注数据也被全部用作了测试。所以,100条数据,既被用作了训练集,又被用作了测试集。 -
但是坏处呢?
你重复训练了100个模型,开销和时间极大!
从上面这个例子,我们可以发现,交叉验证需要付出一定代价。虽然划分的样本越多,数据被利用地越充分,但随之需要消耗更多的时间和训练成本。
这也就是为什么一般数据量足够的情况下,我们不会用K Fold了,没必要啊…,随便你咋划分train和test(只要比例系数合理),训练也足够拟合,测试也足够客观,何必用K Fold? 浪费时间啊!
为什么说K Fold是侧重验证,而不是选择?
一些人误解了 "K Fold是用来充分利用数据 “这句话 ,认为所谓的"充分利用”,是指通过K Fold交叉验证的这N次评估,帮助选择评估效果最好的一个模型,从此认为K Fold的目的是侧重于选择。
个人持完全反对意见!总结以下两点理由:
- 随机性大。正如之前所述,K Fold本就是用于数据量较少的情况,这种情况下,凭借N次实验的评估结果,选择一个N次之中评估效果最好的模型,这本来就是具有非常大的巧合性和随机性的!换句话,通过这种方式"选"出来效果最"好"的模型,放到真实场景下有可能效果非常差!因此,若使用K Fold来帮助你"选"模型,只可能让少数据下的问题变得更加严重!(因为K Fold本意就不是用来选择的啊)
- 治标不治本。别忘了,数据量少的情况下,就算你把N份数据全部用来训练都有可能under fitting,更别指望通过K Fold帮你"选"出来的模型能够有多好的性能了…交叉验证说到底只是一种缓解数据量不够的办法。如之前所述,K Fold聚焦于更客观地验证模型,而正因为没有"验证不够客观"的压力, 你就能尽可能多地腾出一些数据进行训练,来尽可能缓解under fitting。总而言之,想要借助K Fold"挑"出"高性能"的模型,好比鸡蛋里挑骨头,无中生有。顶多是自欺欺人罢了。
正常的K Fold步骤
那有人会问,K Fold的K个模型,每个模型的评估都是有随机性,既然没办法"选"模型,那我咋知道最后到底把哪个模型的真实性能最好呢?
一般而言,有两种策略:
- 在利用交叉验证之后,将这K份数据,全部都用来训练,得到一个最终的模型,运行上线。
- 在利用交叉验证之后,把这K个模型直接上线运行(预测的时候,K个模型投票)。
理论上来讲,我们会倾向于选用第二种。因为有研究证明,多个欠优化模型的投票结果,比一个较优模型的预测结果,要来的更准确。即,三个臭皮匠,顶个诸葛亮。很多传统机器学习算法,如随机森林,ensemble model集成模型,都是这种思想的代表。
总结K Fold的一般步骤2:
- 将原始数据划分为N份 (注意权衡数据利用率和开销,即
N不宜过大和过小,一般5或10) - 顺序地进行N次实验,每次把1份数据当做验证集,剩下N-1份全部用来从头训练模型。获得算法的N个评估值。
- 将N个评估取平均值,以此得到一个较为客观的模型算法性能评价,公开汇报(e.g., 甲方)。
- 模型正式上线。可以将N份数据全部用来训练,获得一个最终的模型;也可以把N个模型进行集成。
结合Andrew机器学习以及FeiFeiLi课程的理解,如有谬误请及时指正!
参考:
- [1] 李飞飞计算机视觉课程
- [2]吴恩达机器学习视频课程
2万+

被折叠的 条评论
为什么被折叠?



