这个本来是准备作为我另一篇文章的一个例子,但是后来越写越多,因此单独成文吧。主要讲我一直一来耿耿于怀的一个比赛的shake。

题目简介

根据过去三年厄瓜多某连锁商店的销售记录, 预测54 shops × 3800 items × 16days 的销量。在仅仅有两列有效信息的情况下,数据量有7个G之多。

baseline以及带来的bias

这个比赛里有一个非常不错的baseline,将划分时区滑移,特征工程的代码写的非常简单明了(网址见LGBM Starter),比赛最后几乎所有队伍的模型都是在这个baseline基础上发展起来的,但是我在做的过程中发现这个baseline其实引入了两个bias:

第一、出题方为了减小训练集的体积,故数据里为零的销量的当天样本都被删除了,baseline建模时处理方法直接fillna 为0,这是没问题的。但是主办方删除销量为零天信息之后,当天是否促销的信息也删掉了,由于非促销占了绝大多数,baseline于是也是简单的这部分缺失的信息fill 为false。这就引入了第一个bias,训练集包括了三种样本:1.促销为true且销量不为零;2.促销为false且销量不为零;3.促销为false且销量为零。在这样的数据基础上训练,就会得到一个错误的结果:只要样本信息里促销为true,则销量预测必大于等于1,这显然不符合常理,而且通过对public的prob,也是存在促销为true且销量为零的样本的。第二、这个比赛要求我们预测8.16到8.31的销量,baseline直接时间滑移为7.26到8.10作为valid,而厄瓜多这个国家的有趣之处在于该国每月1日发薪,故每月的前5天的销售量要比月均销售量高出30~10%,也就是说会用这几天做valid会比test更倾向于往高出拟合。

因此我基于这两个bias对模型进行了修正:对于第一个促销为true,则销量预测必大于等于1的bias,因为是信息缺失,无法做local cv,只能通过public来验证,因为我采用非常保守的方法,对那些低销量的预测的结果乘了一个缩小的系数;对于第二bias则是通过local cv来确定,我仔细的把同年4、5、6、7月及前一年8月的下半月都预测了一遍,看到基本下半月的结果基本都是预测结果的95%~98%之间,但出于保守考虑,我也只乘了99%。

赛后的shake以及撕逼

比赛结束前几天我心里美滋滋,因为我知道那些只会无脑特征工程的人肯定没发现这个问题。但是开榜以后令我大跌眼镜,那些按照错误的baseline做下去的纷纷排名上升。我不做任何bias修正本可以solo第八,做完后处理反倒掉到27名。

正当我不爽的时候,当时的天梯第一giba跳出来说

As I always say: - Trust your local CV. link

在kaggle社区里,我觉得最嘲讽人的就是说你不懂local cv了,于是sjv马上跳出来反驳他:由于促销信息缺失,这题如果能说出trust local cv的言论来意味著根本没有发现baseline存在bias。

sjv的发言说明我发现的bias是没错的,于是我也发了一贴the reason for shaking up,表示名次下降并不是因为没trust local cv,然后我又在cpmp的8th solution里说明了这个bias,但是很显然,这两位当时的天梯第一根本听不进去。

接下来就引发了sjv和cpmp相互之间的人身攻击,sjv表示你还丫机器学习还没入门,去youtube看新手教程吧,cpmp表示我连著两个时序比赛拿金牌了所以我就是对的。cpmp的这种以结果论英雄逻辑我很反感,何况sjv也是两个金牌呀。这场撕逼的结果就是sjv直接永久退出比赛圈,搞科研去了(注:sjv是MIT的)。

让我比较失望的是,我开始以为public前面的人应该都是发现了bias,但是从后面的站队来看,应该只有sjv, to train them is my cause两人同意我的观点,其它人真如giba所说是过拟合public了,根本没发现bias。

对shake的分析

毕竟数据也是来自于real world,为什么模型更好反而预测的不如带有bias的模型呢?有时候就是这么的无奈,正如我前面所说,模型的两个bias都是倾向于往高出预测,维持我都进行了缩小处理,万万没想到这一年的八月是「黑天鹅」了嘛,销量居然要比平时高...带有bias的模型预测蒙对了带有bias的result...

一个月后的另一场时序比赛

一个月又进行了一场时序比赛,这是我依然用了对第二个bias的处理方法,结果把我随手做了一个下午原本400名的模型直接提到了22名A simple method to get 0.009 booster in private(kaggle cto都给点赞~),而sjv的队友pp二人组则在这个比赛做到冠军,按照cpmp的以结果论对错的逻辑,好像还是我们这边更懂时序比赛local cv哦,算是争回了一口气O(∩_∩)O~。

一年半后的回顾和小结

1.在时序预测里好的模型不一定代表就一定有好的结果,不能以结果论英雄。但是对的就是对的,这次运气不好,下次也能找回来。

2.现在回头想,比赛和做研究还不一样,是队伍之间横向的比较,当时就是过于自信自己是对的,两个submission都做了后处理,没有拉开区分度,其实对付这种时序题目,完全可以选一个不做后处理的,在错误的baseline基础上去刚特征工程就行了。giba&cpmp虽然在这场比赛没有发觉bias,但他们还是值得学习,比如今年的微软这种数据质量不高的题目以及LANL这种数据很小的,他们又都拿金了,说明他们的在选submmsion的经验还是够强。

推荐阅读:

相关文章