野路子码农系列(6)有关线下验证集选取的思考

最近周围的小伙伴们都在玩kaggle上进行的IEEE-CIS,作为经常“地震”的时序题,关于如何选取验证集的讨论自然也不少。究竟如何选择一个靠谱的线下验证集?关于这个问题,我也思考过很多,现在将一些见解与大家分享,抛砖引玉。

首先,我们要知道选择验证集的意义是什么。在做表格题时,经常参加比赛的人可能会非常惯性地来套5CV,大力出奇迹,一发LGB,毁天又灭地。如果是时间序列类的,可能会找相似的一天或一段时间作为验证,其他时间段用来训练等等。很多时候这都是基于直觉或者习惯,并没有什么硬性的道理。但私以为事情并不是那么简单。

如果用考试来做比方的话,训练集就像我们用来学习的有答案的习题集。验证集像是一张模拟考卷,而测试集就是最终的大考。所以一般一个有效的验证集往往意味着这题已经成功了一半,而一个错误的验证集意味着南辕北辙。

对于大多数问题,我们通常会有个默认的假设,那就是训练数据与测试数据是满足独立同分布的(iid)。也就是说训练数据和测试数据是差不多的两张卷子,在数据量够大的情况下,我们可以随机拿一部分习题集用来学习,另一部分作为模拟卷用来试试自己的实力,由此演变而来的就是最常见的带shuffle的train_test_split和K-Fold(以及Stratified K-Fold)。

但并非所有的问题都可以这么简单粗暴,在选取验证集的时候,我们至少需要考虑3个问题:

(1)我们假设数据分布的相同是基于什么?

(2)我们希望模型通过训练学到什么信息?

(3)有什么是不能在训练中泄露给模型的(leakage)?

基于此3点,我们主要用3种不同的线下验证集的创建方法,分别是:

(1)带shuffle的K-Fold/Stratified K-Fold

(2)顺序切分(如时间序列在某个时间点切一刀)

(3)Group K-Fold

接下来分别说说个人对此的理解。

(1)带shuffle的K-Fold/Stratified K-Fold

假设某个学生巨多的年级我们抽了一批学生(测试集),想要了解他们的某科成绩。我们的假设是所有学生的成绩都服从一个正态分布,这些学生都是这同一个分布中抽样出来的。那么我们在剩下的学生中要分割训练集和测试集的话就很简单。我们会认为:

1) 所有的数据都来源于同一个分布;

2) 等量(足够大)但不同的抽样对模型能学到的信息没有太大影响;

3) 基本不存在信息泄露问题。

在这种情况下,我们会采用带shuffle的K-Fold,因为既然所有的数据都来源于同一个分布,那么学习我们采样的数据中的信息就能够估计到整个分布的信息。因此,我们用交叉验证(Cross Validation)就可以保证同分布的问题,而shuffle则代表我们抽样的随机性并不会很大程度地影响模型的学习,这种验证是非常有效的。在正负样本极端不平衡的情况下,我们需要使用Stratified K-Fold来保证正样本被模型学习到,从而避免某一折全是负样本的情况。

所以,我们再随机抽一批学生(最好与测试集等量)做验证集就行。

(2)顺序切分

假设我们有一群学生过去几周上课打瞌睡的数据,我们想要预测下周什么情况下他们会打瞌睡。我们的假设是学生每周的行为是稳定的,重复的(按周期重复)。但是在一周之内,他们每天的行为可能并不相同,比如周一会更困,而周五会更兴奋等等。我们会认为:

1)每个周期之间的分布是相同的(周与周),但每个周期内部的分布是不同的(天与天);

2)模型要学习一个完整周期内的信息(周一到周日);

3)跨周期的信息不应该泄露(本周与下周)。

在这种情况下,基于以上三点,我们一般会采用按时间切分,因为只有按时间切分能满足以上三个要求。

