阅读本文前可能需要先阅读 有关kaggle比赛里的shake up分析
首先要说明的是,在避免shake上我觉得做的好的是2017年成为GM的老GM,那时候的数据较小,而且匿名赛居多,所以对model的把控能力很强。本文仅为抛砖引玉。
在文章开始之前,先回顾一下上篇文章的两个关键结论:
1.从统计学的观点看shake,shake的原因主要来自于模型的variance和数据的variance ,不同分布、小数据、敏感metric综合加剧了这个情况。
2.在容易shake的比赛里,刻意的去overfit test数据提升名次要比老老实实按照local cv做模型提升名次快的多。
本文都是基于这两个结论展开的:
一、首先说避免shake:
- trust loca cv:
虽然在前面的文章说过在特定比赛里,好模型并不意味着好结果,但从统计学的观点,模型越好获胜的概率还是越大。比如说1000人去摸十二个金牌,对于某些队伍来说,中奖率为90%,对某些队伍来说,中奖率只有0.1%,如果在elo这个比赛里手工改-33来过拟合public,中奖率就为0了,总而言之,基于local cv把模型做好才是提升获胜胜率的方法。
那么如何确定自己是否能做对local cv的,简单的回答一个问题:“在kaggle这种一次开榜的比赛开小号对提升分数有没有收益?”如果这个问题想明白了,可以认为对local cv的理解刚刚入门了。
2.釜底抽薪法,不做那些shake的比赛:
前面说过容易shake的几个场景,那么其实就简单了,我们尽可能挑大数据量,同分布,metric不敏感的比赛来做就好了,或者做那些实力方差大的图像类比赛。其实已经有很多人按照这个标准来选择比赛了,比如超级大神bestfitting,最近二十场比赛获得了十九块金牌,其中也包括了几个结构化数据比赛,说明大神都是确认不会shake才投入时间的,少做、精做,一击致命。去年的国内奖金收割机器plantsgo很多时候在某些比赛冒个泡,一看这个比赛不是比拼实力而是拼人品就弃赛也是这个套路。所以参加比赛的时候可以去多参考gm的选择,gm越多越说明不会shake,当然随之而来的是竞争会激烈。
3.拉开两个submission的区分度
简单来说结合比赛特点两头下注,比如说之前的提到的厄瓜多尔比赛,我因为认定自己的模型是正确,两个都下注到自己正确的模型上了,万万没想到有bias的错误模型撞上了bias的结果,回头看其实完全可以下注一个错误的模型,在大家都错的情况下靠特征工程去竞争,这样其实就避免了错误模型凑巧拟合到了real world结果正确模型反倒被反杀的情况。其他的例子:在train、test不同分布,但是又用auc的比赛,这时候就一个local cv最好,一个public最好最合适;时序比赛就是一个押大、一个押小。总之要结合实际比赛来说话,也要结合对成绩的需求来说,想保住现在的成绩不掉太多,可以保守点,如果想往上冲,可以激进点,但也要承担跌入万丈深渊的风险.
4.结合domain knowledge让自己的模型尽量可解释
对于样本较少的数据集,很容易overfit local cv,比如今年的lanl地震题以及vsb电力题,这时候若是使用神经网络或者暴力特征工程和筛选方法,可能会取得理想的local cv,但是这可能是overfit来的,对于这样的,结合domain knowledge来提取feature才能保证模型的泛华能力;
对于时序类数据集,需要结合相关数据以外的知识来判断时域曲线中的spike是否是周期现象还仅仅是不会再重现的异常值.
可解释是提升模型泛华能力的好方法.
5.具备碾压的实力
比如说一个模型的variance和数据的variance是0.005,但是如果你领先金牌/奖牌线>0.005,自然就不必担心shake了O(∩_∩)O~
二、如何利用shake:
上文说了如何避免shake,本质上还是要提高自己的实力.但是实力不够咋办,其实可以刻意去做容易shake的比赛,毕竟抽来的牌子也是牌子呀~~但是如何正确的抽奖,也是需要深刻理解题目本质的,以下就举两个例子来说明如何结合问题最大可能中奖.
1.lanl
在地震预测题目Congrats, and my 5 min lottery tickets (81th place/silver medal)里,大神su shizhe仅仅是简单的对开源kernel乘了两个系数,就成功81/4540,并且证实如果运气好,金牌也不是不可能.
接下来我们来分析他方法work的原因.从预测结果分析图中可以看出,lanl有16个地震,直线图是gound truth,剩下折线为预测值,具体到每一个地震,其实趋势预测对了,但是整体斜率不对,对于大直线(长时间地震)偏低,对于小直线(短时间地震)偏高,也就是说针对具体某个地震,我们只需乘个系数,就能拟合的更好.所以当test里长时间地震比例高的时候,只要放大个系数,反之缩小个系数,就可以overfit private. 样本少导致private和train的样本不可能完全一致,所以往高往低两头下注乘一个相对保守系数,肯定总有一个比原baseline表现更好的,这就是这个比赛抽奖的逻辑.
![595a5d24075072883289c0f29e3834ba.png](https://i-blog.csdnimg.cn/blog_migrate/2b9038d09d4329b0d2ceb3b88d09a1f3.jpeg)
2.梅赛德斯奔驰
这个比赛数据太小,很多 minor patterns机器学习方法也分辨不出是outlier 还是真的有用的feature,所以结果大部分人的结果就是3~4个cluster,下图中那些红点都预测不到,而我们又知道这个比赛数据小(4000),metric对异常值极为敏感,所以根据minor patterns手动改一个值,直接从baseline到了top6%.
![a99fcd098a683025a6892a615bbf0877.png](https://i-blog.csdnimg.cn/blog_migrate/c5ac4191ac96b76f712b1a4168aee3c4.jpeg)
通过这两个例子我们可以知道,
1.要想提升中奖率,要对问题以及local cv有深刻的理解
2.在容易shake的比赛里,刻意的去overfit private提升名次要比老老实实按照local cv做模型提升名次快的多.(所以说小数据、不同分布在kaggle这种一次开private榜的比赛里是拼人品,在国内比赛平台b榜开几天这种的也只能是"拼人品")
the last 保持平常心
在这种容易shake up比赛,肯定存在认真做的都掉名次,临时一两周随便搞搞肯能摸到了奖牌,有些比赛摸奖僵尸大军蒙对了,霸占了奖牌区,我连写三篇文章其实还是想说.要保持平常心,不要用比赛结果来衡量努力,要明确自己是否学到东西,相信rp守恒定律,这次运气不好,将来也会在别处还回来.O(∩_∩)O~
![b36df2fd01e7e5f9a6b84a4d49614e96.png](https://i-blog.csdnimg.cn/blog_migrate/ab3b98284986c1410a84e57512f9a67a.jpeg)