ctr_xgboost_blue

ctr项目简介

Click through rate 广告点击率,是指浏览网页的用户点击某个特定的链接(创意)的比例(ratio)。本ctr项目主要针对手机用户预测ctr,主要使用的方法为xgboost,模型好坏的离线衡量指标为AUC,并与LR(Logistic Regression Model)模型做比较。在离线测试中,xgboost的AUC高于LR。(0.66>0.62)

项目实现流程

ctr_blue

项目简要流程图如上,主要流程为:
1. preprocessing : 读取数据,剔除缺失数据,将数据转化为训练所需的key:value形式。
2. cross validation: 为选取合适的参数进行交叉验证。(由于cv测试需要耗费大量时间,实际测试中将数据集随机分成两份,分别占比:0.8/0.2,前者用户train后者用于evaluation。【cv与直接拆分数据集的AUC值相差不大】)
3. train
4. predict
以下详细介绍各部分细节

数据预处理 preprocessing

实际数据的格式如下:
idfa和imei各取三条
idfa数据各列含义:

IDFA,常驻城市(多个城市以,分割不超过3个),家庭小区,机型特点标签(以|分割),操作系统,分辨率(长*宽*dpi),
标签大类01(具体说明见标签文档,多个标签以|分割,前面为标签CODE,;后面是权重值), 标签大类02(同01),标签大类03(同01),标签大类04(同01),标签大类06(同01),标签大类07(同01)

idfa数据内容:

00002533-951c-43e9-8bcf-a9aa27fb88cd    成都市          苹果|手机|4.5-3.1英寸|陀螺仪|1000-1999|iPhone 4 7.1.2   640*960
00005a36-29da-48bb-846a-60ba0668ebbf    福州市          苹果|手机|摄影手机|5.5-5.1英寸|陀螺仪,指纹识别|4000及以上|iPhone 6 plus        8.3     640*1136       02011302;1.18|020113;1.18
00005c2f-9afe-4cf7-92d5-93920e42da6f    南京市,汉中市   仁恒国际公寓    苹果|手机|摄影手机|5.5-5.1英寸|陀螺仪,指纹识别|4000及以上|iPhone 6 plus       9.2    1242*2208                        030301;10.0             060103;0.01|06010101;0.0|06010301;0.01|060101;0.0|06010102;0.0

imei数据各列含义:

IMEI,ANDROIDID(多个以|分割),MAC地址(多个以|分割),常驻城市(多个城市以,分割不超过3个),家庭小区,机型特点标签(以|分割),操作系统,分辨率(长*宽*dpi),
标签大类01(具体说明见标签文档,多个标签以|分割,前面为标签CODE,;后面是权重值), 标签大类02(同01),标签大类03(同01),标签大类04(同01),标签大类06(同01),标签大类07(同01)

imei数据内容:

000000000000311 3f585f1859cd7f3b        1a:47:95:57:82:ba                      android+4.2.2    480*764*120
000000176761971 e3efe5b05dac9be0        c2:c1:f4:8f:9e:c0|c2:c1:80:9e:d1:c0    阳泉市          OPPO|手机|5.0-4.6英寸|陀螺仪,NFC芯片|2000-3999|Find 5  android+4.1.1   1080*1920*480                                           070503;101|070101;101|070403;101|070201;101
000000842880155 6682edddc91f318f        00:08:22:86:4f:3f                      OPPO|手机|美颜|5.0-4.6英寸|8核,双卡双待|2000-3999|R7    android+4.4.4   1080*1920*480           02011308;0.14|020113;1.04|020111;0.14|02011301;0.89|02011101;0.14       030401;0.04|030502;0.04|030102;100.0|030209;100.0

其中标签大类对应表如下:

游戏偏好    01
应用兴趣    02
人口属性    03
消费偏好    04
定制标签    05
地理位置    06
游戏深度标签  07

正负样本统计及剔除重复样本

  1. 数据中idfa数据的总样本量为1575936,其中正样本为1418125,负样本为157811,负正样本比例为:8.98:1。
  2. imei数据的总样本量为1800166,其中正样本为1540377,负样本为259789,负正样本比例为:5.93:1。
  3. imei数据中,若以ANDROIDID为唯一id,此id有重复。为了剔除重复样本并缩小正负样本比例,这里只对负样本的重复样本进行剔除。剔除的负样本量为9945,剔除后的负正样本比例为5.89:1

特征提取及转换

实际测试中只提取用户标签大类作为特征(如上),若一个样本这7个标签大类都没有信息则去除此样本。将有信息的样本转换为key:value的形式。

name value
剔除的样本量为 846583
最终有效样本为 2529519
负正样本比例为 6.45:1

最终处理后的样本格式为:
label{0,1} key1:value1 key2:value2 …

1 32:0.61 34:0.61 69:0.61 70:0.61 113:0.47 114:0.47 151:0.46 152:0.46 156:0.61 158:0.61 188:0.61 197:0.61 219:8.34 220:8.34 221:0.61 224:0.61
1 273:10.0 361:0.0 362:0.0 367:0.0 368:0.0
1 273:10.0 361:0.0 362:0.0 367:0.03 368:0.03 369:0.03 370:0.02
0 19:1.76 20:1.76 21:1.76 98:1.76 151:0.88 152:0.88 188:1.76 197:1.76 198:1.76 219:11.41 220:7.02 221:1.76 222:0.88 225:1.76 227:3.51 230:0.88 231:0.88 481:101 484:101 613:0.88
0 69:0.88 70:0.88 107:1.76 108:0.88 109:1.76 151:0.88 152:0.88 156:1.76 159:1.76 176:0.88 178:0.88 219:4.39 220:1.76 221:1.76 222:0.88 223:0.88 224:0.88 227:1.76 481:101

