关于K fold交叉验证

偶然看到知乎上有人讨论这个问题,粗略看了一下各种各样所谓"大神"的解答,以及评论区里的各种见解,着实把一个很简单的概念给绕懵了,自己都差点被带进去。

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的目的是侧重于选择。

个人持完全反对意见!总结以下两点理由:

  1. 随机性大。正如之前所述,K Fold本就是用于数据量较少的情况,这种情况下,凭借N次实验的评估结果,选择一个N次之中评估效果最好的模型,这本来就是具有非常大的巧合性和随机性的!换句话,通过这种方式"选"出来效果最"好"的模型,放到真实场景下有可能效果非常差!因此,若使用K Fold来帮助你"选"模型,只可能让少数据下的问题变得更加严重!(因为K Fold本意就不是用来选择的啊)
  2. 治标不治本。别忘了,数据量少的情况下,就算你把N份数据全部用来训练都有可能under fitting,更别指望通过K Fold帮你"选"出来的模型能够有多好的性能了…交叉验证说到底只是一种缓解数据量不够的办法。如之前所述,K Fold聚焦于更客观地验证模型,而正因为没有"验证不够客观"的压力, 你就能尽可能多地腾出一些数据进行训练,来尽可能缓解under fitting。总而言之,想要借助K Fold"挑"出"高性能"的模型,好比鸡蛋里挑骨头,无中生有。顶多是自欺欺人罢了。

正常的K Fold步骤

那有人会问,K Fold的K个模型,每个模型的评估都是有随机性,既然没办法"选"模型,那我咋知道最后到底把哪个模型的真实性能最好呢?

一般而言,有两种策略:

  1. 在利用交叉验证之后,将这K份数据,全部都用来训练,得到一个最终的模型,运行上线。
  2. 在利用交叉验证之后,把这K个模型直接上线运行(预测的时候,K个模型投票)。

理论上来讲,我们会倾向于选用第二种。因为有研究证明,多个欠优化模型的投票结果,比一个较优模型的预测结果,要来的更准确。即,三个臭皮匠,顶个诸葛亮。很多传统机器学习算法,如随机森林,ensemble model集成模型,都是这种思想的代表。


总结K Fold的一般步骤2

  1. 将原始数据划分为N份 (注意权衡数据利用率和开销,即N不宜过大和过小,一般5或10
  2. 顺序地进行N次实验,每次把1份数据当做验证集,剩下N-1份全部用来从头训练模型。获得算法的N个评估值。
  3. 将N个评估取平均值,以此得到一个较为客观的模型算法性能评价,公开汇报(e.g., 甲方)。
  4. 模型正式上线。可以将N份数据全部用来训练,获得一个最终的模型;也可以把N个模型进行集成。

结合Andrew机器学习以及FeiFeiLi课程的理解,如有谬误请及时指正!

参考:

LOO策略是指Leave One Out Cross Validation,它是一种K-fold交叉验证的方法,其中K的取值等于数据集的行数n。在LOOCV中,每次只留下一个样本作为验证集,其余的样本作为训练集,然后重复这个过程n次,每次都选择不同的样本作为验证集。最后,将n次验证的结果取平均作为模型的性能指标。\[2\] LOOCV的优点是可以充分利用数据集中的每个样本进行验证,因为每个样本都会被作为验证集一次。这样可以更准确地评估模型的性能。然而,LOOCV的缺点是计算成本较高,因为需要重复n次训练和验证的过程。特别是当数据集较大时,计算时间会显著增加。\[2\] 总结来说,LOOCV是一种较为准确但计算成本较高的交叉验证方法,适用于数据集较小的情况下。它可以帮助我们评估模型的性能,并选择最佳的模型。 #### 引用[.reference_title] - *1* *2* [三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)](https://blog.csdn.net/qq_36333576/article/details/124108974)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [交叉验证(Cross-Validation)](https://blog.csdn.net/JavaChaoCo/article/details/50957685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值