2019騰訊廣告算法大賽方案分享(冠軍)

轉(zhuǎn)載自https://zhuanlan.zhihu.com/p/73062485

俞士綸(Philip S. Yu)教授的評價“冠軍隊伍已經(jīng)在有意無意使用“廣度學(xué)習(xí)”的方法”
評委講到“這是最接近騰訊真實業(yè)務(wù)的方案”

復(fù)賽代碼地址:

https://github.com/bettenW/Tencent2019_Finals_Rank1st

本文將給出冠軍完整方案,全文內(nèi)容架構(gòu)將依托于答辯PPT,具體細(xì)節(jié)也會結(jié)合代碼進(jìn)行講解加派。當(dāng)然但金,思路為主敏弃,代碼為輔盏浇,希望這篇分享能夠給予你更多的啟發(fā)。

賽題理解

1.數(shù)據(jù)

歷史日志數(shù)據(jù):廣告請求時間贩挣、用戶id剂碴、廣告位id把将、競價廣告信息等
用戶信息數(shù)據(jù):包含用戶id、年齡忆矛、性別察蹲、地域请垛、行為興趣等
廣 告 數(shù) 據(jù):廣告操作信息、廣告靜態(tài)信息


特征.jpg
2. 目標(biāo)

預(yù)測廣告的日曝光量

3. 評價指標(biāo)

評價指標(biāo)由兩部分組成洽议,準(zhǔn)確性指標(biāo)和出價單調(diào)性指標(biāo)宗收。


image.png

最終得分是將兩個指標(biāo)組合一起,前者控制準(zhǔn)確性亚兄,后者控制單調(diào)性混稽。


image.png
4. 訓(xùn)練目標(biāo)
image.png

這里我們對訓(xùn)練目標(biāo)進(jìn)行了不斷優(yōu)化,首先是最基本的訓(xùn)練目標(biāo)审胚,即廣告日曝光量匈勋。然后考慮到0會導(dǎo)致梯度不平滑,所以對訓(xùn)練目標(biāo)做了log變換膳叨,保證梯度平滑洽洁。
為了符合業(yè)務(wù)直覺,我們在訓(xùn)練時進(jìn)行了單調(diào)性的考慮菲嘴,而不是在訓(xùn)練后進(jìn)行單調(diào)性修正饿自。即考慮了出價變量,保證訓(xùn)練出來的結(jié)果符合單調(diào)性临谱。
最后將基礎(chǔ)曝光的訓(xùn)練目標(biāo)和考慮單調(diào)性的訓(xùn)練目標(biāo)進(jìn)行結(jié)合璃俗,也就得到了最后一個公式奴璃,即一個模型預(yù)測基本訓(xùn)練目標(biāo)悉默,一個模型預(yù)測考慮單調(diào)性的訓(xùn)練目標(biāo)。

5. 數(shù)據(jù)集劃分
image.png

這部分也是我們隊伍的一個關(guān)鍵提分點苟穆,能從87.6提升到87.8抄课,當(dāng)然在我剛87.x分段時,能提升4個千分點雳旅。
我們知道復(fù)賽A榜訓(xùn)練集和測試集是連續(xù)的跟磨,即10號-22號訓(xùn)練集,23號為測試集攒盈。復(fù)賽B榜則是不連續(xù)的抵拘,沒有給出23號的標(biāo)簽,直接預(yù)測24號型豁。
面對這種“跨天”預(yù)測僵蛛,難度是非常大的,因為日期越近的信息是越與當(dāng)天相近的迎变,因此前一天的信息是非常重要的充尉。
所以我們利用“遠(yuǎn)程監(jiān)督”的方式,就是利用現(xiàn)有的標(biāo)注數(shù)據(jù)衣形,即10-22號數(shù)據(jù)驼侠,訓(xùn)練一個模型,給未標(biāo)注數(shù)據(jù)(23號數(shù)據(jù))進(jìn)行標(biāo)注,然后再將10-22與23號合并成訓(xùn)練集進(jìn)行訓(xùn)練倒源,預(yù)測最終的結(jié)果苛预。

特征工程

1. 特征提取思路
image.png

提取思路主要從兩部分考慮,歷史信息和整體信息笋熬,更細(xì)致些就是前一天碟渺、最近五天、五折交叉統(tǒng)計和除當(dāng)天外所有天的統(tǒng)計特征突诬。


image.png

接下來我們構(gòu)造了四個基礎(chǔ)特征苫拍,大部分的統(tǒng)計特征都是圍繞著這四個來構(gòu)造的。當(dāng)然我這里還考慮了商品ID和賬戶ID的構(gòu)造旺隙,代碼如下:

# 構(gòu)造基本特征
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. 如何構(gòu)造新廣告的特征

初賽A 總廣告:1954 舊廣告: 1361 新廣告:593 新廣告占比:30.348%
初賽B 總廣告:3750 舊廣告: 1382 新廣告:2368 新廣告占比:63.147%
上面是對初賽新舊廣告的統(tǒng)計绒极,當(dāng)然復(fù)賽也存在大量的新廣告,復(fù)賽B榜新舊廣告基本55開蔬捷。新廣告是沒有歷史信息的垄提,所以如何構(gòu)造新廣告的特征,對新廣告進(jìn)行歷史和整體性的描述成了提分的關(guān)鍵周拐。


