来自公众号:机器学习初学者

本文提供2019年腾讯广告算法大赛冠军的代码分享。

俞士纶(Philip S. Yu)教授的评价“冠军队伍已经在有意无意使用“广度学习”的方法”,评委讲到“这是最接近腾讯真实业务的方案”。(本文作者:王贺)

写在前面

队伍介绍:哈尔滨工业大学二年级硕士生刘育源、中山大学微软亚洲研究院联合培养博士生郭达雅和京东算法工程师王贺。

9576bc66-9414-eb11-8da9-e4434bdf6706.jpeg

本文将给出冠军完整方案,全文内容架构将依托于答辩PPT,具体细节也会结合代码进行讲解。当然,思路为主,代码为辅,希望这篇分享能够给予你更多的启发。

下面就让跟随我一起探索这荣获最高嘉奖的方案 !

赛题理解

赛题链接:

https://algo.qq.com

  1. 数据

历史日志数据:广告请求时间、用户id、广告位id、竞价广告信息等

用户信息数据:包含用户id、年龄、性别、地域、行为兴趣等

广 告 数 据:广告操作信息、广告静态信息

2. 目标

预测广告的日曝光量

3. 评价指标

评价指标由两部分组成,准确性指标和出价单调性指标。

9b76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

最终得分是将两个指标组合一起,前者控制准确性,后者控制单调性。

9d76bc66-9414-eb11-8da9-e4434bdf6706.png

4. 训练目标

9f76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

这里我们对训练目标进行了不断优化,首先是最基本的训练目标,即广告日曝光量。然后考虑到0会导致梯度不平滑,所以对训练目标做了log变换,保证梯度平滑。

为了符合业务直觉,我们在训练时进行了单调性的考虑,而不是在训练后进行单调性修正。即考虑了出价变量,保证训练出来的结果符合单调性。

最后将基础曝光的训练目标和考虑单调性的训练目标进行结合,也就得到了最后一个公式,即一个模型预测基本训练目标,一个模型预测考虑单调性的训练目标。

5. 数据集划分

a376bc66-9414-eb11-8da9-e4434bdf6706.jpeg

这部分也是我们队伍的一个关键提分点,能从87.6提升到87.8,当然在我刚87.x分段时,能提升4个千分点。

我们知道复赛A榜训练集和测试集是连续的,即10号-22号训练集,23号为测试集。复赛B榜则是不连续的,没有给出23号的标签,直接预测24号。

面对这种“跨天”预测,难度是非常大的,因为日期越近的信息是越与当天相近的,因此前一天的信息是非常重要的。

所以我们利用“远程监督”的方式,就是利用现有的标注数据,即10-22号数据,训练一个模型,给未标注数据(23号数据)进行标注,然后再将10-22与23号合并成训练集进行训练,预测最终的结果。

特征工程

1. 特征提取思路

a676bc66-9414-eb11-8da9-e4434bdf6706.jpeg

提取思路主要从两部分考虑,历史信息和整体信息,更细致些就是前一天、最近五天、五折交叉统计和除当天外所有天的统计特征。

aa76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

接下来我们构造了四个基础特征,大部分的统计特征都是围绕着这四个来构造的。当然我这里还考虑了商品ID和账户ID的构造,代码如下:

# 构造基本特征for col in ['aid','goods_id','account_id']:result = logs.groupby([col,'day'], as_index=False)['isExp'].agg({col+'_cnts'      : 'count',col+'_sums'      : 'sum',col+'_rate'      : 'mean'})result[col+'_negs'] = result[col+'_cnts'] - result[col+'_sums']data = data.merge(result, how='left', on=[col,'day'])

2. 如何构造新广告的特征

初赛A 总广告:1954 旧广告: 1361 新广告:593 新广告占比:30.348%

初赛B 总广告:3750 旧广告: 1382 新广告:2368 新广告占比:63.147%

上面是对初赛新旧广告的统计,当然复赛也存在大量的新广告,复赛B榜新旧广告基本55开。新广告是没有历史信息的,所以如何构造新广告的特征,对新广告进行历史和整体性的描述成了提分的关键。

