今年kaggle比赛里发生的shake up可以说非常多了,从Elo,Microsoft,VSB到最近的LANL。我看到很多搞机器学习很长时间人对shake在这个问题上认识很不到位,因此在这里写写我的看法。
0.厄瓜多尔商店销量预测比赛里的shake
见kaggle比赛里的shake——一年多前的时序预测比赛
这个比赛的结果就是好的模型不一定带来好的结果,因为real world是时刻在变化的,不一定遵从过去的规律,拿过去的数据是无法确定就能预测未来的。
1.比赛里shake的原因
把比赛里shake的原因归为如下几种:1.数据不同分布2.数据量太小3.异常值影响较大4.metric过于敏感5.大家模型太接近6.overfit
1.1数据不同分布
数据分布有以下几种
(1)train、public、private三组数据都是random split,故同分布。典型的有匿名数据赛都是这样,而Instacart、 Elo虽然有时间feature,但依然是random split
(2)train、public、private三组数据都是互不同分布。kaggle最近两年的时序比赛以及最近的LANL地震都是time split以避免通过prob leaderboard过拟合,而最近的vsb应该也是数据源三组不一致,18年的ctr比赛talkingdata,今年的Microsoft也是time split。
(3)train、test分布不一致,但public、private分布一直。典型的有sberbank,home-credit,都是对train和test之间time split,而对public和private之间random split。
(4)kernel 赛,甚至看不到private数据集,但就目前kaggle举办的来说,无论train和test是否分布一致,但public和private基本都还是分布一致的。
数据分布不同所带来的shake原因在于无法建立稳定的模型及可靠的local cv,以今年的微软软件中毒预测为例,就是数据里最后发布的一个系统版本和之前发行的版本在软件中毒的行为模式上完全不一致,导致了所有队伍的预测都崩盘了。
1.2数据量太小
数据量小导致shake的典型比赛就是17年的mercedes-benz(4000样本)、今年的vsb故障预测(2900×3样本)、lanl地震预测(16个样本)。
样本少导致shake的原因依旧是无法建立稳定的local cv,在没有domain konwledge的加持的情况下,你添加了一个feature看起来好像是提升了模型性能,但也许这不过是凑巧overfit了某几个样本罢了,所以最后导致local cv看起来好看,但实际模型泛化能力不强。此外train样本少可能无法覆盖test里很多样本的feature,导致无法准确预测这些样本。
1.3异常值影响较大
这个典型的就是mercedes-benz ,在样本极少的情况下,还有较多难以预测的异常值,从比赛的结果来看冠军和开源kernel结果来看就差三个异常值,这就导致能凑巧预测对异常值影响很大,比如我在这个比赛就是在开源基础上手工改了一个值,就从500名跳到了200名。见大家如何看待最近Kaggle的奔驰比赛最后排名严重波动?
1.4metric过于敏感
如前文所说,不同分布、小数据、异常值容易是模型不稳定,variance比较大,而不好的metric又加剧了这一点,比如在分类比赛用logloss,或者回归用mse,这个和前三个因素叠加使结果更加不稳定。
这里以两个NLP比赛为例,toxic 和 Personalized Medicine 均是nlp的二分类问题,而且都在比赛过程中发生了数据泄露导致更换test数据,其中Personalized Medicine 是继续采用了logloss作为metric,由于不同分布,其结果惨不忍睹,主办方被喷惨了。到了后来的toxic,主办方就吸取了教训,在更换数据的同时,将metric从logloss改成了AUC,尽管能感受到新更换的数据和原始数据存在差异,但是最后比赛几乎就没有什么shake。
1.5baseline过高大家模型太接近
因为模型存在variance, real world的数据存在variance,上面的四个原因都进一步扩大variance的影响,所以即便假定所有人都是稳健可靠无overfit模型,但是一样会发生shake。但也有像Porto 这样的,数据够大,同分布,而且metric也稳定,模型和数据的variance很小了,但kaggle的一个特点就是分享很厉害,有时候开源就把数据榨干了,导致没剩下什么油水来拉开区分度,各个参赛者的模型非常接近,也相对容易shake一些。与之对应的就是图像比赛,由于没有比较厉害的开源,各个队伍之间实力又都有一定的距离,所以即便数据量相比结构化数据比赛来说要小的多,但也不容易shake。
1.6overfit
说实话,以上说法其实都是遮羞布,90%以上的人shake都是因为overfit public, 特别是在前文所提到的不同分布、数据量小、异常值影响大,metric敏感类型的比赛里,刻意的去overfit public leaderboard提升名次要比老老实实按照local cv做模型提升名次快的多,另外kaggle的kernel分享会也出现"云过拟合"的情况,导致很多参赛者会更容易的在自己的模型里引入很多错误的feature和method,这又进一步导致shake的发生。
小结:shake基本都是上述几个因素综合形成,有时候若只有一个因素,则不会shake ,比如home credit虽然是time split,而且train和test明显正样本差异很大,但是使用auc作为metric,就没有shake。shake的比赛更多是占了好几条的,比如梅赛德斯,小样本、异常值、敏感metric都占了,所以不可避免的shake了。
**如何评价一个shake比赛solution值不值的学习
怎么马后炮的评价一个发生巨大shake比赛的solution的含金量,我的依据是有多少GM 在shake里存活下来。
比如如下图,是某比赛的public榜(可惜现在这种榜已经不显示了),像这种比赛的结果,就可以很肯定的说,跟运气毫无关联,只有有实力的才能在private找的一个好位置,这个比赛得出来的方案是可靠的。
![204d7b1335848c066b2b82a68a67e37d.png](https://i-blog.csdnimg.cn/blog_migrate/2fd3ae37d35c8b16bc3328a15e92ead9.jpeg)
这张图是刚结束的lanl的private,今年的vsb和lanl,则可以认为一半运气一半实力,既有靠实力上去的,也有运气蒙上去的(18th、21th、24th)。所以在学习这种比赛的solution的时候就需要看他们能否自圆其说,不能盲目的以结果论对错。
![c64614f68380d1ee90c2e08ad3dc38a8.png](https://i-blog.csdnimg.cn/blog_migrate/2494f1f7df73dcd97f5d39a4009d6fe7.jpeg)
(注:还有两节,本来是准备端午节在一篇里完成的,但最近沉迷自走棋,所以分开来发布,剩下两节将讲如何防止shake和利用shake以及对我个人的启示)