轉(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)信息
2. 目標(biāo)
預(yù)測廣告的日曝光量
3. 評價指標(biāo)
評價指標(biāo)由兩部分組成洽议,準(zhǔn)確性指標(biāo)和出價單調(diào)性指標(biāo)宗收。
最終得分是將兩個指標(biāo)組合一起,前者控制準(zhǔn)確性亚兄,后者控制單調(diào)性混稽。
4. 訓(xùn)練目標(biāo)
這里我們對訓(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ù)集劃分
這部分也是我們隊伍的一個關(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. 特征提取思路
提取思路主要從兩部分考慮,歷史信息和整體信息笋熬,更細(xì)致些就是前一天碟渺、最近五天、五折交叉統(tǒng)計和除當(dāng)天外所有天的統(tǒng)計特征突诬。
接下來我們構(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)鍵周拐。
這里我進(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ò)展
經(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
(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的算法流程:
第一步:構(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
這里有兩個問題:
- 只有在日志中曝光過的廣告才會有相應(yīng)的嵌入向量匕争,通過廣告有無嵌入向量避乏,會泄露了無曝光廣告的標(biāo)簽
- 測試數(shù)據(jù)中存在曝光非0但無嵌入向量的廣告,這在訓(xùn)練集中是不存在的甘桑,導(dǎo)致訓(xùn)練測試不一致
這里我們給出了解決方法拍皮,即隨機(jī)掩蓋掉5%廣告的嵌入向量歹叮,保證訓(xùn)練集中也能出現(xiàn)無曝光的廣告。
模型介紹
輸入部分分為四組铆帽,分別是類別特征咆耿、經(jīng)過Key-Value Memory處理的稠密特征、Word2Vec和DeepWalk得到了embedding向量爹橱。然后進(jìn)入Batch Norm Layer萨螺,最后是MLP層。
壓縮交互網(wǎng)絡(luò)CIN
我們使用了壓縮交互網(wǎng)絡(luò)(CIN)愧驱,它考慮了以下因素:
(1)交互是在向量層次上應(yīng)用的慰技,而不是在位層次上;
(2)高階特征交互是明確測量的组砚;
(3)網(wǎng)絡(luò)的復(fù)雜度不會隨著相互作用的程度惹盼。
每個維度上的外積用于特征交互。張量是進(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ù)到向量的映射手报。
參考論文:
https://arxiv.org/pdf/1606.03126.pdf
規(guī)則統(tǒng)計
先讓我們進(jìn)行一些基本的數(shù)據(jù)分析,這里看的是歷史曝光數(shù)據(jù)改化。
最終融合
無論是模型還是規(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單模既可以得到第一名的成績阳藻,不過,為了追求更高的分?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)遞增的模型,如輸出為
本次比賽并沒有用到用戶屬性相關(guān)數(shù)據(jù)光稼,根據(jù)廣告投放人群信息或南,或許可以獲得更多有用的內(nèi)容逻住。
參考內(nèi)容:https://zhuanlan.zhihu.com/p/64200072