ad76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

这里我进行了模糊构造,虽然我们不知道新广告的历史信息,但是我们知道广告账户ID下面所包含旧广告的历史信息。因此,将广告账户ID与旧广告的广告竟胜率进行组合,可以构造出广告账户ID下广告竟胜率的均值/中位数等。这样我们就可以得到了新广告在广告账户ID下广告竟胜率的统计值。

这里可以构造前一天、最近五天、五折交叉统计和除当天外所有天等统计特征。

3. 进一步扩展

b376bc66-9414-eb11-8da9-e4434bdf6706.jpeg

经过上面的构造,可以得到很多新构造的统计特征,可以是前一天的、最近五天的,或者五折交叉统计的。我把这些值成为“假数值”,相对的就是“真数值”,即每天我们都知道广告的竞争总次数(从10-24号数据,包括测试集)。将假数值和真数值进行交叉,如广告竞争胜率(假)*广告竞争总数(真),这样就能得到的更接近真实值的特征。

4. word2vec和deepwalk

b676bc66-9414-eb11-8da9-e4434bdf6706.jpeg

word2vec

这里我们提取了用户的曝光记录,并将其转化为文本序列,然后使用word2vec算法对广告进行嵌入,就可以得到关于广告ID的embedding,或者商品ID的embedding。

具体构建文本序列方式,首先是对日志数据按天进行排序,然后是按天构建uid的行为序列并转化为文本。代码如下:

#log日志数据,pivot主键(uid),f(aid)sentence=[]dic={}day=0log=log.sort_values(by='request_day')log['day']=log['request_day']    

for item in log[['day',pivot,f]].values:if day!=item[0]:for key in dic:sentence.append(dic[key])dic={}day=item[0]try:dic[item[1]].append(str(int(item[2])))except:dic[item[1]]=[str(int(item[2]))]for key in dic:sentence.append(dic[key]) 

接下来就是构建广告ID的embedding向量,代码如下:

model = Word2Vec(sentence, size=L, window=10, min_count=1, workers=10,iter=10)

这里不仅可以构造uid到广告id,还可以是uid到商品id,uid到账户id。

DeepWalk

在推荐场景下,数据对象之间更多呈现的是图结构。典型的场景是由用户行为数据生成的和广告的全局关系图。这个时候word2vec就不能很好的展现这层关系,所以我们选择了Graph Embeding的方式,具体的使用了DeepWalk,可以将用户的曝光记录转化为关系图。这里引用阿里论文中的一张图,来展现DeepWalk的算法流程:

b876bc66-9414-eb11-8da9-e4434bdf6706.jpeg

DeepWalk的算法流程(引自阿里论文)

第一步:构建用户的行为序列

第二步:我们基于这些行为序列构建了物品关系图,可以看出,物品A,B之间的边产生的原因就是因为用户U1先后购买了物品A和物品B,所以产生了一条由A到B的有向边。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品相关图中的边之后,全局的物品相关图就建立起来了。

第三步:采用随机游走的方式随机选择起始点,重新产生物品序列。

第四步:最终将这些物品序列输入word2vec模型,生成最终的物品Embedding向量

具体对应代码如下:

https://github.com/guoday/Tencent2019_Preliminary_Rank1st

这里有两个问题:

1. 只有在日志中曝光过的广告才会有相应的嵌入向量,通过广告有无嵌入向量,会泄露了无曝光广告的标签

2. 测试数据中存在曝光非0但无嵌入向量的广告,这在训练集中是不存在的,导致训练测试不一致

这里我们给出了解决方法,即随机掩盖掉5%广告的嵌入向量,保证训练集中也能出现无曝光的广告。

模型介绍

b976bc66-9414-eb11-8da9-e4434bdf6706.jpeg

输入部分分为四组,分别是类别特征、经过Key-Value Memory处理的稠密特征、Word2Vec和DeepWalk得到了embedding向量。然后进入Batch Norm Layer,最后是MLP层。

压缩交互网络CIN

bf76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

我们使用了压缩交互网络(CIN),它考虑了以下因素:

(1)交互是在向量层次上应用的,而不是在位层次上;

