Display Advertising Challenge
---------2015/1/12
一:背景
CriteoLabs 2014年7月份在kaggle上發起了一次關於展示廣告點擊率的預估比賽。CriteoLabs是第三方展示廣告的佼佼者,所以這次比賽吸引了很多團隊來參賽和體驗數據。
二:評估指標
比賽採用的評價指標是LoglLoss:
至於離線評估爲何更傾向採用logloss,而不是採用AUC值。Facebook在他們發佈的論文【1】中提到現實環境中更加關注預測的準確性,而不是相對的排序。而AUC值更側重相對排序,比如把整體的預測概率提升1倍,AUC值保持不變,但是logloss是有變化的。
三:訓練集和測試集數據分佈
訓練集: 4000w+, 測試集:600w+。
訓練集是連續7天的Criteo廣告展示數據,裏面包含點擊和非點擊數據。裏面對每天的負樣本進行了不同採樣率的採樣,使得整體的正負樣本比率不至於懸殊。
測試集是接着訓練集後的一天廣告展示數據,測試集的採樣方式和訓練集一致。
下面是kaggle上一位參賽者給出的訓練集點擊率分佈:
從上面很清楚的能看到7天週期性變化的數據,每天的點擊率變化,有衰減的趨勢,點擊率平均值大約處在0.25左右。
其中數據特徵介紹如下:
13個連續特徵,26個類目特徵。最終的效果提升更多體現在26個類目特徵的處理和變換上面。其中類目特徵要說明的是,有的類目特徵的屬性上萬,有的屬性展示和點擊都少。
四:模型
ctr預估在工業界是個相對成熟的話題,在計算廣告領域尤爲重要,很多成熟的解決方案。我知道很多團隊目前logistic regression + L1正則是主流,大多數工程師乾的活就是挖特徵。
這塊百度的技術實力很強,據說網盟已經用了特徵自動化選取的方法,鳳巢lr, gbdt , DNN都有在應用。阿里的據說現在MLR(mixed logistic regression)是主流(備註下: 看過作者公佈的ppt,感覺和先聚類再在每個類別裏面做lr訓練,預測時候最後根據歸屬各個類別概率加權平均lr的預測概率的思想有點相似)。
本次比賽,我前期採用了vowpal-wabbit logistic regression online learning的方法來搞,其中包含了大量的特徵處理,構造新特徵, 人工做cross-feature等。後期,採用gbdt boosting樹的方法來提升效果,採用的是xgboost的工具包,同時把類目離散特徵全部轉化成連續特徵,然後送入到xgboost模型中來訓練。
1:數據預處理
(1) 連續特徵預處理
在使用vowpal-wabbit logistic regression online learning model(簡稱vw) 時候,對連續特徵做了等頻的離散化處理,送入到vw model。其實,實驗發現,特徵做log 變化後,連續特徵和點擊率大多呈現線性關係。
在xgboost model中,連續特徵沒有做離散化處理,只做了異常值處理,log變換。
補充說明下: 連續特徵離散化處理除了非監督的等頻,等寬等,還可以參考facebook的文章[1] 和自己之前的博客[2]。
附上facebook上使用boosting tree來進行連續特徵離散化處理圖:
(1) 類目特徵預處理
在vw model 中, 類目特徵直接做one hot encoding, vw 直接支持這種格式,還可以方便做cross-feature。由於vw model使用的是online learning 線性模型,所以,在模型中構造了很多關於類目特徵的一些擴展特徵: 比如:類目屬性的點擊率,點擊次數,woe,26個類目屬性的平均點擊率以及方差等。同時,這裏面做了個處理,對於那些類目屬性展現次數和點擊率都很低的屬性進行了過濾處理。
在xgboost中,把類目特徵替換爲該類目特徵在當前屬性的歷史點擊率。因爲存在某些類目屬性展現次數很少,對於這種的直接算曆史點擊率時候需要做個ctr平滑處理。
2:訓練模型
(1)vw model :處理好特徵後,使用命令行的方式進行模型訓練。
Training VW:
./vw ../data/click.train.vw --ngram 2 --skips 0 -q fi -q fw -q it -f ../data/click.model.vw --loss_function logistic
Testing VW:
./vw ../data/click.test.vw --ngram 2 --skips 0 -q fi -q fw -q it -t -i ../data/click.model.vw -p ../data/click.preds.txt
vw model : 這次最好的結果是0.46078.
(2)xgboost: gbdt model,調節樹的個數和深度來生成ensemble樹。xgboost最好的效果是0.45801.
Xgboost model coding :
# load file from text file, also binary buffer generated by xgboost
dtrain = xgb.DMatrix('/mnt/train_sparse_features.txt')
print 'load train end..'
# specify parameters via map, definition are same as c++ version
param = {'bst:max_depth':10, 'bst:min_child_weight':5, 'bst:eta':0.4, 'silent':1, 'objective':'binary:logistic' }
param['nthread'] = 30
print 'param: ', param
plst = param.items()
plst += [('eval_metric', 'auc')]
plst += [('eval_metric', 'logloss')]
print 'plst:', plst
# specify validations set to watch performance
evallist = [(dtrain,'train')]
num_round = 100
print 'begin to train model....'
bst = xgb.train( plst, dtrain, num_round, evallist )
bst.save_model('xgboost_ctr.model')
# this is prediction
dtest = xgb.DMatrix('/mnt/test_sparse_features.txt')
print 'load test end...'
print 'begin to predict...'
preds = bst.predict(dtest)
o_f = open('xgboost_preds.txt','w')
for e in preds:
o_f.write('%f\n'%e)
o_f.close()
(3) 提一下FM 以及開源的工具包:libfm。因爲機器和一些找不到的客觀原因,始終沒能把libfm在全量數據中跑出來。這個比賽的第一名[3]就用的是fm 模型, fm模型的一個好處是2-ways interaction,可以自動做兩個特徵的交叉。
(4) ensemble : 最後的結果,無疑還是各種ensemble,這裏主要人工制定權重,最後的結果是是0.453左右。
補充說明:大多數情況下,測試集ctr的預測精度相對於訓練集和測試集的時間間隔呈現衰減趨勢,也就是說如果訓練集和測試集樣本的時間間隔比較久的話,用訓練集的模型預測測試集的ctr,那麼精度會有受損。這就是爲什麼現在很多團隊在ctr預估時候,不斷提升模型更新的速度。
3:預測結果
其中xgboost model 預測ctr概率分佈(vw model整體趨勢和xgboost基本一致)如下:
我的結果:
前三名的結果:
baseline:
五:總結
ctr預估無論在學術界和工業界都是個很熱的話題,尤其在互聯網的計算廣告領域。在計算廣告領域,ctr的預估準確與否直接影響商業利潤,所以,公司尤爲重視。在像BAT這樣的大平臺,數據量巨大,不僅要考慮模型的精度,還要考慮模型訓練的時間代價。線性模型更新快,非線性模型訓練代價高。線性模型需要大量的特徵工程,尤其是要做大量cross-feature來達到非線性效果。非線性模型模型本身具備擬合非線性,所以,相對線性模型,做的特徵工程會少很多。
六:參考文獻
[1] He X, Pan J, Jin O, et al. Practical Lessons from Predicting Clicks on Ads at Facebook[C]//Proceedings of 20th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. ACM, 2014: 1-9.
[2] http://blog.csdn.net/hero_fantao/article/details/34533533。
[3] http://www.csie.ntu.edu.tw/~r01922136/kaggle-2014-criteo.pdf
[4] https://github.com/guestwalk/kaggle-2014-criteo
[5] https://github.com/JohnLangford/vowpal_wabbit/wiki/Tutorial
[7] McMahan H B, Holt G, Sculley D, et al. Ad click prediction: a view from the trenches[C]//Proceedings of the 19th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2013: 1222-1230. (備註: Google online learning FTRL)
[8] Chen T, Tang L, Liu Q, et al. Combining factorization model and additive forest for collaborative followee recommendation[C]//KDD-Cup Workshop. 2012.
[9] A two-stage ensemble of diverse models for advertisement ranking in KDD Cup 2012[J]. 2012.
[10] MANAVOGLU E, ROSALES R. Simple and scalable response prediction for display advertising[J]. (CriteoLab 發佈關於展示廣告的文章 )