image.png

這里我進(jìn)行了模糊構(gòu)造铡俐,雖然我們不知道新廣告的歷史信息,但是我們知道廣告賬戶ID下面所包含舊廣告的歷史信息妥粟。因此审丘,將廣告賬戶ID與舊廣告的廣告竟勝率進(jìn)行組合,可以構(gòu)造出廣告賬戶ID下廣告竟勝率的均值/中位數(shù)等勾给。這樣我們就可以得到了新廣告在廣告賬戶ID下廣告竟勝率的統(tǒng)計值滩报。
這里可以構(gòu)造前一天、最近五天播急、五折交叉統(tǒng)計和除當(dāng)天外所有天等統(tǒng)計特征脓钾。

3. 進(jìn)一步擴(kuò)展
image.png

經(jīng)過上面的構(gòu)造,可以得到很多新構(gòu)造的統(tǒng)計特征桩警,可以是前一天的可训、最近五天的,或者五折交叉統(tǒng)計的捶枢。我把這些值成為“假數(shù)值”握截,相對的就是“真數(shù)值”,即每天我們都知道廣告的競爭總次數(shù)(從10-24號數(shù)據(jù)柱蟀,包括測試集)川蒙。將假數(shù)值和真數(shù)值進(jìn)行交叉,如廣告競爭勝率(假)*廣告競爭總數(shù)(真)长已,這樣就能得到的更接近真實值的特征畜眨。

4. word2vec和deepwalk
image.png

(1) word2vec
這里我們提取了用戶的曝光記錄昼牛,并將其轉(zhuǎn)化為文本序列,然后使用word2vec算法對廣告進(jìn)行嵌入康聂,就可以得到關(guān)于廣告ID的embedding贰健,或者商品ID的embedding。
具體構(gòu)建文本序列方式恬汁,首先是對日志數(shù)據(jù)按天進(jìn)行排序伶椿,然后是按天構(gòu)建uid的行為序列并轉(zhuǎn)化為文本。代碼如下:

#log日志數(shù)據(jù)氓侧,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]) 

接下來就是構(gòu)建廣告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]

這里不僅可以構(gòu)造uid到廣告id约巷,還可以是uid到商品id偎痛,uid到賬戶id。
(2)DeepWalk
在推薦場景下独郎,數(shù)據(jù)對象之間更多呈現(xiàn)的是圖結(jié)構(gòu)踩麦。典型的場景是由用戶行為數(shù)據(jù)生成的和廣告的全局關(guān)系圖。這個時候word2vec就不能很好的展現(xiàn)這層關(guān)系氓癌,所以我們選擇了Graph Embeding的方式谓谦,具體的使用了DeepWalk,可以將用戶的曝光記錄轉(zhuǎn)化為關(guān)系圖贪婉。這里引用阿里論文中的一張圖反粥,來展現(xiàn)DeepWalk的算法流程:

image.png

第一步:構(gòu)建用戶的行為序列
第二步:我們基于這些行為序列構(gòu)建了物品關(guān)系圖,可以看出谓松,物品A星压,B之間的邊產(chǎn)生的原因就是因為用戶U1先后購買了物品A和物品B践剂,所以產(chǎn)生了一條由A到B的有向邊鬼譬。如果后續(xù)產(chǎn)生了多條相同的有向邊,則有向邊的權(quán)重被加強(qiáng)逊脯。在將所有用戶行為序列都轉(zhuǎn)換成物品相關(guān)圖中的邊之后优质,全局的物品相關(guān)圖就建立起來了。
第三步:采用隨機(jī)游走的方式隨機(jī)選擇起始點军洼,重新產(chǎn)生物品序列巩螃。
第四步:最終將這些物品序列輸入word2vec模型,生成最終的物品Embedding向量
具體對應(yīng)代碼如下:
https://github.com/guoday/Tencent2019_Preliminary_Rank1st

這里有兩個問題:

  1. 只有在日志中曝光過的廣告才會有相應(yīng)的嵌入向量匕争,通過廣告有無嵌入向量避乏,會泄露了無曝光廣告的標(biāo)簽
  2. 測試數(shù)據(jù)中存在曝光非0但無嵌入向量的廣告,這在訓(xùn)練集中是不存在的甘桑,導(dǎo)致訓(xùn)練測試不一致
    這里我們給出了解決方法拍皮,即隨機(jī)掩蓋掉5%廣告的嵌入向量歹叮,保證訓(xùn)練集中也能出現(xiàn)無曝光的廣告。

模型介紹

image.png

輸入部分分為四組铆帽,分別是類別特征咆耿、經(jīng)過Key-Value Memory處理的稠密特征、Word2Vec和DeepWalk得到了embedding向量爹橱。然后進(jìn)入Batch Norm Layer萨螺,最后是MLP層。

