2018第二届腾讯广告算法大赛(持续更新)

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:

  1. app, interest 的长度的对数
  2. interest 之间的比值
  3. appInstall与appAction之间的比值
  4. kw长度是否小于5
  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

本次比赛成绩并不理想,主要是由以下这几个原因所导致的。

  1. 首先我对于超大数据集的处理并不是很好,毕竟以前我做的比赛都能把所有的特征放入内存进行训练,然而这次却不行。所以迫使我主力使用deep fm(毕竟我对Deep learning的了解甚少,所以刚好打中我的软肋)。

  2. 前期对题目做的research太少了,到后期才发现有很多feature engineering和model可以做。好吧,这算给我上了宝贵的一课,前期的research能够给比赛提供不少的理论指导(类似于Kaggle上面的kernel和forum)。这一点可能决定你比赛的方向,比起我这次比赛瞎努力更有效。方向和选择比努力更重要。大家可以看看这位大佬关于CTR/CVR的一些见解,我认为对比赛还是很有用的。从最近的比赛学习CTR/CVR

  3. 代码的pipeline还是缺乏一定的自动化能力。这次比赛对pipeline要求比较高,主要是因为在超大的数据量的时候,我们都需要将数据转化为feature到外存然后在读到内存中,另外feature到model,model评估等,都需要良好的code pipeline来提高编码效率。

  4. 专注于比赛,这次比赛相对于上次Kaggle,我的投入时间和专注力并没有这么多,可能是因为自己私事比较多的原因吧,专注于比赛时间就仅仅三周时间。再者我没有很好动员自己的队员参与到当中来,这是不好的,毕竟人多力量大。因此组织能力有待太高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。