如果用带shuffle的K-Fold会怎么样呢?首先,我们不能保证模型能学习到一个完整周期内的所有信息。此外,即便数据量达到可以保证这一点,shuffle的存在会使得下一个周期的信息混入上一个周期,反之亦然,这就导致了泄露。模型在线下验证集上的得分会很高,但线上会差一截。因为这个“好成绩”是由于信息泄露导致的,而不是模型真的学习到了什么。

所以,我们可以选择保留最后一周作为验证集。

(3) Group K-Fold

假设有五个班级的学生,班级之间的水平参差不齐,给你一班、二班、三班、五班的一些历史信息,要你预测四班的学生下次考试的成绩。我们的假设是虽然五个班级的分布并不相同,但学霸考高分的模式总是相同的。

如果我们使用带shuffle的K-Fold会怎么样呢?假如一班平均实力特别强,而三班特别弱,我们会发现班级这个特征占的分量会很重,然而测试集的四班模型从来都没见过,这明显会导致过拟合,从而线下虚高,线上崩盘。这里就需要使用Group K-Fold了。

Group K-Fold比较难解释,也相对较新,早期的sklearn里似乎并没有这个功能。它让你可以指定某个或某些特征,并且保证这些特征的值不跨越每个Fold,也就是实现特征值的隔离。

举个例子,如果你指定班级来进行Group,那么所有一班相关的内容都出现在某个Fold中,而你在其他Fold中找不到任何关于一班的内容。也就是说,你把一班的信息隔离在了那个Fold里。

那么我们什么时候会需要Group K-Fold呢?当我们认为:

1)所有数据本身未必同分布(一班三班有差异),但其背后某种潜在的模式是一致的;

2)模型要学习对的是某种跨Group的内容或者模式(不局限于某个班级的);

3)不同Group之间的信息不应该泄露(一班与三班)

使用Group K-Fold将掩蔽用来进行Group的特征(班级),因为这个特征是无法被泛化的。而模型将学习的是跨越该特征的信息(挖掘学霸),这样的信息才是有价值的,可以被泛化的。

总而言之,线下验证集的选取并不是一件很随便的事情。它取决于数据本身的构成以及我们对数据所传达的信息的假设。所以,要保证线下验证集靠谱的话,我们还是要——多做EDA啊!

原文地址:https://www.cnblogs.com/silence-gtx/p/11600599.html

时间: 2024-10-07 09:08:17

野路子码农系列(6)有关线下验证集选取的思考的相关文章

野路子码农系列(2)Python中的类,可能是最通俗的解说

啥叫佩奇?啥叫类?啥叫面向对象?后面两个问题以前在大学里"祖传谭浩强"的时候我经常会有所疑问.老师说着一堆什么public, private,我都是一脸懵逼,啥叫私有?为啥要私有?然后就神游天外了-- 后来由于一直接触数据挖掘类的内容,写得那根本不是程序,都是脚本,而且基本上也用不到类这种东西.直到前几天,在一个项目中,我需要对8个分类分别应用同一个模型,我才又回想起了被类支配的恐惧.本文即劫后余生的产物,没有网络上哪些看到想吐的Foo, Bar,只有最通俗易懂的语言. P1 起因 正

【转载】技术的正宗与野路子

http://kb.cnblogs.com/page/554496/ http://zhangtielei.com/posts/blog-programmer-learn.html 黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. "九阴神抓"本是<九阴真经>中的上乘武功,但当初梅超风夫妇由于拿到的<九阴真经>不完整,学不到里面的内

将人工智能应用云开发中,“码农1号”要掀起IT界的一股浪潮

随着人工智能的高速发展,随处可见识AI技术在生活中的实践.手机中的siri,家庭中的智能音箱,在医疗诊断上进行智能病例处理,以计算机视觉为核心的城市智能安防系统,以及最近热议的无人驾驶. 最近有一款人工智能的新应用,在上线以后,就成为IT行业的关注焦点."码农1号",将AI技术应用到云开发中,在开发过程中,根据需求,机器可自动生成核心代码,只需前端工程师和设计师搭建好前端页面即可,无需再应用后端服务,就能轻松拥有开发中需要的各种后端能力. "码农1号"通过对软件应用

