背景介绍:
科大讯飞AI营销云在高速发展的同时,积累了海量的广告数据和用户数据,如何有效利用这些数据去预测用户的广告点击概率,是大数据应用在精准营销中的关键问题,也是所有智能营销平台必须具备的核心技术。本次大赛提供了讯飞AI营销云的海量广告投放数据,参赛选手通过人工智能技术构建预测模型预估用户的广告点击概率,即给定广告点击相关的广告、媒体、用户、上下文内容等信息的条件下预测广告点击概率。希望通过本次大赛挖掘AI营销算法领域的顶尖人才,共同推动AI营销的技术革新。
相关数据:
- 初赛数据
https://pan.baidu.com/share/init?surl=1DAKNAEKyPysB1a-unUPPw 提取码:rle2 - 复赛数据
https://pan.baidu.com/share/init?surl=kn3unsFSKj1DG4nVIiGvpA 提取码:z2pc
数据项内容
上下文信息11个 | 广告信息16个 | ||
---|---|---|---|
osv | 操作系统的版本 | orderid | 订单id |
os | 操作系统柜 | adid | 广告id |
os_name | 操作系统名 | advert_id | 广告主id |
make | 手机品牌 | advert_name | 广告主名称 |
model | 手机型号 | advert_industry_inner | 广告主行业 |
province | 省份 | campaign_id | 活动id |
time | 时间戳 | creative_type | 创意id |
city | 城市 | creative_type | 创意类型 |
nnt | 联网类型 | creative_tp_dnf | 样式定向id |
carrier | 运营商 | creative_has_deeplink | 相应素材是否有deeplink |
devtype | 设备类型 | create_is_jump | 是否有落地页跳转 |
create_is_download | 是否有落地页下载 | ||
媒体信息 5个 | creative_as_js | 是否为js素材 | |
app_cate_id | app分类 | create_is_voicead | 是否为语音广告 |
f_channel | 一级频道 | creative_width | 创意宽 |
app_id | 媒体id | creative_height | 创意高 |
inner_slot_id | 媒体广告位 | 用户信息 1个 | |
app_paid | app是否付费 | user_tags | 用户标签 |
比赛分析:
- 由于是CTR预估问题,因此该问题可以简单的抽象为样本分布不均衡的二分类问题,需要预测的内容为用户是否会点击该商品。评测指标为logloss。
- 而数据方面大致可以分为四类:上下文信息(11个), 媒体信息(5个), 广告信息(16个), 用户信息(1个),几乎所有特征都为类别型特征。
- 数据量为100万条30维左右的数据
数据预处理
数据合并: 将不同分布的数据进行整合
数据采样:正负样本比为1:4,属于非均衡类别,不过负样本数据量尚可,因此对其采用了欠采样操作,去除了一部分过量的负样本。
EDA探索性数据分析:
- 首先观察了单变量的分布,如在手机品牌这方面OPPO和 vivo的用户最多,而这两种机型的用户点击率也高于其他手机的用户
- 对不同特征和标签之间进行组合,绘制柱状图观察影响(如不同时刻点击的总数量,不同的广告长度和宽度对点击的影响)。
数据清洗:对重复值使用dropna操作将其去掉,对异常值数据进行了一些清洗(如make手机品牌中出现了一些具体型号的异常值,进行了统一的品牌合并如iphone/apple),一些可以预测出来的异常值,由手机品牌可以由手机
型号反推,训练了一个简单的随机森林去进行拟合。其他难以推测的缺失值采用了众数的方法进行填充
时间序列交叉验证:在进行交叉验证时分数很好但LB的分数却不理想,后来发现是因为忽视了时间序列的影响因素,导致了时间穿越,也就是用未来的数据去预测过去的数据,在切分验证集的时候,标准的做法是构建时间窗,有规律的用前面七天的数据作为训练集,
第八天的数据作为验证集修改之后,效果有了一定的提升。
数据泄露:data leakage模型在训练时已经见过验证集,尽管不是直接看到验证集,但基于全量数据的统计特征已经泄露了一部分验证集信息,为了改善这种情况,
我将统计特征的统计范围从原来的全量数据改为了训练集数据,重新训练后logloss进一步从0.22降至了0.19。学习到的点在于应该先划分数据集,再构造特征,而不是先构造特征再划分数据集。同时也明白了pipline在一定程度上可以避免混淆对于训练集和验证集的不同的操作(前者使用fit_transform(), 后者使用transform())
特征工程:
- 由于大部分特征都是类别型特征,因此对部分特征进行了交叉特征的构建。
- 对时间特征进行了分组划分,额外生成了早上下午晚上午夜四个时间段,能在一定程度上增加信息量。
- 对版本号进行了更细粒度的刻画 5.1.1>–5 1 1 ,将一维文本信息变为三维类别信息
- 对数字代表的地理位置信息进行了更细粒度的切分,如:510410,51代表广东省,04代表广州市,10代表白云区
- 对大部分特征进行了计数统计, 对能进行groupby操作的特征进行了汇总统计。
- 构建了比例特征(如广告主id的某个广告id投放比例)
- 构建了类别变量的nunique特征(如广告主id有多少个不同的广告id)
- 针对类别型的特征和标签之间,构建了分组统计点击率,如不同APP,不同手机点击率的平均值,最大最小值,这称为feature encoding,加入之后验证集的分数从0.41左右大幅下降至0.22,和之前完全不在一个水平线上。
- 针对类别型特征进行了OneHot-Encoding,对于类别较多的特征,把长尾部分归为其他类,大幅减少了数据的维度,同时用sparse将系数矩阵转换为稠密矩阵,提升了训练速度。
- 对相互之间并非完全独立,有大小,级别关系的类别型特征,采取了Label encoding而非OneHot-encoding,来体现出他们之间的关系,避免信息损失
- 特征筛选方面,使用了基于树模型产生的feature importance的方法来进行特征筛选,剔除掉一些冗余的特征。
参数调节(GridSearchCV):
boosting_type=‘gbdt’,
num_leaves=48,
max_depth=-1
learning_rate=0.02,
n_estimators=6000,
max_bin=425,
subsample_for_bin=50000,
objective=‘binary’,
min_split_gain=0,
min_child_weight=5,
min_child_samples=10,
subsample=0.8,
subsample_freq=1,
colsample_bytree=0.8,
reg_alpha=3,
reg_lambda=0.1,
seed=1000,
n_jobs=-1,
silent=True
模型融合:
- 通过stacking模型融合的方式最大限度度在减小数据维度的同时保存原有特征信息。
- 把Xgboost和LightGBM进行了一组stacking融合,把LightGBM作为基模型(因为其处理数据的速度更快),Xgboost作为二级模型(其预测效果更准确),说白了就是以LightGBM给出的预测作为训练数据,再训练一次Xgboost,从最后的效果上来看,有提升,但不如特征工程来的明显。
- 训练多个上述stacking模型,每个模型差异化训练不同特征,又进行了一次bagging操作,分数由有所提升。
- 在融合结果的时候,发现使用调和平均(倒数求平均再取倒数)的效果要优于加权平均,调整后分数有所上升。
思考总结
- 对于CTR问题而言,广告是否被点击的主导因素是用户,其次是广告信息。所以我们要做的是充分挖掘用户及用户行为信息,然后才是广告主、广告等信息。
- 这类问题评估函数常用logloss和AUC,简单的说logloss更关注和观察数据的吻合程度,AUC更关注rank order。如果是按照概率期望来进行收费投放的话就用logloss,如果定投一定量就用AUC,主要还是和业务相关。
- 匿名化数据需要对数据进行充分理解分析,甚至可以尝试根据业务理解进行反编码,这样能够为特征工程指明方向。
- 建模过程中充分考虑了用户标签与其他信息的交互作用,并采用Stacking抽取特征信息的方式减少维度与内存的使用,对广告与用户交互信息的充分挖掘,也使得模型在AB榜测试相对稳定。
- 模型缺乏差异性和创新性,最开始尝试过deepffm,由于效果一般而没有坚持改进,大部分精力放在了数据理解与特征挖掘上。