写在前面
感谢队友带我carry,有幸拿到初赛的冠军,在这里我也将初赛思路做一下分享,一是帮助进行复赛的同学扩展些思路,二是帮助大家能从这次比赛中学习到不一样的东西。比赛的目的就是为了学习,很乐意与大家交流。
接下来将从初始建模、特征工程、模型选择、规则尝试四个方面进行分享。
正文
初始建模
这里主要是训练集的构建,我的构建方式一直比较简单,主要选择广告操作表中广告创建时间有出价,定向人群和投放时段的广告id,这是第一部分的广告id,第二部分是三月份出价唯一的广告id,然后将这两部分广告id结合起来作为最终训练集广告id,然后再构造每天的曝光量。最终25w训练样本。也是我得到最高单模分数(86.4)的建模方法。
特征工程
1. 数据预处理
首先删除了异常样本,包括出价异常,ecmp相关异常,pctr异常,这里值的是离群点。然后删除了重复样本,主键为请求id、请求时间和广告位id。
2. 特征提取
初赛:
虽然题目是预测广告日曝光量的,但是和转化率也有很大的关系,除了目标不同,特征很多都是可以按ctr问题来构造特征。
一个模型既有细粒度的特征,又有粗粒度的特征,细粒度的特征增强模型的刻画能力,粗粒度的特征保证模型的泛化能力。细粒度的特征对活跃用户比较好,可以更精细地刻画他的喜好,提供更个性化的商品排序;而粗粒度的特征是为了服务不活跃用户甚至是新用户,用大数据中总结出的一般规律来提供商品的排序。有了这样一个认识,我们就可以构造很多特征,粗细结合,整体局部。
构造的特征主要分为三个部分,五折交叉统计、历史平移和CountVectorizer。
使用全局统计用来得到整体情况,然后为了降低过拟合的风险,而是用五折交叉统计。
历史平移用来过去历史信息,比如历史曝光量,历史pctr等。
CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。对于多值特征,最方便的展开方式就是使用CountVectorizer。从去年的腾讯比赛,以及很多比赛都会使用到这个操作,简单易用,效果显著。
复赛:
对于建模的思路不同,我们构造的特征也有很大的区别。
模型选择
初赛和复赛我们都使用了nn和lgb。
NN:
nn我们选择的是nffm,当然我们对其进行了改进。主要是对数值特征的输入进行修改。(具体方案复赛结束后分享)
nffm
改进方法
Lightgbm:
这个没什么好说的,使用起来方便,不需要对特征做过多的处理。
规则尝试
在规则方面我们考虑更多的是旧广告,新广告完全由模型来预测。
初赛基本:前一天的曝光量来填充旧广告id的曝光量,新广告直接填充0。调整单调性。
复赛基本:前一天的竞争胜率*当天请求集合数目,新广告直接填充0。调整单调性。
写在最后
复赛相对于初赛还是由很大的不同的,可以看作回归问题,这也就成了预测竞争广告能否被曝光的问题,最后相加起来构成日曝光量。即广告的竞争力越大,越容易被曝光,越来越像CTR问题了。当然,还是可以按照初赛的方法去做的,只从竞价广告队列中提取被曝光的广告,最终预测曝光量即可。如果只是初赛方案,模型只能到85 ,所以在建模方法上还需要大家做更多的尝试,不同建模的gap感觉不是一两个强特能弥补的。