阿里推荐大赛:那些在坑里翻滚的日子

晚上提交完这次的结果后,我知道明天早上又会有一百支一起奋斗过的团队们要离开了。而这一次的月星星与我还是那么的遥不可及。回想起这段日子每天早上打开排行榜就像开足彩一样紧张而兴奋。想想多年后是不是会怀念这段时光,所以决定还是写点东西吧。

前奏

4月25日正式开启了 Season2 的征途,队员们纷纷进入天池系统开始大展身手。人们总是热于尝试新鲜事物,就好像 Swift 刚发布的数小时内就有开发者重写了 Flappy Bird,这种激情是值得敬畏的。我也在比赛开始一星期内写了两篇 ODPS SQL 入门的文章,当时随便想几个规则就能进排行榜。之后我们用 SQL 实现了第一季的所有规则,后来还尝试了线性回归、逻辑回归,但是效果都不好,成绩停留在 4% 出头点。

到了5月10号左右,由于实验室的多个项目紧逼,逐渐开始淡出比赛。当然在第一个月的淘汰期由于压根不在比赛,所以完全没有感受到比分的残暴。直到这一次深有体会。幸好那时候还没被淘汰。

坑里的日子

到了5月底,终于实验室的事情不那么紧了,准备开始赶一下名次,也开始了我们在坑里翻滚的日子。由于阔别了半个多月,回来的时候发现排名大概在 280 左右。而我们对 LR 已经绝望了,正巧听说随机森林效果不错,因为对特征不那么挑剔,线性非线性的都能有较好效果,而且抗噪能力强。因此,决定往随机森林方向走。

随机森林需要较多的特征,效果才会好。我们花了一个星期来整理特征,思路和之前很多大神分享过的一样,将特征分为三类:用户的特征(哪些用户会买?),品牌的特征(哪些品牌会被买?),用户品牌的特征(用户会买哪些品牌?)。我们将这些特征整理成三份文档,并统一命名了每一个特征,以方便我们后续的编码实现。命名方式不是用特征含义来定义,而是以编码值代替,比如用户的点击量是用户的第一个特征,所以是u1。我们花了一个星期来完成这个,这一个星期里没有提交过一次成绩。

整理完文档后,开发就方便了。我们用了三四天的时间将所有的特征用MR都实现了,这里我们放弃了 SQL 。我在之前的 ODPS SQL 入门 中说要尽量使用 SQL ,但是当我们为实现一个较复杂的特征用 SQL 写的死去活来,而用 MR 只用了20行时,我们就果断地抛弃了 SQL 转投 MR 阵营。所以这一次我们用 MR 实现了几乎所有的特征。当需要重新构建特征矩阵的时候,只需要运行几条命令就行了。

带着 70 多个特征的随机森林,和一堆看不懂的参数,终于我们得到了一个在线下看起来还不错的结果。

6月9日,阔别了一个月后,终于再一次提交了成绩。5.37% 的 F1 值和 53 的排名,肯定了我们的付出也让我们兴奋了好几天。那时候开始,我把目标定在了首页,想出现在能看到月星星的地方。但却不知道这一路是有多凶残。

之后的几天一直在边学习随机森林边修改特征。13号的时候加了两个特征,居然提升了 0.2 个百分点,终于进入了前50。16号修改了几个特征的实现,又提升了 0.02% ,成绩大概在40名。

这时候看到群里越来越多的人开始讨论 GBRT,心里也嘀咕着是不是应该尝试一下。个人感觉 GBRT 要比 RF 简单,起码参数少了大半。我们随便填了几个参数开始训练模型,结果发现在线下表现的特别好。18号,迫不及待地提交了结果,终于我们进入了第二页。眼看着目标就在眼前,可接下来几天却一筹莫展,排名更是越降越快。果然是临近淘汰日,小伙伴们都开始发力了。

跟同学交流了后,发现我们的参数一直没调过。每个模型最佳的参数、采样比都不同,所以准备开始调参。但是手工调基本不现实,而且那段时间基本属于单挑阶段(期盼队友赶紧回来)。所以就想着把特征矩阵生成、训练、预测、评估的整个流程都脚本化。借助 XLib 提供的“丰富”的文档,顺利地实现了自动化脚本。从此训练模型调优参数,只需要一键点击就可以去喝着咖啡等着看模型结果了。

之后就开始了调参的不悔路… 21号提升了 0.02%,结果排名还掉了一名。22号提升了 0.01%,结果排名又掉了一名。23号又提升了 0.01%,结果又掉了一名… 24号新一度的月星星诞生了,而我还是没有出现在能看到他们的地方。

后记

比赛越到后期,竞争越是激烈,不仅仅是提升 0.01 个百分点的艰难,更是逆水行舟,不进则退,进了也有可能退的残酷现状。

这就是比赛!

非常喜欢阿迪达斯在世界杯上的广告语「All In Or Nothing」,要么拼了,要么放弃。Season2 还剩最后一个月的时间,马上要进入冲刺阶段,相信比分会更加凶残,但有梦想的人总是会坚持到最后。希望与大家共勉!

这段时间首页更是剧烈变动,黑马层出不穷,之前稳居榜首半个多月的 5.9% 成绩,现在居然连前十都进不了了。能与这么一群有实力又有拼劲的同学在同一个平台上比赛,真的感觉既荣幸又可怕。

Tips

一写就写多了,能看到这里的绝逼是真爱啊!所以分享点我们积累的一些小技巧和经验,希望能帮助到一些人(大神如果能看到,也希望能指点下我们:)。

  1. 用 mr 实现特征。避免多次合并特征。
  2. 特征统一命名,文档化。维护方便。
  3. 脚本化。作为程序员就应该让机器代替我们工作。
  4. 评估不用XLab自带的,用的是上一篇博客的方法,并且用limit控制输出量,精确对比模型效果。
  5. 特征还是比参数重要,参数的提升不大但有必要。

–END–