cmos全局曝光算法_2019腾讯广告算法大赛方案分享(冠军)
來自公眾號:機器學(xué)習(xí)初學(xué)者
本文提供2019年騰訊廣告算法大賽冠軍的代碼分享。
俞士綸(Philip S. Yu)教授的評價“冠軍隊伍已經(jīng)在有意無意使用“廣度學(xué)習(xí)”的方法”,評委講到“這是最接近騰訊真實業(yè)務(wù)的方案”。(本文作者:王賀)
寫在前面
隊伍介紹:哈爾濱工業(yè)大學(xué)二年級碩士生劉育源、中山大學(xué)微軟亞洲研究院聯(lián)合培養(yǎng)博士生郭達雅和京東算法工程師王賀。
本文將給出冠軍完整方案,全文內(nèi)容架構(gòu)將依托于答辯PPT,具體細節(jié)也會結(jié)合代碼進行講解。當然,思路為主,代碼為輔,希望這篇分享能夠給予你更多的啟發(fā)。
下面就讓跟隨我一起探索這榮獲最高嘉獎的方案 !
賽題理解
賽題鏈接:
https://algo.qq.com
數(shù)據(jù)
歷史日志數(shù)據(jù):廣告請求時間、用戶id、廣告位id、競價廣告信息等
用戶信息數(shù)據(jù):包含用戶id、年齡、性別、地域、行為興趣等
廣 告 數(shù) 據(jù):廣告操作信息、廣告靜態(tài)信息
2. 目標
預(yù)測廣告的日曝光量
3. 評價指標
評價指標由兩部分組成,準確性指標和出價單調(diào)性指標。
最終得分是將兩個指標組合一起,前者控制準確性,后者控制單調(diào)性。
4. 訓(xùn)練目標
這里我們對訓(xùn)練目標進行了不斷優(yōu)化,首先是最基本的訓(xùn)練目標,即廣告日曝光量。然后考慮到0會導(dǎo)致梯度不平滑,所以對訓(xùn)練目標做了log變換,保證梯度平滑。
為了符合業(yè)務(wù)直覺,我們在訓(xùn)練時進行了單調(diào)性的考慮,而不是在訓(xùn)練后進行單調(diào)性修正。即考慮了出價變量,保證訓(xùn)練出來的結(jié)果符合單調(diào)性。
最后將基礎(chǔ)曝光的訓(xùn)練目標和考慮單調(diào)性的訓(xùn)練目標進行結(jié)合,也就得到了最后一個公式,即一個模型預(yù)測基本訓(xùn)練目標,一個模型預(yù)測考慮單調(diào)性的訓(xùn)練目標。
5. 數(shù)據(jù)集劃分
這部分也是我們隊伍的一個關(guān)鍵提分點,能從87.6提升到87.8,當然在我剛87.x分段時,能提升4個千分點。
我們知道復(fù)賽A榜訓(xùn)練集和測試集是連續(xù)的,即10號-22號訓(xùn)練集,23號為測試集。復(fù)賽B榜則是不連續(xù)的,沒有給出23號的標簽,直接預(yù)測24號。
面對這種“跨天”預(yù)測,難度是非常大的,因為日期越近的信息是越與當天相近的,因此前一天的信息是非常重要的。
所以我們利用“遠程監(jiān)督”的方式,就是利用現(xiàn)有的標注數(shù)據(jù),即10-22號數(shù)據(jù),訓(xùn)練一個模型,給未標注數(shù)據(jù)(23號數(shù)據(jù))進行標注,然后再將10-22與23號合并成訓(xùn)練集進行訓(xùn)練,預(yù)測最終的結(jié)果。
特征工程
1. 特征提取思路
提取思路主要從兩部分考慮,歷史信息和整體信息,更細致些就是前一天、最近五天、五折交叉統(tǒng)計和除當天外所有天的統(tǒng)計特征。
接下來我們構(gòu)造了四個基礎(chǔ)特征,大部分的統(tǒng)計特征都是圍繞著這四個來構(gòu)造的。當然我這里還考慮了商品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)計,當然復(fù)賽也存在大量的新廣告,復(fù)賽B榜新舊廣告基本55開。新廣告是沒有歷史信息的,所以如何構(gòu)造新廣告的特征,對新廣告進行歷史和整體性的描述成了提分的關(guān)鍵。
這里我進行了模糊構(gòu)造,雖然我們不知道新廣告的歷史信息,但是我們知道廣告賬戶ID下面所包含舊廣告的歷史信息。因此,將廣告賬戶ID與舊廣告的廣告竟勝率進行組合,可以構(gòu)造出廣告賬戶ID下廣告竟勝率的均值/中位數(shù)等。這樣我們就可以得到了新廣告在廣告賬戶ID下廣告竟勝率的統(tǒng)計值。
這里可以構(gòu)造前一天、最近五天、五折交叉統(tǒng)計和除當天外所有天等統(tǒng)計特征。
3. 進一步擴展
經(jīng)過上面的構(gòu)造,可以得到很多新構(gòu)造的統(tǒng)計特征,可以是前一天的、最近五天的,或者五折交叉統(tǒng)計的。我把這些值成為“假數(shù)值”,相對的就是“真數(shù)值”,即每天我們都知道廣告的競爭總次數(shù)(從10-24號數(shù)據(jù),包括測試集)。將假數(shù)值和真數(shù)值進行交叉,如廣告競爭勝率(假)*廣告競爭總數(shù)(真),這樣就能得到的更接近真實值的特征。
4. word2vec和deepwalk
word2vec
這里我們提取了用戶的曝光記錄,并將其轉(zhuǎn)化為文本序列,然后使用word2vec算法對廣告進行嵌入,就可以得到關(guān)于廣告ID的embedding,或者商品ID的embedding。
具體構(gòu)建文本序列方式,首先是對日志數(shù)據(jù)按天進行排序,然后是按天構(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)這里不僅可以構(gòu)造uid到廣告id,還可以是uid到商品id,uid到賬戶id。
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的算法流程:
DeepWalk的算法流程(引自阿里論文)第一步:構(gòu)建用戶的行為序列
第二步:我們基于這些行為序列構(gòu)建了物品關(guān)系圖,可以看出,物品A,B之間的邊產(chǎn)生的原因就是因為用戶U1先后購買了物品A和物品B,所以產(chǎn)生了一條由A到B的有向邊。如果后續(xù)產(chǎn)生了多條相同的有向邊,則有向邊的權(quán)重被加強。在將所有用戶行為序列都轉(zhuǎn)換成物品相關(guān)圖中的邊之后,全局的物品相關(guān)圖就建立起來了。
第三步:采用隨機游走的方式隨機選擇起始點,重新產(chǎn)生物品序列。
第四步:最終將這些物品序列輸入word2vec模型,生成最終的物品Embedding向量
具體對應(yīng)代碼如下:
https://github.com/guoday/Tencent2019_Preliminary_Rank1st
這里有兩個問題:
1. 只有在日志中曝光過的廣告才會有相應(yīng)的嵌入向量,通過廣告有無嵌入向量,會泄露了無曝光廣告的標簽
2. 測試數(shù)據(jù)中存在曝光非0但無嵌入向量的廣告,這在訓(xùn)練集中是不存在的,導(dǎo)致訓(xùn)練測試不一致
這里我們給出了解決方法,即隨機掩蓋掉5%廣告的嵌入向量,保證訓(xùn)練集中也能出現(xiàn)無曝光的廣告。
模型介紹
輸入部分分為四組,分別是類別特征、經(jīng)過Key-Value Memory處理的稠密特征、Word2Vec和DeepWalk得到了embedding向量。然后進入Batch Norm Layer,最后是MLP層。
壓縮交互網(wǎng)絡(luò)CIN
我們使用了壓縮交互網(wǎng)絡(luò)(CIN),它考慮了以下因素:
(1)交互是在向量層次上應(yīng)用的,而不是在位層次上;
(2)高階特征交互是明確測量的;
(3)網(wǎng)絡(luò)的復(fù)雜度不會隨著相互作用的程度。
每個維度上的外積用于特征交互。張量??是進一步學(xué)習(xí)的中間結(jié)果。
具體的可以看論文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)的神經(jīng)模型實現(xiàn)浮點數(shù)到向量的映射。
具體步驟:
(1)Key addressing部分,尋址過程,此處用到softmax函數(shù)。計算上述選出的每個memory的概率值。?
(2)Attention部分,對于不同的Key addression部分的重要性不同,所以使用attention給予不同的權(quán)重概率。
(3)Value reading部分,對上一個步驟的概率下進行加權(quán)求和得到答案信息。?
規(guī)則統(tǒng)計
先讓我們進行一些基本的數(shù)據(jù)分析,這里看的是歷史曝光數(shù)據(jù)。
一個廣告在不同的廣告位上有不同的勝率同廣告的請求數(shù)在不同的日期存在差異可以看出對于同一個廣告在不同廣告位上有著不同的勝率,并且在不同的日期,它的請求數(shù)也存在很大的差異。針對這兩點因素,也就能構(gòu)造出統(tǒng)計方式來計算廣告日曝光量。
其中,??表示廣告在廣告位??上的歷史勝率。??表示廣告在廣告位?上發(fā)出的請求總數(shù)。
這里我們對比了三種計算方法,可以看出,直接用歷史曝光填充效果最差。接下來就是用競爭勝率*請求數(shù),分數(shù)會高很多,更近一步就是按廣告位分開計算,達到最好的效果。這里是在驗證集上進行的計算。
歷史勝率??的具體計算方式
先來看一張圖
不同天數(shù)填充在驗證集上的得分最直觀的感受就是,離預(yù)測當天越近的數(shù)據(jù)準確度越高,所以相應(yīng)的權(quán)重也應(yīng)該越大。這樣我們就可以給歷史每天不同的權(quán)重,然后進行加權(quán)。就可以得到歷史勝率的計算公式,如下:
權(quán)重??計算方式
我們提出了三種計算方法:
方式1:
方式2:?
方式3:?
這里使用線性搜索尋找最優(yōu)參數(shù)(??),依據(jù)驗證集分數(shù)來確定最優(yōu)參數(shù)的選擇。
在最優(yōu)參數(shù)下三總方式在驗證集上的得分對比這里我們對三種權(quán)重計算方式進行對比,并添加最后一直接填充作為對照實驗??梢悦黠@看出方法三在驗證集上的效果最好。
最終融合
這里使用兩種融合方式,分別是算術(shù)平均和幾何平均。
算術(shù)平均:
幾何平均:?
由于??的評分規(guī)則,算術(shù)平均會使融合的結(jié)果偏大,如:
顯然不符合??的直覺,越小的值對評分影響越大,算術(shù)平均會導(dǎo)致更大的誤差。所以選擇幾何平均,能夠使結(jié)果偏向小值,如下:
模型、規(guī)則以及不同融合方式驗證集得分對比:
更細致的融合方式:
模型和規(guī)則在不同的轉(zhuǎn)化類型上的得分無論是模型還是規(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é)果分析
可以看出LightGBM單模既可以得到第一名的成績,不過,為了追求更高的分數(shù),我們團隊也做了更多的嘗試。
主要創(chuàng)新
提出了一種基于Key-Value Memory的浮點數(shù)映射成向量的方法
相較于直接使用浮點數(shù),該方法保留更多的語義信息
相較于分桶并作為類別特征的方法,該方法的相鄰向量具有相關(guān)性
相較于數(shù)值×向量的方法,該方法具有非線性的特點
解決Word2Vec和DeepWalk等無監(jiān)督學(xué)習(xí)造成的數(shù)據(jù)泄露問題
充分利用了曝光日志記錄,基于用戶行為對廣告進行聚類
問題思考
本次比賽雖然使用到出價,但并沒有將出價作為特征輸入模型中。不同的出價其廣告的競爭力會有所不同,將直接影響了曝光量,因此出價是非常重要的特征。
加入約束條件保證模型的單調(diào)性
設(shè)計出價單調(diào)遞增的模型,如輸出為?
本次比賽并沒有用到用戶屬性相關(guān)數(shù)據(jù),根據(jù)廣告投放人群信息,或許可以獲得更多有用的內(nèi)容。
總結(jié)
本文提供2019年騰訊廣告算法大賽冠軍的代碼分享。
github:
https://github.com/guoday/Tencent2019_Preliminary_Rank1st
作者公眾號:kaggle競賽寶典,一個用心分享算法的地方!
●編號880,輸入編號直達本文
●輸入m獲取文章目錄
推薦↓↓↓Python編程
更多推薦《25個技術(shù)類公眾微信》
涵蓋:程序人生、算法與數(shù)據(jù)結(jié)構(gòu)、黑客技術(shù)與網(wǎng)絡(luò)安全、大數(shù)據(jù)技術(shù)、前端開發(fā)、Java、Python、Web開發(fā)、安卓開發(fā)、iOS開發(fā)、C/C++、.NET、Linux、數(shù)據(jù)庫、運維等。
總結(jié)
以上是生活随笔為你收集整理的cmos全局曝光算法_2019腾讯广告算法大赛方案分享(冠军)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql安装了老版本_Windows环
- 下一篇: php 腾讯云 文字识别_腾讯云安全为何