Kaggle : Display Advertising Challenge( ctr 預估 )

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

[6] http://www.libfm.org/

[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 發佈關於展示廣告的文章 )

 

 

 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章