壓縮交互網(wǎng)絡(luò)CIN

image.png

我們使用了壓縮交互網(wǎng)絡(luò)(CIN)愧驱,它考慮了以下因素:
(1)交互是在向量層次上應(yīng)用的慰技,而不是在位層次上;
(2)高階特征交互是明確測量的组砚;
(3)網(wǎng)絡(luò)的復(fù)雜度不會隨著相互作用的程度惹盼。
image.png

每個維度上的外積用于特征交互。張量是進(jìn)一步學(xué)習(xí)的中間結(jié)果惫确。
具體的可以看論文xDeepFM:
http://xueshu.baidu.com/usercenter/paper/show?paperid=6cd34089953a68a3f89066228cb2bdd5&site=xueshu_se

Key-Value Memory

這里將介紹鍵值存儲(Key-Value Memory)的神經(jīng)模型實現(xiàn)浮點數(shù)到向量的映射手报。

image.png

image.png

參考論文:
https://arxiv.org/pdf/1606.03126.pdf

規(guī)則統(tǒng)計

先讓我們進(jìn)行一些基本的數(shù)據(jù)分析,這里看的是歷史曝光數(shù)據(jù)改化。


image.png

image.png

image.png

image.png

最終融合

image.png

image.png

image.png

無論是模型還是規(guī)則掩蛤,預(yù)測結(jié)果在不同的轉(zhuǎn)化類型上得分差異都很大

模型和規(guī)則在不同的轉(zhuǎn)化類型上得分也存在差 異,上圖表示了模型和規(guī)則在不同轉(zhuǎn)化類型上的表現(xiàn)陈肛。
根據(jù)模型和規(guī)則在不同轉(zhuǎn)化類型上的得分現(xiàn)揍鸟,調(diào)整權(quán)重值,線上可以獲得0.5個千的提升 句旱。

結(jié)果分析

image.png

可以看出LightGBM單模既可以得到第一名的成績阳藻,不過,為了追求更高的分?jǐn)?shù)谈撒,我們團(tuán)隊也做了更多的嘗試腥泥。

主要創(chuàng)新

(1)提出了一種基于Key-Value Memory的浮點數(shù)映射成向量的方法
相較于直接使用浮點數(shù),該方法保留更多的語義信息
相較于分桶并作為類別特征的方法啃匿,該方法的相鄰向量具有相關(guān)性
相較于數(shù)值×向量的方法蛔外,該方法具有非線性的特點
(2)解決Word2Vec和DeepWalk等無監(jiān)督學(xué)習(xí)造成的數(shù)據(jù)泄露問題
充分利用了曝光日志記錄,基于用戶行為對廣告進(jìn)行聚類

問題思考

本次比賽雖然使用到出價溯乒,但并沒有將出價作為特征輸入模型中夹厌。不同的出價其廣告的競爭力會有所不同,將直接影響了曝光量裆悄,因此出價是非常重要的特征矛纹。

  • 加入約束條件保證模型的單調(diào)性
  • 設(shè)計出價單調(diào)遞增的模型,如輸出為f(x)+|g(x)|\times log(1+出價)

本次比賽并沒有用到用戶屬性相關(guān)數(shù)據(jù)光稼,根據(jù)廣告投放人群信息或南,或許可以獲得更多有用的內(nèi)容逻住。
參考內(nèi)容:https://zhuanlan.zhihu.com/p/64200072

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迎献,隨后出現(xiàn)的幾起案子瞎访,更是在濱河造成了極大的恐慌,老刑警劉巖吁恍,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒秸,死亡現(xiàn)場離奇詭異,居然都是意外死亡冀瓦,警方通過查閱死者的電腦和手機(jī)伴奥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼闽,“玉大人拾徙,你說我怎么就攤上這事「芯郑” “怎么了尼啡?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長询微。 經(jīng)常有香客問我崖瞭,道長,這世上最難降的妖魔是什么撑毛? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任书聚,我火速辦了婚禮,結(jié)果婚禮上藻雌,老公的妹妹穿的比我還像新娘雌续。我一直安慰自己,他們只是感情好胯杭,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布驯杜。 她就那樣靜靜地躺著,像睡著了一般歉摧。 火紅的嫁衣襯著肌膚如雪艇肴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天叁温,我揣著相機(jī)與錄音,去河邊找鬼核畴。 笑死膝但,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谤草。 我是一名探鬼主播跟束,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莺奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冀宴?” 一聲冷哼從身側(cè)響起灭贷,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略贮,沒想到半個月后甚疟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡逃延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年览妖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽祥。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡讽膏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拄丰,到底是詐尸還是另有隱情府树,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布料按,位于F島的核電站挺尾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏站绪。R本人自食惡果不足惜遭铺,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恢准。 院中可真熱鬧魂挂,春花似錦、人聲如沸馁筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敏沉。三九已至果正,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盟迟,已是汗流浹背秋泳。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留攒菠,地道東北人迫皱。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像辖众,于是被迫代替她去往敵國和親卓起。 傳聞我的和親對象是個殘疾皇子和敬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容