前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【 SPA大赛 】腾讯社交广告大赛初赛阶段小结

【 SPA大赛 】腾讯社交广告大赛初赛阶段小结

原创
作者头像
王照彬
修改2017-06-19 18:54:53
2.2K1
修改2017-06-19 18:54:53
举报
文章被收录于专栏:王照彬的专栏王照彬的专栏

引言

大家好,我是中国香港大学机械工程专业的一名在读研究生.在大四学年瑞典皇家理工学院交流学习的过程中,阴差阳错的将machine learning当作机械类课程选择,从此打开了我通往机器学习的大门.这篇分享算是对我初赛阶段的工作与成果做一个总结,也分享一些心得,希望能帮助到更多对机器学习及广告系统的感兴趣的同学.

我是<神经图灵机>队伍的唯一一个队员, 一个人做优点是自己非常清楚比赛的节奏,以及目前结果的优劣,因为从数据处理,特征工程,模型搭建,训练调优这一系列过程完整的做下来后,对比赛想不了解都难.但还是羡慕组队的同学,毕竟一个人思维会有限制,而且工作量也大大提升. 不过建议在未来比赛中,大家在对数据与题目有充分了解的情况下,做出较为满意的成绩,再与其他成绩相仿的同学组队,这样会事半功倍,结果也会有较大的提升.

1. 对赛题及其工业背景的深入了解

虽说目前的机器学习工具包功能强大,诸如xgboost等的分类器使用默认参数就可以从没有处理过的数据中提取出有价值的信息,做到效果很好且繁华能力很强,但想要更上一层楼,还是要脚踏实地.

首先,我所花时间最长,也是感觉最重要的一环,是对赛题与数据要做到非常充分的了解.比赛名为腾讯社交广告算法大赛,那么我们一定要花一些时间了解一下当今媒体广告包括腾讯广点通平台的运营和收费机制,这些知识虽然看似与赛题不想管.但在我目前来看,对我特征工程和数据处理起到了潜移默化的巨大的影响.举个例子,在比赛数据中,出现了广告主-推广计划-广告-素材这样的4级树关系,应该所有同学都能从字面上理解这样的层级关系,在数据处理时进行类似树结构的方式也并不难想到,但其实仔细推开社交广告运营的机制,我们还能从这样的关系中发掘更多潜在的机器学习分类器很难自我学习,却有价值的特征.

2. 数据可视化及分析

对数据分布统计在每一个数据竞赛中都会需要, 较为体系化的分析流程与开源代码教程也不难找到. 本次大赛的另一个特点便是数据带有时序性, 这给数据处理与分析造成不小的困难. 我这里主要分享一些我所做的涉及时间序列的分析工作与成果.

(1) 截止至该日共出现的各个变量的不同值的数量

可以看到, 每日都会有新的之前从未出现的userID以及appID加入(对ad, creative, campaign, advertiser也等同). 这就意味着除了按日期划分的训练集中各个变量不一致外, 在线上预测集中一定会有训练集中不存在的ID. 所以在选择特征与训练集时要尽量做到将ID类特征抽象, 例如统计转化率, 做聚类等, 而避免直接使用ID类特征.

(2) 转化率分析

转化概率是本次比赛预测的objective, 与其最为相关的便是各个sample对应的CVR了, 官方所给baseline就是将历史统计的转化率来直接作为概率进行预测.

下图所示为每日所有sample的平均转化率. 其中蓝色线为原始数据, 考虑到最后五天的训练数据label有误, 又额外做出绿色线(转化时间小于等于1天), 红色线(转化时间小于等于两天). 可以看到, 转化率在20日及以后较为稳定, 在18,19日出现转化率的剧烈变化, 且这两日的数据总数也明显少于平均水平, 可能是恰逢节日或数据上传误差等因素, 综合考虑, 20日之前的数据暂时被弃用.

(3) 时序分析

笔者还对日转化率进行了ACF, PACF分析及ARIMA拟合, 但由于总日期数过少, 且CVR波动较大, 可能属于非稳定时间序列, 并不能通过去趋势等方法进行较好回归.

3. 训练集选取与特征提取区间

如果说在机器学习中有比特征还要重要的, 那就是训练集的选取了. 最好的训练集莫过于与线上测试集的变量分布完全相同, 这样的情况下线下的训练结果可以完美的用于线上数据的预测. 这种情况在一些特定的, 数据分布较为稳定的机器学习问题中可以实现.

