Kaggle : Display Advertising Challenge( ctr 预估 )
原文:http://blog.csdn.net/hero_fantao/article/details/42747281
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 发布关于展示广告的文章 )
Kaggle : Display Advertising Challenge( ctr 预估 )的更多相关文章
- Kaggle实战——点击率预估
https://blog.csdn.net/chengcheng1394/article/details/78940565 原创文章,转载请注明出处: http://blog.csdn.net/che ...
- PaddlePaddle分布式训练及CTR预估模型应用
前言:我在github上创建了一个新的repo:PaddleAI, 准备用Paddle做的一系列有趣又实用的案例,所有的案例都会上传数据代码和预训练模型,下载后可以在30s内上手,跑demo出结果,让 ...
- 微软的一篇ctr预估的论文:Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft’s Bing Search Engine。
周末看了一下这篇论文,觉得挺难的,后来想想是ICML的论文,也就明白为什么了. 先简单记录下来,以后会继续添加内容. 主要参考了论文Web-Scale Bayesian Click-Through R ...
- kaggle CTR预估
参考涛哥之前做过的CTR预估project,学习下CTR预估的相关知识:http://blog.csdn.net/hero_fantao/article/category/6877765 目标:本周末 ...
- 广告点击率 CTR预估中GBDT与LR融合方案
http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm 1.背景 CTR预估,广告点击率(Click-Through Rate Pred ...
- CTR预估中GBDT与LR融合方案
1. 背景 CTR预估(Click-Through Rate Prediction)是互联网计算广告中的关键环节,预估准确性直接影响公司广告收入.CTR预估中用的最多的模型是LR(Logistic R ...
- CTR预估之LR与GBDT融合
转载自:http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm 1.背景 CTR预估,广告点击率(Click-Through Rate ...
- CTR预估中的贝叶斯平滑方法及其代码实现
1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad) ...
- 闲聊DNN CTR预估模型
原文:http://www.52cs.org/?p=1046 闲聊DNN CTR预估模型 Written by b manongb 作者:Kintocai, 北京大学硕士, 现就职于腾讯. 伦敦大学张 ...
随机推荐
- Python之路【第四篇】: 函数、递归、内置函数
一. 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 while True: i ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- linux——(3)文件与目录管理
文件与目录管理相关指令 ls [-adlR] 目录 #查看目录与文件的命令. -a #连同隐藏文件一起列出来. -d #只列出目录. -l #列出相关属性和权限等数据. -R #连同子目录内容一起列出 ...
- PHP变量的使用
如果在用到数据时,需要用到多次就声明为变量使用: 变量的声明 $变量名=值 强类型语言中(C,Java),声明变量一定要先指定类型(酒瓶) PHP是弱类型的语言:变量的类型有存储的值决定.(瓶子) 2 ...
- [BZOJ4539][HNOI2016]树(主席树)
4539: [Hnoi2016]树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 746 Solved: 292[Submit][Status][D ...
- 【DLX算法】poj2676 Sudoku
DLX算法求解精确覆盖问题模板.赛场上可以参见白书. #include<cstdio> #include<cstring> #include<vector> usi ...
- 【最小割】【Dinic】HihoCoder - 1252 - The 2015 ACM-ICPC Asia Beijing Regional Contest - D - Kejin Game
题意:有一个技能学习表,是一个DAG,要想正常学习到技能x,要将指向x的技能全部先学到,然后会有一个正常花费cx.然后你还有一种方案,通过氪金dx直接获得技能x.你还可以通过一定的代价,切断一条边.问 ...
- 禁用substr、substring、mid函数的sql注入脚本
#encodeing=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf-8') payloads = l ...
- nginx 访问第三方服务(1)
nginx提供了两种全异步方式来与第三方服务通信,分别是upstream和subrequest. upstream:nginx为代理服务器,作消息透传.将第三方服务的内容原封不动的返回给用户. sub ...
- 【原创】Eclipse中Android项目引用
1.选择名为SMSSDK的项目,右键--->Properties--->Android--->将Is Library勾上--->OK. 2.选中另一个名为FragmentDem ...