Preface:上半年参加天池的O2O优惠券预测赛排名第二,同时参加了学校数据仓库老师的课程改革建设团队,于是把参赛经验总结成文,准备分享给该课程的学弟学妹。现在我把总结的参赛教程文章也发到CSDN上来,供参赛的同学们参考,也希望能得到更多的指教。
1 赛题背景
1.1 题目介绍
- 比赛背景:赛题的发布网址如下:https://tianchi.aliyun.com/competition/gameList.htm#tab%3D%E5%85%A5%E9%97%A8%E8%B5%9B%26pageIndex%3D1。大家可以在这里提交自己的结果数据集,每天的10点和22点服务器会刷新成绩评测新提交的结果。
- 赛题目标:提供用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为数据,需要预测用户在2016年7月领取优惠券后15天以内的使用情况。
- 赛题数据:包括三个数据表。TABLE1(用户线下优惠券消费记录),TABLE2(用户线上优惠券消费记录),TABLE3(待预测的样本数据,是用户线下消费记录)。在本教程中,我们只使用TABLE1来构造训练集,因为如果把TABLE1、TABLE2同TABLE3数据比较,会发现TABLE3的格式与TABLE1相同但与TABLE2有差异,从而能够推断TABLE1与TABLE3为同源数据,使用TABLE1的数据构造训练集更合适。比赛结果也证明只使用TABLE1的数据来训练效果良好。当然,TABLE2也可以作为辅助预测的数据使用。
- 赛题模型:预测优惠券是否会在15天内核销可以看作一个数据挖掘中的分类问题。决策树是解决此类问题的常用模型,在本教程中我们将使用Xgboost(改进梯度提升决策树)模型。
1.2 整体思路
教程给出了两个完全独立的赛题解决方式:单指标方法和机器学习方法。
- 单指标方法是为了给读者一个简单的初步参赛体验,这也是笔者第一次提交结果时所用的方法,即只用一个基础统计指标来拟合优惠券的预期核销率,十分容易上手。
- 机器学习方法是完整的使用机器学习模型参赛的流程教学,涵盖了特征工程和XGboost模型使用两部分。建议读者将本教程的解析和源代码结合起来阅读,更方便理解。源代码已经添加了较为详细的注释。
1.3 开发环境
- 推荐Anaconda3+Python3+Pycharm的开发环境,这种搭配下撰写代码以及python包的管理都方便,省去了很多不必要的麻烦。
2 数据集情况及处理
2.1 数据集预处理(datapre.py)
首先明确 O2O优惠券使用预测是二分类问题。要应用机器学习模型来分类,则数据集中必须有目标变量,这样才能把训练集“喂给”机器学习模型让它寻找特征属性到目标变量的映射规则。
因此教程的第一项就是在训练集中构造目标变量。本次竞赛的目标是:“预测用户在2016年7月领取优惠券后15天以内的使用情况”,所以我们需要为训练集构造一个“flag”属性,“flag”标识某条记录是否为领券后15天内核销了优惠券的记录。对于正向数据我们标记为1,负向数据标记为0。这一操作在datapre.py文件中完成,该操作最后生成了文件“off_flag.csv“,这一数据集是2.2节数据集划分的基础。
2.2 数据集划分(datapre.py)
这部分操作我们会划分出4个数据集(da