但对本次社交广告算法大赛, 首先训练样本有时间先后关系, 而且如2中分析, 每日的user, ad都各不相同, 所以存在这样的一个隐含因素, 即若预测31日数据, 则使用越接近31日的数据训练, 则预测效果应该会越好. 但同时另一个问题, 即26日以后的数据, 由于回流时间为5日, 所以截止至31日时并不能准确统计广告是否转化, 且该问题在29, 30 两日尤为严重, 所以最后结合线下与线上测试, 我选择了26, 27, 28三天的数据进行线下CV与训练, 并用于线上测试. 在初赛阶段, 线下线上误差基本一致, 且增减情况良好.

4. 特征工程

在对赛题与数据有了充分的了解后,第二步就是特征工程了.特征工程上,我目前还没有非常得意的大家日日所念的magic feature, 我基本上是每天优化一些自己的特征,每天的成绩虽然进步不大,但也在稳步前行.交流群中几位大佬多次提及的强特征我至今也没有悟到,但也许后面就会慢慢发现,也许我已经提出了出来.

在特征工程上,最重要的, 也是三周里每一组周冠军都提到过的, 线上线下一致. 好多同学对这点理解不清, 其实用逆向思维, 首先对31日的预测集提取特征,因为是最后一天,所以无论如何都不会发生数据泄露. 这个时候再仿照31日数据特征提取的方式与时间区间, 一步一步提取, 就可以有效的规避数据泄露. 有效的避免数据泄露, 可以做到线上线下同增减, 这样的情况下, 当我们加入新特征线下误差降低时, 我们便可以推断出该特征有益, 反之亦然. 考虑到预测集为31日, 其前5天的label有不准确的情况, 但仍然可以进行统计. 但生成训练集时, 必须对特征提取区间模仿31日数据做处理(代码如下), 例如处理28日的数据, 那么提取之前的特征时, 只能够提取转化时间小于28日0点的数据, 否则会造成训练集与预测集特征不一致.

代码语言:javascript
复制
def fix_label(df_tmp, clickDay):
    mask = df_tmp['conversionTime'] >= clickDay*10000
    df_tmp.ix[mask, ['label', 'conversionTime']] = 0
    return df_tmp

同时, 另一个难点是在根据历史观测值进行转化率统计时, 出现了样本稀疏的情况, 则根据中心极限定理, 观测概率并不能较好的代表真是概率. 在CTR预估中, 两个经典的方法便是贝叶斯平滑与指数平滑. 相关博文在互联网都不难找到.

我这里再说一点我结合本次大赛数据, 对贝叶斯平滑做的一点点小的修改. 例如对我们数据中存在的 root -> advertiser -> campaign -> ad -> creative 层级关系(root为训练集中全部样本), 这样的层级关系隐喻了在同一个父节点下的子节点, 其来自于同一个Beta分布, 所以我逐层进行了贝叶斯平滑, 且建立层级关系还有一个好处, 即对预测集出现的数据, 若该creativeID 在训练集从未出现过, 则在pandas.merge时该值为空, 则向上寻找其父节点的统计值, 最高一层为root, 是基与全部训练数据的统计, root的值不进行贝叶斯平滑, 且一定存在, 这就保证了当在预测集中遇到了未出现的样本时, 使用最合理的缺省值进行补全.

5. 机器学习模型

目前我在使用xgb与lgb两种模型, 好处是模型泛化能力强且速度快, 可以最快得到结果以进行特征筛选与调试. 模型stacking和bagging是提升最终结果的利器,但不建议大家太早使用,一是浪费时间,2是这样的大杀器是否使用,对我们结果本质的提升是没有帮助的,因为如果现在使用融合效果提升,那么未来其他同学加入模型融合后,也必然会赶超自己.

6.总结

最后,还是希望大家脚踏实地,使用python或自己喜欢的语言静下心来,一步一步的做好数据分析,多从数理统计的角度想问题, 增加每一项特征或对训练集与模型的没一点修改, 都要有理论支持. 这样不仅比赛成绩会一步一步的变好, 更重要的是在积累下了扎实的数据挖掘与分析基础, 真正实现参加比赛提升自我的目的.

参考

http://wnzhang.net/share/rtb-papers/cvr-est.pdf http://www.cs.cmu.edu/~xuerui/papers/ctr.pdf https://arxiv.org/pdf/1604.06737.pdf

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 1. 对赛题及其工业背景的深入了解
  • 2. 数据可视化及分析
  • 3. 训练集选取与特征提取区间
  • 4. 特征工程
  • 5. 机器学习模型
  • 6.总结
  • 参考
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档