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

转载自https://zhuanlan.zhihu.com/p/73062485

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

复赛代码地址:

https://github.com/bettenW/Tencent2019_Finals_Rank1st

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

赛题理解

1.数据

历史日志数据:广告请求时间、用户id、广告位id、竞价广告信息等
用户信息数据:包含用户id、年龄、性别、地域、行为兴趣等
广 告 数 据:广告操作信息、广告静态信息


特征.jpg
2. 目标

预测广告的日曝光量

3. 评价指标

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


image.png

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


image.png
4. 训练目标
image.png

这里我们对训练目标进行了不断优化,首先是最基本的训练目标,即广告日曝光量。然后考虑到0会导致梯度不平滑,所以对训练目标做了log变换,保证梯度平滑。
为了符合业务直觉,我们在训练时进行了单调性的考虑,而不是在训练后进行单调性修正。即考虑了出价变量,保证训练出来的结果符合单调性。
最后将基础曝光的训练目标和考虑单调性的训练目标进行结合,也就得到了最后一个公式,即一个模型预测基本训练目标,一个模型预测考虑单调性的训练目标。

5. 数据集划分
image.png

这部分也是我们队伍的一个关键提分点,能从87.6提升到87.8,当然在我刚87.x分段时,能提升4个千分点。
我们知道复赛A榜训练集和测试集是连续的,即10号-22号训练集,23号为测试集。复赛B榜则是不连续的,没有给出23号的标签,直接预测24号。
面对这种“跨天”预测,难度是非常大的,因为日期越近的信息是越与当天相近的,因此前一天的信息是非常重要的。
所以我们利用“远程监督”的方式,就是利用现有的标注数据,即10-22号数据,训练一个模型,给未标注数据(23号数据)进行标注,然后再将10-22与23号合并成训练集进行训练,预测最终的结果。

特征工程

1. 特征提取思路
image.png

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


image.png

接下来我们构造了四个基础特征,大部分的统计特征都是围绕着这四个来构造的。当然我这里还考虑了商品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开。新广告是没有历史信息的,所以如何构造新广告的特征,对新广告进行历史和整体性的描述成了提分的关键。


image.png

这里我进行了模糊构造,虽然我们不知道新广告的历史信息,但是我们知道广告账户ID下面所包含旧广告的历史信息。因此,将广告账户ID与旧广告的广告竟胜率进行组合,可以构造出广告账户ID下广告竟胜率的均值/中位数等。这样我们就可以得到了新广告在广告账户ID下广告竟胜率的统计值。
这里可以构造前一天、最近五天、五折交叉统计和除当天外所有天等统计特征。

3. 进一步扩展
image.png

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

4. word2vec和deepwalk
image.png

(1) word2vec
这里我们提取了用户的曝光记录,并将其转化为文本序列,然后使用word2vec算法对广告进行嵌入,就可以得到关于广告ID的embedding,或者商品ID的embedding。
具体构建文本序列方式,首先是对日志数据按天进行排序,然后是按天构建uid的行为序列并转化为文本。代码如下:

#log日志数据,pivot主键(uid),f(aid)
sentence=[]
dic={}
day=0
log=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)

values=set(log[f].values)
w2v=[]

for v in values:
    try:
        a=[int(v)]
        a.extend(model[str(v)])
        w2v.append(a)
    except:
        pass

out_df=pd.DataFrame(w2v)
names=[f]

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

image.png

第一步:构建用户的行为序列
第二步:我们基于这些行为序列构建了物品关系图,可以看出,物品A,B之间的边产生的原因就是因为用户U1先后购买了物品A和物品B,所以产生了一条由A到B的有向边。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品相关图中的边之后,全局的物品相关图就建立起来了。
第三步:采用随机游走的方式随机选择起始点,重新产生物品序列。
第四步:最终将这些物品序列输入word2vec模型,生成最终的物品Embedding向量
具体对应代码如下:
https://github.com/guoday/Tencent2019_Preliminary_Rank1st

这里有两个问题:

  1. 只有在日志中曝光过的广告才会有相应的嵌入向量,通过广告有无嵌入向量,会泄露了无曝光广告的标签
  2. 测试数据中存在曝光非0但无嵌入向量的广告,这在训练集中是不存在的,导致训练测试不一致
    这里我们给出了解决方法,即随机掩盖掉5%广告的嵌入向量,保证训练集中也能出现无曝光的广告。

模型介绍

image.png

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

压缩交互网络CIN

image.png

我们使用了压缩交互网络(CIN),它考虑了以下因素:
(1)交互是在向量层次上应用的,而不是在位层次上;
(2)高阶特征交互是明确测量的;
(3)网络的复杂度不会随着相互作用的程度。
image.png

每个维度上的外积用于特征交互。张量是进一步学习的中间结果。
具体的可以看论文xDeepFM:
http://xueshu.baidu.com/usercenter/paper/show?paperid=6cd34089953a68a3f89066228cb2bdd5&site=xueshu_se

Key-Value Memory

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

image.png

image.png

参考论文:
https://arxiv.org/pdf/1606.03126.pdf

规则统计

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


image.png

image.png

image.png

image.png

最终融合

image.png

image.png

image.png

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

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

结果分析

image.png

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

主要创新

(1)提出了一种基于Key-Value Memory的浮点数映射成向量的方法
相较于直接使用浮点数,该方法保留更多的语义信息
相较于分桶并作为类别特征的方法,该方法的相邻向量具有相关性
相较于数值×向量的方法,该方法具有非线性的特点
(2)解决Word2Vec和DeepWalk等无监督学习造成的数据泄露问题
充分利用了曝光日志记录,基于用户行为对广告进行聚类

问题思考

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

  • 加入约束条件保证模型的单调性
  • 设计出价单调递增的模型,如输出为f(x)+|g(x)|\times log(1+出价)

本次比赛并没有用到用户属性相关数据,根据广告投放人群信息,或许可以获得更多有用的内容。
参考内容:https://zhuanlan.zhihu.com/p/64200072

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容