cv 调参

booster=gblinear的部分参数

参数 说明
lambda L2正则化参数,默认为0
alpha L1正则化参数,默认为0
lambda_bias L2的偏置量

booster=gbtree的部分参数

参考自【xgboost】导读与实战.pdf

参数 说明
subsample 每次做gb选取的数据比例,可以用作避免过拟合,默认为1
min_child_weight 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近, min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
eta 学习率
max_delta_step 如果设立了该值,对叶子节点的权重值做了约束在 [max_delta_step,max_delta_step]。以防在某些 loss 下权重值过大,默认是 0(其实代表 inf)。可以试试把这个参数设置到 1-10 之间的一个值。这样会防止做太大的更新步子,使得更新更加平缓
lambda L2正则化参数,默认为1
alpha L1正则化参数,默认为0

调参记录

以下测试的训练集与测试集没有变化,以及一些不变的参数为:

参数名
subsample 0.8
silent 1
objective binary:logistic
eval_metric auc
nthread 4

gblinear调参记录

iteration lambda alpha eta iter:max_AUC end_AUC
500 0 0 0.3 44:0.623807 0.622787
207 0 0 0.1 182:0.623858 0.623631
176 0.01 0 0.1 160:0.623936 0.623906
224 0 0.01 0.1 160:0.623920 0.623498
213 0.1 0 0.1 165:0.623399 0.623026
132 1 0 0.3 100:0.622977 0.622827

gblinear需要调的参数有L1、L2正则化参数以及步长大小;上表每列分别表示:iteration迭代步长、l2正则化参数、l1正则化参数、eta步长缩减比例、max_auc迭代过程中最最大auc、end_auc最后一次迭代auc,这里计算的AUC都是测试集的AUC。整体来看,根据实际情况适度调整参数后实际auc变化不大,当使用L2正则化参数系数为0.01时auc最高为0.623936。

gbtree调参记录

iteration max_depth min_child_weight eta lambda alpha iter:max_AUC end_AUC
146 6 1 0.3 1 0 122:0.660744 0.660410
146 12 1 0.3 1 0 14:0.655844 0.654396
72 8 1 0.3 1 0 326:0.658738 0.658738
72 6 1.5 0.3 1 0 326:0.658738 0.658738
155 6 0.5 0.3 1 0 145:0.660733 0.660531
234 6 1.5 0.3 1 0 215:0.659923 0.659663

gbtree需要调的参数有max_depth每棵树的深度,min_child_weight,eta每次迭代步长缩减比例,正则化参数lambda和alpha。经过一些测试,max_depth数值在超过6时有过拟合的趋势,训练集合auc明显升高,测试集合auc没有提升;为3时效果几乎不变auc0.65;为6时效果最好。min_child_weight在1时效果最好。总上,第一行的参数组合auc最高0.660744。

增加特征

原始数据的用户行为标签是认为标定的浮点型数值,这些数值可能存在不合理,为了减少这种情况的影响,将每个具有此类标注的标签增加一个{0,1}标注的特征值。即

之前的特征

1 32:0.61 34:0.61 69:0.61 70:0.61 113:0.47 114:0.47 151:0.46 152:0.46 156:0.61 158:0.61 188:0.61 197:0.61 219:8.34 220:8.34 221:0.61 224:0.61

增加之后的特征

1 32:0.61 34:0.61 69:0.61 70:0.61 113:0.47 114:0.47 151:0.46 152:0.46 156:0.61 158:0.61 188:0.61 197:0.61 219:8.34 220:8.34 221:0.61 224:0.61 654:1 656:1 691:1 692:1 735:1 736:1 773:1 774:1 778:1 780:1 810:1 819:1 841:1 842:1 843:1 846:1

原来一共有622个特征,特征32对应数值为0.61 那么增加 (32+622)654:1,key 32 与 654对应的同一个特征。

测试

gbtree调参记录

iteration max_depth min_child_weight eta lambda alpha iter:max_AUC end_AUC
191 6 1 0.3 1 0 122:0.660744 0.660142

几乎没有变化

gblinear调参记录

iteration lambda alpha eta iter:max_AUC end_AUC
177 1 0 0.3 44:0.623817 0.622792

总体来看,增加特征的方式并没有提升,与原来的效果几乎相同。

总结

1. 增加特征的方式效果不好,还是使用原来的特征。
2. gbtree比gblinear效果好,但是速度慢一些。
3. gbtree主要需要调的参数有三个:树的深度max_depth:越大越容易过拟合、每次迭代步长的缩减比例eta:越小每次走的步长小更精细,但是慢、min_child_weight越小越容易过拟合。
4. 最终的参数:
iteration max_depth min_child_weight eta lambda alpha iter:max_AUC end_AUC
146 6 1 0.3 1 0 122:0.660744 0.660410
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章