(2)高阶特征交互是明确测量的;

(3)网络的复杂度不会随着相互作用的程度。

c176bc66-9414-eb11-8da9-e4434bdf6706.jpeg

每个维度上的外积用于特征交互。张量 c876bc66-9414-eb11-8da9-e4434bdf6706.svg 是进一步学习的中间结果。

具体的可以看论文xDeepFM:

xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems

链接:

http://xueshu.baidu.com/usercenter/paper/show?paperid=6cd34089953a68a3f89066228cb2bdd5&site=xueshu_se

Key-Value Memory

这里将介绍键值存储(Key-Value Memory)的神经模型实现浮点数到向量的映射。

d276bc66-9414-eb11-8da9-e4434bdf6706.jpeg

具体步骤:

d676bc66-9414-eb11-8da9-e4434bdf6706.jpeg

(1)Key addressing部分,寻址过程,此处用到softmax函数。计算上述选出的每个memory的概率值。 d976bc66-9414-eb11-8da9-e4434bdf6706.svg

(2)Attention部分,对于不同的Key addression部分的重要性不同,所以使用attention给予不同的权重概率。

(3)Value reading部分,对上一个步骤的概率下进行加权求和得到答案信息。 de76bc66-9414-eb11-8da9-e4434bdf6706.svg

规则统计

先让我们进行一些基本的数据分析,这里看的是历史曝光数据。

e676bc66-9414-eb11-8da9-e4434bdf6706.jpeg

一个广告在不同的广告位上有不同的胜率
ee76bc66-9414-eb11-8da9-e4434bdf6706.jpeg

同广告的请求数在不同的日期存在差异

可以看出对于同一个广告在不同广告位上有着不同的胜率,并且在不同的日期,它的请求数也存在很大的差异。针对这两点因素,也就能构造出统计方式来计算广告日曝光量。

f376bc66-9414-eb11-8da9-e4434bdf6706.jpeg

其中, fa76bc66-9414-eb11-8da9-e4434bdf6706.svg 表示广告在广告位 ff76bc66-9414-eb11-8da9-e4434bdf6706.svg 上的历史胜率。 0477bc66-9414-eb11-8da9-e4434bdf6706.svg 表示广告在广告位 ff76bc66-9414-eb11-8da9-e4434bdf6706.svg上发出的请求总数。

1277bc66-9414-eb11-8da9-e4434bdf6706.jpeg

这里我们对比了三种计算方法,可以看出,直接用历史曝光填充效果最差。接下来就是用竞争胜率*请求数,分数会高很多,更近一步就是按广告位分开计算,达到最好的效果。这里是在验证集上进行的计算。

历史胜率 1477bc66-9414-eb11-8da9-e4434bdf6706.svg 的具体计算方式

先来看一张图

1977bc66-9414-eb11-8da9-e4434bdf6706.jpeg

不同天数填充在验证集上的得分

最直观的感受就是,离预测当天越近的数据准确度越高,所以相应的权重也应该越大。这样我们就可以给历史每天不同的权重,然后进行加权。就可以得到历史胜率的计算公式,如下:

1e77bc66-9414-eb11-8da9-e4434bdf6706.jpeg

权重 2177bc66-9414-eb11-8da9-e4434bdf6706.svg 计算方式

我们提出了三种计算方法:

方式1:2377bc66-9414-eb11-8da9-e4434bdf6706.svg

方式2: 2677bc66-9414-eb11-8da9-e4434bdf6706.svg

方式3: 2877bc66-9414-eb11-8da9-e4434bdf6706.svg

这里使用线性搜索寻找最优参数( 2b77bc66-9414-eb11-8da9-e4434bdf6706.svg ),依据验证集分数来确定最优参数的选择。

2d77bc66-9414-eb11-8da9-e4434bdf6706.jpeg
2e77bc66-9414-eb11-8da9-e4434bdf6706.jpeg

在最优参数下三总方式在验证集上的得分对比

这里我们对三种权重计算方式进行对比,并添加最后一直接填充作为对照实验。可以明显看出方法三在验证集上的效果最好。

