1 赛题介绍
7月HUAWEI-DIGIX比赛是广告CTR预估问题。 数据如下:
train.zip | zip(2.62GB) | 2019-05-18 00:00:00 | |
---|---|---|---|
test.zip | zip(15MB) | 2019-05-18 00:00:00 | |
user_info.zip | zip(291MB) | 2019-05-18 00:00:00 | |
ad_info.zip | zip(17.9KB) | 2019-05-18 00:00:00 | |
content_info.zip | zip(8.16KB) | 2019-05-18 00:00:00 |
时间范围是某连续6天的行为数据。总体而言,数据集包含: 训练集数据文件、测试集数据文件、用户特征文件、广告任务特征文件、素材信息数据文件。train表和test表里的字段:
label | 是否点击,1表示点击,0表示未点击 |
---|---|
uId | 匿名化处理后的用户唯一标识(示例:u100000001) |
adId | 广告任务唯一标识 |
operTime | 操作时间(精确到毫秒,示例: “2019-04-01 10:45:20:257”) |
siteId | 媒体Id |
slotId | 广告位Id |
contentId | 素材Id |
netType | 网络连接类型(示例:1, 2, 3, 4, 5, 6) |
user_info表
uId | 匿名化处理后的用户唯一标识(示例:u100000001) |
---|---|
age | 年龄段(示例:1, 2, 3, 4, 5, 6) |
gender | 性别(示例:1, 2, 3) |
city | 常住城市编码(示例:1, 2, 3…) |
province | 常驻省份编码(示例:1, 2, 3…) |
phoneType | 设备型号(示例:1, 2, 3…) |
carrier | 运营商编号 |
广告任务特征文件ad_info.csv:
adId | 广告任务唯一标识(示例:2556) |
---|---|
billId | 计费类型(示例:cpc, cpm, cpd) |
primId | 广告主唯一编号Id |
creativeType | 创意类型(示例:1. 文字广告,2. 图片广告,3. 图文广告,4. gif广告,5. 无具体创意类型) |
intertype | 交互类型(示例:0. 无交互,点击无响应,1. 点击后打开网,2. 点击下载应用,3. 点击后打开App) |
spreadAppId | 广告对应的appId |
素材信息数据文件content_info.csv:
contentId | 素材唯一标识Id |
---|---|
firstClass | 素材内容文本的一级分类(示例:电商) |
secondClass | 素材内容文本的二级分类,多值使用‘#’分割 |
2 数据预处理
2.1 分析数据
2.2.1 分布情况
首先查看每个表里数据的分布情况。尤其注意训练集与测试集的分布情况。
1 | pd.describe() # 查看计数,平均值、标准差,min max等值。 |
有些特征取值频次低的考虑合并为其他类。
2.2.2 可视化分析
对 Numerical Variable,可以用 Box Plot / 小提琴 来直观地查看它的分布。Categories Variable 用直方图。对于坐标类数据,可以用 Scatter Plot 来查看它们的分布趋势和是否有离群点的存在。(seaborn画图)
绘制变量之间两两的分布和相关度图表等,发现一些高相关和共线性的特征。
这些分析都有利于后续构造特征。
2.2 数据处理
1,缺失值处理
可以填补,丢弃等。
我在比赛中对content的firstclass和secondcalss根据spreadApp进行补全,因为广告类型可能会跟广告出现在哪类app有关系。 取出spreadApp相同的firstClass众数替换了少量缺失值。
2,异常值处理
比赛中,遇到了那种机器人用户,连续不停点击。这种数据应该在训练时过滤掉,在最后的提交结果也应该用规则处理下。
另外可以考虑分箱、均值、中位数、众数处理异常值缺失值等。
3,归一化和one hot的问题
SVM、LR模型等常常需要考虑归一化和one hot(dummy)的问题。
4,划分数据集
然后采用k折交叉验证。当线下的验证集和线上的测试集有同步的效果时最好,此时可以通过线下的验证集变化来验证线上情况。
比赛中我没有做到。但是后面问了大佬,做法是把训练集里的有点击广告行为的用户数据抽取出来作为的训练集。
3 特征工程
1,特征工程是最重要的。我们其实尝试用过自动特征工程,有一个featuretools,但这个做的所有统计特征都比较偏向数值类型的特征。做类别特征不太强。所以后面还是自己做特征。总的来说,我们应该生成尽量多的 Feature,相信 Model 能够挑出最有用的 Feature。
交叉特征:把俩取值连接起来,然后将str转换为数值。
俩俩特征之间的统计特征:比如用户看那些类别的广告数目,用户看广告主的次数等等。还有三个特征之间的统计特征。
还有就是word2ve的用户id和广告id序列特征(但这个效果不太好)。
2,筛选特征:
Random Forest 训练完以后得到的 Feature Importance。
也可以进行一些统计检验,卡方检验等。
直接观察CTR。比如特征对应的CTR数目。
4 模型
采用了lightGBM树模型。优点:基于直方图的树结点划分,内存消耗更少速度更快。lightGBM的论文阅读见博客。
注意一些模型选择:
对于稀疏型特征(如文本特征,One-hot的ID类特征),我们一般使用线性模型,比如 Linear Regression 或者 Logistic Regression。Random Forest 和 GBDT 等树模型不太适用于稀疏的特征,但可以先对特征进行降维(如PCA,SVD/LSA等),再使用这些特征。稀疏特征直接输入 DNN 会导致网络 weight 较多,不利于优化,也可以考虑先降维,或者对 ID 类特征使用 Embedding 的方式;
对于稠密型特征,推荐使用 XGBoost 进行建模,简单易用效果好;
- 数据中既有稀疏特征,又有稠密特征,可以考虑使用线性模型对稀疏特征进行建模,将其输出与稠密特征一起再输入 XGBoost/DNN 建模。
最后理论是要用“好而不同”的模型进行集成的,不过作为基模型lightGBM初期就够用了。
5 学习
大佬们的特征工程:
统计特征:当天广告曝光次数,当天用户曝光次数,当天广告主ID相对用户出现的次数,当天广告位相对用户出现的次数。
unique特征,用户相对广告的唯一ID,广告相对用户的唯一ID。
Ratio点击率特征:一维二维的点击率特征。
低频数据:置None,lightGBM对NULL数据处理友好。
序列数据:deepwalk或word2vec方法(Uid和广告id)
Reference
1,seaborn 可视化 http://seaborn.pydata.org/tutorial.html
2,个人印象笔记《复赛答辩学习》