大神干货:腾讯广告算法大赛亚军宝藏指南带你顺利出圈
这期我们请到了去年腾讯广告算法大赛的亚军——来自电子科技大学的徐安同学。千字比赛心得,让你轻松把握比赛,避免踩坑。
大家好,我是电子科技大学的徐安,很荣幸能有机会和大家分享我在腾讯广告算法大赛中的一些比赛心得。我们的队伍名是三只小蜜蜂,队员分别为魏梦溪、李达和我。我们很幸运地在去年的腾讯广告算法大赛中获得了亚军。
在这里,我想和大家分享一下我们在比赛中遇到的问题以及一些建议。
特征
特征工程对于比赛成绩影响很大。在很多比赛中,找到一个关键特征,往往可以提升很多名次。我在这次比赛中主要负责特征工程。我在做特征工程的时候主要依靠两条线索。
一条从问题本身出发,比如对于点击率预估问题,考虑用户会怎么想,用户会关心什么,同时也考虑商品适合哪些用户,购买这些商品的人有哪些共同点。
另一条从特征类型出发,比如考虑做哪些特征交叉;哪些特征在分布上非常诡异,需要做一些预处理;哪些特征是多值类别特征,需要做特殊操作;哪些特征的量纲一致,可以做比较以及求和。在做特征的时候,尽量做得细致全面,不要在比赛初期考虑哪些特征会对模型产生副作用就放弃采用。因为只要严格保证自己的特征在训练集、验证集和测试集是一致的(特征的含义严格一致,同时特征的取值分布也基本一致),理论上这些特征就都不会对模型产生副作用(对于极个别无法保证一致的特征,可以在公榜上实验。换榜时,也要格外注意这些特征)。
模型
近几年机器学习比赛中最主流的模型是XGBoost和LightGBM,对于类别特征特别多的数据,FFM模型也很不错。如果数据量很大,深度学习模型的优势就可以很好地体现出来。比赛中如果想要取得好成绩,这些模型都要考虑。
但是切记,不要在使用某一个模型时发现效果不好,就立刻换其他模型尝试。在比赛时最好先重点研究一类模型(推荐LightGBM或深度学习),在该模型效果做到很好的时候,再尝试其他模型;也可以每个队员研究一类模型,相互配合,相互补充。
效率
去年算法大赛数据量较大,复赛期间,经常几个小时跑不完一个单模型。如果我们能将每次训练模型的时间减半,那么我们就会比别人多很多尝试模型和微调模型的机会。提高速度主要靠多进程编程,如果不熟悉多进程编程,可以将不同类型的特征写在不同的python文件中,然后写个脚本同时运行这些代码。
另外,生成的特征可以保存在文件中,方便下次使用,这时需要注意下特征文件的命名,我习惯将数据长度加入特征文件的文件名中,因为我们常常需要更换数据集训练,此时很容易加载错误的缓存文件(换榜时也有这个问题)。把数据长度信息写进特征文件中,可以大概率避免这些问题。
习惯
想提高比赛成绩,需要改进原有算法,需要挖掘更好的特征,需要看论文,需要思考真实业务场景,还需要一行行码代码,再一行行找bug。总之,需要做的事情很多。这时候,就很容易做一部分忘一部分。经常想到一个新点子,等有空编程的时候,idea却已经忘了。最后在看大佬答辩ppt的时候,会隐约感觉自己也有过类似想法却没能实现,所以我习惯将自己偶然想到的新点子记在手机备忘录上,等编程的时候,拿出手机回顾一下。
节奏
腾讯算法大赛赛程长达两个多月,如果把比赛比作一场马拉松,最重要的不是前100米,也不是最后100米,而是合理分配体力,掌控比赛节奏。可以每天抽出固定的一两个小时做比赛,其他时间运行程序、看看书、玩一玩。我在比赛中的很多强特就是在玩网游时突然联想到的(然后记在备忘录里),因为人在放松的时候最容易获得灵感。不要太关注每天的排行榜,一切按自己的计划行事。
资料
想取得好成绩,一定要学习前人的经验。对于一个新比赛,需要找类似比赛的学习资料进行参考,另外就是找基础知识方面的学习资料。可以多看看kaggle中优胜者的比赛方案,或者国内相似比赛的获奖代码。数据挖掘比赛经常是‘魔鬼隐藏在细节中’,有些比赛甚至一行预处理代码就可以拉开好几个名次。
所以在学习别人的代码时,我经常一行行地看,然后思考三个问题:这一行做了什么事?如果让我写,我会怎么写?如果换成我的写法,可能会产生什么差异?认真细致地学习和思考一两个获奖选手的代码,就可以快速入门机器学习算法比赛了。