Java架构师之路:从Java码农到年薪八十万的架构师,最牛Java架构师进阶路线

从Java码农到年薪八十万的架构师,资深架构师大牛给予Java技术提升学习路线建议,如何成为一名资深Java架构师? 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择.架构师在一家公司有多重要.优秀架构师需要具备怎样的素质以及架构师的发展现状三个方面来分析 程序员如何才能晋升为优秀的高薪架构师? 希望通过本文让程序员们了解架构师的市场行情,了解架构师的发展前景,并帮助你更清晰地做出职业规划. 架构师在一家公司有多重要 架构师在公司中担当着「IT架构灵魂人物

互联网思维下的码农新生态

前言: 但凡在互联网行业混了个三五年的人都知道,互联网是一个非常特殊的行业.混在这个行业的每个人都感觉既兴奋又不安. 兴奋的是你总能看到无数新奇的事物,亲身参与到一场变革中去:而不安的则是,任凭你如何厉害,你也无法保证哪一天,你就会被无情抛在时代的身后,成了新变革的牺牲品. 残酷的现实是每一位从事IT行业的技术人员或是即将踏入IT行业的人员都需要耐心斟酌与思考的. ----关于如何让自己拥有更多的机会与选择 互联网行业里有句话是这么讲的:一个人,30岁以前往往跟其他人拼能力,而30岁以后则更应该

码农们,收起你们的贱样儿,且码且珍惜

我似乎能感觉到你们是龇着牙,拿着板砖,抱着一砖我必死的心态来膜拜我这篇檄文的. 记得古代有个皇妃说过,贱人就是矫情,你还真别不信,既然我今天必死无疑,那就请听我把话讲完. 有人说你们是高科技人才,有人说你们是IT精英,有人说你们从事的职业既高端又大气还上档次,听到这些褒奖,你们是否有点沾沾自喜呢? 说你们是码农,那是抬举你们,农民工进城,举个牌子坐在路边写上会修水管.修下水道.会保洁啥的也能轻而易举的找点事情做做. 而你们呢?饱读四书五经,上知天文下知地理,精通各种编程语言和技术那又怎样? 你们

【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍. 优秀的码农会告诉你学啥底层.啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?成为高手有很多种方法汇编是个屁啊? +++基础的分割线+++ 列举几个我认为比较重

逃离北上广之后,老码农的悲哀(顺便晒下简历,请围观,但请勿人肉,求放过!求无视!)

在此记录一下,逃离北上广之后的五个月后的今日的感想. 前戏: 最近老板出去旅游了,要十几天才回来.由于老婆最近总是在碎碎念,说小孩在成都读不起书,收入降低了这么多,真是不该回来!云云... 顺便说一下现状吧,本来是受朋友邀请才回来工作的,也就是现在的BOSS,我的王哥,王哥对我还是挺照顾的,也是非常的感谢.公司是做传统收银管理软件的,在现在的行业内一直是国内领先,效益还算可以,加上王哥自己开发有4个人,但是主力开发由于身体原因已经在家修养了半年多了,一直没来上班.由于软件是delphi开发的,面

工作那些事(十一)谈谈码农与农民工区别和发展之路

今天看到帖子: (从这里开始引用,红色为批注) http://bbs.csdn.NET/topics/390610815?page=1#post-395774111 发表于: 2013-10-10 14:24:29 现在才感悟到,码农与农民工真正区别: 1.农民工晚上不加班,因为打扰居民生活会被告.  码农要加班.农民工也很辛苦,起的很早,并且也要有手艺. 2,农民工下班,想喝酒,去买,想吃烧鸡,买一只.  码农晚饭,快餐店,解决.想吃只鸡,要掂量掂量月底怎么办.农民工有说的那么好吗? 3.农民