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

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课程的理解,如有谬误请及时指正!

参考:

  • [1] 李飞飞计算机视觉课程
  • [2]吴恩达机器学习视频课程

关于K fold交叉验证相关推荐

  1. 【Python-ML】SKlearn库Pipeline工作流和K折交叉验证

    # -*- coding: utf-8 -*- ''' Created on 2018年1月18日 @author: Jason.F @summary: Pipeline,流水线工作流,串联模型拟合. ...

  2. K折交叉验证(StratifiedKFold与KFold比较)

    文章目录 一.交叉验证 二.K折交叉验证 KFold()方法 StratifiedKFold()方法 一.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训 ...

  3. k折交叉验证优缺点_R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)...

    作者:Leihua Ye, UC Santa Barbara 翻译:陈超 校对:冯羽 本文约2300字,建议阅读10分钟 本文介绍了一种针对初学者的K临近算法在R语言中的实现方法. 本文呈现了一种在R ...

  4. Kaggle上分技巧——单模K折交叉验证训练+多模型融合

    一.K折交叉验证训练单个模型 1.1 k 折交叉验证(K-Fold Cross Validation)原理 通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感, ...

  5. K折交叉验证K-CV与StratifiedKFold

    1. K折交叉验证 K-fold Cross Validation,记为K-CV KFold 将所有的样例划分为 k 个组,称为折叠 (fold) ,每组数据都具有相同的大小.每一次分割会将其中的 K ...

  6. Pytorch最简单的图像分类——K折交叉验证处理小型鸟类数据集分类2.0版本ing

    https://blog.csdn.net/hb_learing/article/details/110411532 https://blog.csdn.net/Pl_Sun/article/deta ...

  7. 【Kaggle比赛常用trick】K折交叉验证、TTA

    一.什么是k折交叉验证? 在训练阶段,我们一般不会使用全部的数据进行训练,而是采用交叉验证的方式来训练.交叉验证(Cross Validation,CV)是机器学习模型的重要环节之一.它可以增强随机性 ...

  8. 在Mnist数据上使用k折交叉验证训练,pytorch代码到底怎么写

    前言 最近学到了K折交叉验证,已经迫不及待去实验一下他的效果是不是如老师讲的一样好,特此写下本文. 本文运行环境为:sklearn.pytorch .jupyter notebook k折交叉验证介绍 ...

  9. k折交叉验证(原理+python实现)

    交叉验证用于数据集的数据量不充足情况,将数据集分成训练集.验证集.测试集. k折交叉验证,将数据集先分为训练集与测试集,再把训练集分成k份(大小相等).其中,k-1份作为训练集训练模型,剩下的1份作为 ...

  10. 机器学习基础|K折交叉验证与超参数搜索

    文章目录 交叉验证 交叉验证的概念 K的取值 为什么要用K折交叉验证 Sklearn交叉验证API 超参数搜索 超参数的概念 超参数搜索的概念 超参数搜索的原理 Sklearn超参数搜索API 实例 ...

最新文章

  1. springboot thymeleaf 生成静态html
  2. 【Python】青少年蓝桥杯_每日一题_3.05_排列组合
  3. python和mt4的区别_MT4和MT5有什么区别?
  4. 思科为其核心网络业务增加了订阅服务
  5. 【转载】JS获取浏览器版本信息
  6. 201671010433 | 词频统计软件项目报告
  7. 软件测试人员必备的60个测试工具清单,果断收藏了!
  8. php 显示探针_php 探针
  9. 【信号与系统实验】实验四 傅里叶变换、系统的频域分析
  10. 还在使用Window原始的CMD界面?教你一招进行界面完美优化
  11. CentOS利用WebHook实现PHP自动部署Git代码
  12. 这些华为技巧,花粉都不一定全知道
  13. [暑假]简单认识一下常用的字体 <<微软雅黑 黑体 和 宋体>>
  14. 观李永乐老师《双蛋问题》解题后感
  15. 怎么保存ppt到计算机,怎么把ppt保存到u盘
  16. 计算机里被删除的文件可以在哪里进行恢复,电脑里的文件夹不小心删除了找回来的方法...
  17. 使用iTunes与iTools导出微信聊天记录
  18. 香港之行——大学·精神·交通
  19. 揭秘蓝牙定位技术,实现精准室内导航
  20. Intel Quiet System Technology (QST) Support In ...

热门文章

  1. CSU 1681 Adjoin(树形dp 树的直径)
  2. P1894 [USACO4.2]完美的牛栏The Perfect Stall
  3. 使用C++实现n阶行列式的计算
  4. 计算机一级打字要注意什么,用键盘打字时要注意什么 怎样用键盘来练习打字...
  5. 2010年6月3日晚18点23分
  6. 将uniapp打包成安卓APP
  7. unity3D用鼠标和射线控制物体移动(二)
  8. android客户端同php服务端进行XML/JSON通信
  9. dnf时装补丁教程_DNF时装补丁修改教程
  10. regedit 命令行参数