最终融合

这里使用两种融合方式,分别是算术平均和几何平均。

算术平均:3077bc66-9414-eb11-8da9-e4434bdf6706.svg

几何平均: 3177bc66-9414-eb11-8da9-e4434bdf6706.svg

由于 3377bc66-9414-eb11-8da9-e4434bdf6706.svg 的评分规则,算术平均会使融合的结果偏大,如:

3877bc66-9414-eb11-8da9-e4434bdf6706.jpeg

显然不符合 3977bc66-9414-eb11-8da9-e4434bdf6706.svg 的直觉,越小的值对评分影响越大,算术平均会导致更大的误差。所以选择几何平均,能够使结果偏向小值,如下:

3c77bc66-9414-eb11-8da9-e4434bdf6706.jpeg

模型、规则以及不同融合方式验证集得分对比:

3d77bc66-9414-eb11-8da9-e4434bdf6706.jpeg

更细致的融合方式:

4177bc66-9414-eb11-8da9-e4434bdf6706.jpeg

模型和规则在不同的转化类型上的得分
  • 无论是模型还是规则,预测结果在不同的转化类型上得分差异都很大

  • 模型和规则在不同的转化类型上得分也存在差 异,上图表示了模型和规则在不同转化类型上的表现。

根据模型和规则在不同转化类型上的得分表现,调整权重值,线上可以获得0.5个千的提升 。

结果分析

4477bc66-9414-eb11-8da9-e4434bdf6706.jpeg

可以看出LightGBM单模既可以得到第一名的成绩,不过,为了追求更高的分数,我们团队也做了更多的尝试。

主要创新

提出了一种基于Key-Value Memory的浮点数映射成向量的方法

  • 相较于直接使用浮点数,该方法保留更多的语义信息

  • 相较于分桶并作为类别特征的方法,该方法的相邻向量具有相关性

  • 相较于数值×向量的方法,该方法具有非线性的特点

解决Word2Vec和DeepWalk等无监督学习造成的数据泄露问题

  • 充分利用了曝光日志记录,基于用户行为对广告进行聚类

问题思考

本次比赛虽然使用到出价,但并没有将出价作为特征输入模型中。不同的出价其广告的竞争力会有所不同,将直接影响了曝光量,因此出价是非常重要的特征。

  • 加入约束条件保证模型的单调性

  • 设计出价单调递增的模型,如输出为 4b77bc66-9414-eb11-8da9-e4434bdf6706.svg

本次比赛并没有用到用户属性相关数据,根据广告投放人群信息,或许可以获得更多有用的内容。

总结

本文提供2019年腾讯广告算法大赛冠军的代码分享。

github:

https://github.com/guoday/Tencent2019_Preliminary_Rank1st

作者公众号:kaggle竞赛宝典,一个用心分享算法的地方!


●编号880,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

4f77bc66-9414-eb11-8da9-e4434bdf6706.jpeg

Python编程

更多推荐25个技术类公众微信

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

