Kaggle : Display Advertising Challenge

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 发布关于展示广告的文章 )

时间: 2024-10-07 02:26:01

Kaggle : Display Advertising Challenge的相关文章

Finding the Right Consumer: Optimizing for Conversion in Display Advertising Campaigns

这周在公司分享会上分享了<Finding the Right Consumer: Optimizing for Conversion in Display Advertising Campaigns>,下面贴出分享的主要内容. Global Model Global Model一共有2类: Merge-based Global Model Interaction-based Global Model Evaluation Metric AUC Precision或Recall Precisio

个人笔记1:display与visibility用法

有人会将CSS中的属性display和visibility混淆,他们看似没什么不同,其实区别是很大的. visibility属性控制定位的元素是否可见,取值包括:visible(可见).hidden(隐藏).inherit(继承),默认值是inherit.visibility属性与display属性的不同之处在于:当元素被隐藏时,visibility属性定义的元素任然为保留原有的显示空间. 例如以下代码: <html>   <head>       <title>dis

CSS属性:display详解

display在w3c上的定义是:display 属性规定元素应该生成的框的类型. display有许多值,这里详细讲block,inline-block,inline,table-cell. block:此元素将显示为块级元素,此元素前后会带有换行符 inline:默认.此元素会被显示为内联元素,元素前后没有换行符. inline-block:行内块元素.(CSS2.1 新增的值) table-cell:此元素会作为一个表格单元格显示(类似 <td> 和 <th>) block元

行内元素对齐:display:inline-block;

今天见到一个一行元素水平排列,但是对不齐啊,如图: 代码: div{ border: 1px solid red; } .wrap > div{ display: inline-block; width: 200px; height: 200px; background: green; } <div class="wrap"> <div class="one1">这是内容1</div> <div class="

HTML/CSS:display:flex 布局教程

网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能. Flex 布局将成为未来布局的首选方案.本文介绍它的语法,下一篇文章给出常见布局的 Flex 写

css笔记13:display用法

1.代码演示: element.html如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta h

CSS3.0盒子模型:display:-webkit-box

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>css3盒子模型</title> 5 <style> 6 .box3{ 7 width: 300px; 8 height: 100px; 9 /*设置css3盒子模型的父类*/ 10 display: -webkit-box; 11 display: -moz-box; 12 display: box; 13 14 background-colo

如何让html的某个元素隐藏,我们一般有三种方式:display:none, opacity:0, visibility:hidden。但这三种方式有何区别?

1. display:none 该方式让元素隐藏时,隐藏的元素不占空间,隐藏后将改变html原有样式.一旦父节点元素应用了display:none,父节点及其子孙节点元素全部不可见,而且无论其子孙元素如何不屈地挣扎都无济于事. 2. visibility:hidden 该方式让元素隐藏时,隐藏的元素还是占用原有位置,隐藏后不将改变html原有样式.但,如果该元素的子元素使用了visibility:visible的话,改子元素将不被隐藏. 3. opacity:0 该方式让元素隐藏时,隐藏的元素还

mask-rcnn代码解读(七):display(self)函数的解析

如和将class中定义的变量打印或读取出来,受maskrcnn的config.py的启示,我将对该函数进行解释. 我将介绍该函数前,需要对一些名词进行解释,如下: ①Ipython:ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数.学习ipython将会让我们以一种更高的效率来使用python.同时它也是利用Python进行科学计算和交互可视化的一个最佳的平台. ②