KDDCup 2011回忆录
辛卯年乙未月己巳日,大局已定。仿三国演义,记下赛事五回。
第一回 山中有寨柠檬香,邪道异术出山狂
第二回 绝世秘籍未相传,独门小式败探花
第三回 光阴有痕巧破译,大象无形气莫测
第四回 山穷水尽疑无路,九易参数又一村
第五回 强强联合遇强敌,人品爆发显王道
作为程序员,先说说“第〇回”的故事。比赛前半年,dora神发现了有个叫KDD Cup的比赛,做数据挖掘的,而且有奖金。在研一迷茫的生活中,发现一个既是我当时最有兴趣的数据挖掘方向的,又是有奖金的比赛,肯定是高兴的不得了,果断写入TODO-list。
第一回 山中有寨柠檬香,邪道异术出山狂
转眼间就到了“第一回”的时间,比赛开始了。KDDCup
2011的题目是音乐推荐,Track1是做用户对音乐打分的预测,Track2是预测某首歌用户会不会去听,而且喜欢听。我们几个对数据挖掘和推荐系统
都完全没经验的人凑在一起组了个队,也就是所谓的“山寨出山”。起名字想找个通俗好记的,Apple有公司了;Orange也有个公司了,而且还是之前某
年KDD Cup的赞助商。还有什么容易拼写的水果呢?回头看到师兄桌子上放了一瓶柠檬香型洗洁精,就是它了,定名为“Lemon”。
Track1的数据太大,为了方便计算,我尝试性的算了下Track2。一开始什么都不会,就想想,到底我听歌的时候有什么规律呢……果然想到一个主
意,应该有很多人只喜欢某几个特定歌手的歌。于是用这个假设写了个简单的筛选程序,提交了一把,立下了比赛中的史上最好成绩。在这个方法的基础上调调参
数,居然还稳居排行榜第一名长达一周时间。
第二回 绝世秘籍未相传,独门小式败探花
只用这种土办法,肯定是没什么前途了。过了几天我又YY出了另一个土办法,叫“共现率”。接着又想了种土办法居然把这两个模型合在一起了……回 想起来当时真的很山寨。但是就是用这么山寨的方法,我们还是一直在排行榜上保持比较前面的位置,这基本上全靠调参数调出来的。就在我们还在调参数的时 候,xlvector师兄突然杀进排行榜,登到了榜首。在xlvector师兄的博客中,我们知道了LFM(俗称SVD)模型是当前效果最好的模型,也学 到了这个模型如何用于这次比赛。当然在他博客里没有介绍效果最好算法的一些细节,接下来的很长时间我们一直在琢磨师兄提到的“最好的”算法。在师兄的博客 中,我发现原来我YY的“共现率”就是一个退化了的Item-based CF算法。当即放弃“共现率”的叫法,开始学习现有的Item-based CF算法。经过长时间的努力(主要是调参数),我们终于又回到第三名。
第三回 光阴有痕巧破译,大象无形气莫测
五月初,我们发现了一个“惊天大秘密”:公布的训练数据虽然已经去除了时间信息,但是仍然是按时间排序的。经过一些简单的实验之后,发现这个特征的效果几乎要优于之前发现的所有特征的效果。利用这个特征,我们又回到了第一名的宝座上。
dora神的强大的数学能力发挥了重要的作用。LFM里面复杂的数学让我望而生畏,dora神只花了一天多的时间,就算出了一个效果不错的结果。更好
的是,LFM算出的结果与我们已有的方法算出的结果差异非常大。融合进一个统一的结果之后,效果有了巨大的提升,而且领先第二名一大截。不过,为了不让竞
争对手产生更多的心理压力,进而疯狂改进,我们开始倒着提交结果……
第四回 山穷水尽疑无路,九易参数又一村
苦逼调参数的一个月,不忍回忆……
第五回 强强联合遇强敌,人品爆发显王道
比赛进入白热化。排行榜上出现了好多新人,也不知道从哪冒出来的,一个个都非常的厉害。以此下去不仅没了奖金,连有个体面的排名也很悬了。在结
束前半个月,我们和xlvector师兄合作了。结果的提升是一方面,思想的结合还能碰撞出新的方法。师兄在比赛中的经验也很有用,最后提出的后处理阶
段,让结果有了进一步的提升。虽然只是微弱的提升,从最终比赛结果看,这点提升刚好能让我们从第三名跳到了第二名。
对于比赛来说,最后两周发生了很多大事。主办方要求删除所有小号,于是,排行榜清静了,我们又往前了几名。最戏剧性的是,在Track1中一直领先的commendo队突然开始做Track2,而且每天都有巨大的提升,没几天就超过了我们,实在佩服。
最后那几天的排行榜变动异常激烈,我们从之前希望比赛延长一个月,好让我们多实现一些算法,到现在变成了恨不得马上就结束比赛,好让我们从中解脱。但
是在这样巨大的心理压力下,我们还是坚守岗位,苦调参数。这种时候,新的方法对结果已经很难有提升了,我们把希望寄托在“人品”上,做一些看似毫无理论依
据可言的实验,还真凑到几个人品大爆发点,莫名其妙地提升了一些精度。
总结
第一次做时间跨度这么大的比赛,从三月中旬到六月底,长达三个半月的时间里,多数时间都花在了这个比赛上。
收获也不小。不仅仅是一些推荐算法,更对研究有了一点感觉。
发现规律 => 统计验证 => 抽象模型 => 改进算法
这4个步骤经常会迭代着发生,先是简单的模型,一点点地加特征,模型变得异常复杂。到某个时候,突然发现其实可以抽象到更高的层次中,于是化简,化简,变成了一个形式上很简单的模型。循环往复。
赛后和国立台湾大学有过交流,他们的参赛形式很有意思,专门开一门课,20多个上课的学生都试着做比赛,每个人看不同的论文,每周定期交流。到比赛最
后阶段的时候,把所有人的计算结果融合起来,最后就夺冠了。这种模式下,他们已经连续两年获得了KDD Cup的世界冠军,在KDD Cup
2011中更是同时拿下了Track1和Track2的冠军。我们这种山寨队伍是不能采用这种模式了,但是相比起他们,我看的论文实在是少了点。很多东西
都是“重新发明”了一遍,而且肯定没有前人提出过的这么成熟。在之后的研究学习中这点一定要吸取教训。
转载自:http://licstar.net/?p=89