cmos全局曝光算法_2019腾讯广告算法大赛方案分享(冠军)相关推荐

  1. 百万奖池,鹅厂offer,2020腾讯广告算法大赛等你来战!

    允中 发自 凹非寺  量子位 编辑 | 公众号 QbitAI 2020腾讯广告算法大赛再度起航,即日起至5月31日,赛事正式面向全社会启动线上招募,一场算法之间的"巅峰对决"即将上 ...

  2. 腾讯广告算法大赛2020-广告产品种类单特征-入门级

    文章目录 1.比赛背景 1.1 题目: 1.2 大赛简介 1.3 赛题描述 1.4 数据说明 1.4.1 数据集 1.4.2 数据特征说明 1.5 提交方式 1.6 评估方式 2.数据集处理 2.1导 ...

  3. 2019腾讯广告算法大赛方案分享(冠军)

    写在前面 队伍介绍:哈尔滨工业大学二年级硕士生刘育源.中山大学微软亚洲研究院联合培养博士生郭达雅和京东算法工程师王贺. 本文将给出冠军完整方案,全文内容架构将依托于答辩PPT,具体细节也会结合代码进行 ...

  4. 腾讯广告算法大赛 | 专家开小灶,独家解析Lookalike那些事儿

    相似人群拓展(Lookalike)技术作为2018腾讯广告算法大赛赛题,考察选手的算法能否在大量备选人群中准确标定与种子人群包特征相符的人群.本次大赛联动腾讯各方资源,携手知名学术专家为行业带来一场广 ...

  5. 一文梳理2019年腾讯广告算法大赛冠军方案

    ‍‍ 点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作为从本次比赛共157队伍中脱颖而出的冠军方案,评分达到87.9683,从数据清 ...

  6. 备战2020腾讯广告算法大赛:(2017-2019比赛开源和数据等)

    期待与各位在2020腾讯社交广告算法大赛中相遇!!! 写在前面 最近突然之间讨论腾讯广告赛的人多了不少,也有很多人加我微信讨论19年腾讯赛的方案和代码.虽然2020腾讯赛还未开始,不过大家已经提前进入 ...

  7. 大神备赛干货:腾讯广告算法大赛冠军教你玩出大赛新高度

    2019年腾讯广告算法大赛的战鼓已然敲响.今年的大赛将广告曝光预估作为选题,紧紧贴合了最in的数字营销趋势,将理论模型应用于实践. 为了更好的帮助大家准备今年的赛事,本期我们特地邀请了李强同学为大家分 ...

  8. 腾讯广告算法大赛 | 这是一篇雪中送炭的赛题宝典

    腾讯广告算法大赛初赛已经开战!你踏入战场了没?无论你是否已经小试了一把牛刀,都不要错过这篇来自出题人的第一手赛题详解,为你拨开迷雾,助你赢在起跑线上: ** 赛题背景:广告曝光预估如何应用在实际业务中 ...

  9. 2019腾讯广告算法大赛完美收官,算法达人鹅厂“出道”

    7月8日,2019腾讯广告算法大赛"终极之战"在深圳腾讯滨海大厦顺利举行.在前两届成功经验的基础上,今年大赛在赛题专业性和赛事体验上都有了更大的提升,进而吸引了更多海内外优秀选手参 ...

最新文章

  1. 免高考!2021清华北大保送名单公布,五大学科竞赛260人获保送资格
  2. 在jupyter中使用matlab
  3. Nhibernate分页测试续(附源码)
  4. [转]移动端页面开发资源总结及技巧
  5. 腾讯朱华:数据中心下一个风向的探索
  6. 有道云笔记导入到CSDN博客
  7. 服务器link系统命令,可以使用命令(7)来查看网络接口的运行情况。输入该命令后,系统的输出信息如下。...
  8. Qt5.12 安装教程windows
  9. Adobe illustrator如何修改默认字体
  10. 读《天才在左,疯子在右》01--偷取时间
  11. Matlab 直方图均衡化
  12. TFT显示屏参数设置
  13. 联想拯救者y7000p加内存条_联想 拯救者Y7000P 怎么升级内存?
  14. 云服务器怎么换ip云服务器,云服务器换ip难不难?云服务器换IP的步骤
  15. 倒置字符串 将一句话的单词进行倒置,标点不倒置。
  16. python 使用poster模块进行http方式的文件传输到服务器的方法
  17. Android Framework 包管理子系统(03)应用安装
  18. RedHat7使用yum源安装依赖包
  19. Scrapy爬取北京公交并保存MYSQL数据库实例
  20. (伟大的dfs)洛谷P4961 小埋与扫雷

热门文章

  1. 视频播放器的极致体验优化
  2. 音频开发中常见的四个错误
  3. 扶凯:海量视频和用户时代的CDN
  4. AV1:下一代视频标准—约束定向增强滤波器
  5. 2018:WebRTC开发五大趋势
  6. 腾讯开源负责人许勇:未来开源计划重点是AI和服务小程序生态
  7. windows10 python3.5 opencv3
  8. Python机器学习Numpy, Scipy, Pandas, Scikit-learn, Matplotlib, Keras, NN速查手册
  9. MNIST数据可视化
  10. Vue012_ 自定义插件