1. Abstract
小弟最近这前一段时间参加了腾讯广告算法比赛,所以趁热打铁记录比赛的一些操作和得与失。我参加这场比赛的时候已经离初赛结束还有一周的时间了,因为我同学刚好缺一个车位所以就拉上我。但是她们貌似没有做太多准备。虽然最后一周的时间我们能够进入复赛,但是复赛的成绩并不理想。主要是因为我对处理大数据量(超过自己机器性能的时候)经验不足。
鄙人文笔不是太好,写得有点乱,大家将就着看呗。
持续更新,欢迎大家关注
2 Main work
2.1 初赛
在初赛的时候,我的队友主要是靠网站上面的baseline然后调参。其做法是对category字段做one-hot,对有多个id的字段做multi-labels(CountVec),然后放入LightGBM当中就这么简单。因此初赛的时候我决定使用他来当其中一个模型。
另外,我使用Deep FM做训练模型。但首先考虑到interest, kw, app, topic他们各自的字段数据都不是统一,也就是不同用户的apps id个数不是一样多的。所以针对这个我们需要对每个这样的sequence id做sequence长度统一。然后我们利用deep FM,这里有一篇关于deep FM的blog,里面包含源码。
2.2 复赛
面对复赛的大数据集合,在初赛当中的很多东西都不能用了。主要是因为处理大数据feature的时候,内存是撑不住的,尽管我开启了虚拟内存来做特征处理。对于LightGBM,我们事先对data每个字段做feature sparse matrix然后保存到外存,这样我们每次训练都不用浪费时间做feature。接着我们分开多组数据去训练多个子模型,然后把他们融合在一起。
除了以上所说的sparse feature,我们通过统计加入了其他的feature:
- app, interest 的长度的对数
- interest 之间的比值
- appInstall与appAction之间的比值
- kw长度是否小于5
- topic长度是否小于5。
由于其他的字段主要是category为主,所以这些非category或者说是multi category是我们挖掘特征的主要地方。当然特征也不是乱加,毕竟现在如此大的数据量加特征会加长训练时间,因此我通过corr来筛选部分特征。
我也参考了一些关于广告CTR的论文,毕竟我们这个题目跟点击率是比较相近的。大家可以看看王喆同学的这个github,包含了很多关于Ad的论文。一般主流做CTR的方法有FFM(Field-aware Factorization Machines for CTR Prediction.pdf
)和Deep FM(Deep FM论文)。
最后我们将两个模型训练的结果融合作为我们最后的提交结果。
3 Solutions of Other Players
- 初赛baseline
- 11th 提及到不少的强特征(如uid的点击转化率)并选择一些相关性较低的特征。
- 6 th 将特征做的更加细粒度,粒度越细,越容易定位到某一个单独的用户。尤其是对uid做数据挖掘
- 利用SVD处理sparse matrix,由于sparse matrix太大了,所以利用SVD将10w+的feature转换到其他维度上面。
- 本想着用GBDT+RL来做模型的,但是GBM训练不起来也没办法。这里有一篇关于模型的blog,相关论文可以在这里看到。
- 初赛:FFM + NN,我觉得这个模式可以在复赛在使用,毕竟两个都可以batch training。
4. Summary
本次比赛成绩并不理想,主要是由以下这几个原因所导致的。
首先我对于超大数据集的处理并不是很好,毕竟以前我做的比赛都能把所有的特征放入内存进行训练,然而这次却不行。所以迫使我主力使用deep fm(毕竟我对Deep learning的了解甚少,所以刚好打中我的软肋)。
前期对题目做的research太少了,到后期才发现有很多feature engineering和model可以做。好吧,这算给我上了宝贵的一课,前期的research能够给比赛提供不少的理论指导(类似于Kaggle上面的kernel和forum)。这一点可能决定你比赛的方向,比起我这次比赛瞎努力更有效。方向和选择比努力更重要。大家可以看看这位大佬关于CTR/CVR的一些见解,我认为对比赛还是很有用的。从最近的比赛学习CTR/CVR
代码的pipeline还是缺乏一定的自动化能力。这次比赛对pipeline要求比较高,主要是因为在超大的数据量的时候,我们都需要将数据转化为feature到外存然后在读到内存中,另外feature到model,model评估等,都需要良好的code pipeline来提高编码效率。
专注于比赛,这次比赛相对于上次Kaggle,我的投入时间和专注力并没有这么多,可能是因为自己私事比较多的原因吧,专注于比赛时间就仅仅三周时间。再者我没有很好动员自己的队员参与到当中来,这是不好的,毕竟人多力量大。因此组织能力有待太高。