腾讯广告算法大赛2020赛题初探坑

腾讯广告算法大赛2020赛题初探坑

  • 写在前面
  • 1.赛题和数据
  • 2.评分标准
  • 3.特征工程
    • 3.1one-hot编码
    • 3.2hash特征
    • 3.3target encode
    • 3.4embedding大法好
  • 4.总结

写在前面

近日参加了腾讯的广告算法大赛,从开题到现在将近一周了。虽然有深度学习的背景,但是由于研究方向局限在图神经网络,第一次参加这种数据挖掘类比赛的我简直是个地地道道的小白。经过了一段时间的迷茫和焦虑 ,探了不少坑,总算是有点入门了,特此记录一下。

1.赛题和数据

今年的赛题是通过用户点击广告的行为来预测用户的性别和年龄。数据包括click_log.csv,user.csv和ad.csv,分别为用户点击记录,用户属性和广告属性。

用户点击记录是用户在3个月内点击的广告creative_id以及点击时间,为最重要的用户行为,后面证实单靠这一数据而不利用广告属性数据也可以达到不错的效果。

用户属性包括user_id和性别年龄,在训练集中user_id范围1-900000,性别为1或2,年龄为1-10,在测试集中user_id范围3000001-4000000,需要预测性别和年龄。官网的评分方式是两个预测准确率直接相加,由于性别准确率一般都很高,所以拉开差距的地方在于年龄预测。

广告属性creative_id,ad_id,product_id,product_category,advertiser_id,industry,全部为id类数据,其中creative_id范围1-4445720,ad_id范围1-3812202,product_id范围1-44314,product_category范围1-18,advertiser_id范围2-62965,industry范围1-335。注意到在范围内的id并非在数据集中都有出现,猜测可能是会在复赛的数据集中。creative_id为广告的唯一id,不会重复。某些广告的product_id和industry为缺失值,后面我是用0或者均值来作为这些缺失值的特征。

2.评分标准

官网的评分方式是年龄和性别两个预测准确率直接相加。如果你提交的时候其中一项全填0,另外一项填上自己预测的结果,就可以只得到这一项的分数。我基本都是只提交一项,用来观察在这个任务上有没有上分,偶尔才提交一下两个任务。

根据统计训练集的情况,用户的年龄众数为3,性别众数为1,如果在预测结果中年龄全填3,性别全填1,得到的年龄分是0.224628,性别分是0.668416,总分0.893044,这种我们称之为31党(摇扇子)。

另外可以通过简单的统计规则预测,即统计每一个广告的点击用户的平均性别和年龄,然后对测试集的用户,对其所点击的所有广告统计特性求平均,作为预测结果。这种方法的年龄分是0.213886(还不如31党呢),性别分是0.819938,总分1.033824。建议用模型输出的预测的时候对比一下这些分数,如果比不上的话该怀疑一下自己了。

3.特征工程

一开始的工作是构建特征,而我对于如何处理id类特征实在是完全没有经验,因此也一步一步地探了很多坑。这些实验都是在性别的任务上进行的,并且由于对传统机器学习方法不熟,我使用的都是mlp模型。我的输入为用户点击的所有广告的特征的平均,而广告的特征由creative_id等6个属性的特征拼接在一起。训练集中划出100000个用户作为验证集计算线下得分。

3.1one-hot编码

一开始尝试的是所有id做one-hot编码,6个属性拼接起来一共8365553维数据,一把梭哈全部进LR模型。哦豁机器跑不动了,试验失败。

3.2hash特征

于是乎研究如何将特征降维降维的方法,盯上了PCA和hash,其中PCA由于维度太大计算的时候内存又炸了,而hash特征则是我第一个试出来能用的特征。我的处理方法非常简单,把输入id对n求余,求出来的余数为n维one-hot标签的1的位置,这样就把输入的维度降为了n。这个的坏处是会有很多的id映射到同一个特征上,成为hash碰撞。在性别的任务中,线下准确率为0.8868,线上分数为0.867622,只比规则的分数略高,而且出现了过拟合。

3.3target encode

后面看到其实有专门针对id的encode方法,one-hot和hash就是其中之2,并且有方便调用的python包,这里给出GitHub地址:Categorical Encoding。我尝试了一下里面的target encode,即通过计算某个id的平均label来作为这个id的特征,最终是一个数,也就是说我现在的输入是6个数而不是6个向量。这种输入下应该是传统的机器学习方法更优,可我实在是懒得找机器学习方法的代码,就干脆还是用mlp来预测。最后的性别分数是线下0.9334,线上0.908578,有了一定的提升,但是由于target encode的计算方法中有用到训练集的label,所以不可避免地出现严重的过拟合。

3.4embedding大法好

embedding是我很早就有的想法,毕竟在nlp领域的word2vec实在是很有用,一直没有动手去做是因为我以为要自己去写源码训练(捂脸),直到我发现了gensim这个包,才发现原来word2vec这么容易。这里同样给出链接Gensim。

我以一个用户作为一个句子,所点击的广告按照时间顺序作为单词,当然这里面的id可以是creative_id或其他属性的id,然后用skip gram来训练出id对应的embedding。得到embedding后跟前面一样输入mlp来预测,得到的性别线下分数为0.92+(未训练充分),线上分数也为0.92+,可以看到明显地已经没有过拟合了,可喜可贺。再去试了一下年龄任务,线下0.40+,线上0.40+,同样没有过拟合。两个任务合起来提交了一下,总分1.32+,目前的排名是Top50。可以看到embedding的效果实在是非常好,突然心疼我前面找特征浪费的许多时间。

后面还尝试了一下利用tfidf来对用户的所有广告加权求和,而不是简单的平均,但是效果反而下降了,感觉是我用的方式不太对。还尝试了对user做embedding,提升效果不明。

4.总结

花了近一周的时间,几经波折,终于找到了比较合适的特征。接下来应该就要在模型和业务上入手了,同时数据其实还可以清洗一下,可能会存在有噪声。而排行榜前面的大佬,早已一骑绝尘,而且据说只是baseline(摇扇子)。用一句话来说就是:

大佬的baseline,我们的top




6月22日编辑:
今天终于出B榜排名了,顺利地进了复赛,回来捞一下当初还是小白的自己

你可能感兴趣的:(计算广告)