复制这段内容后打开百度网盘手机App,操作更方便哦
写在前面
7月中旬答辩结束,大概三个月后才抽空完成这篇比赛总结,争取参加过比赛都有一个总结分享。
队伍:珞珈山第一菜鸡
这次比赛是和腾讯广告算法大赛同步进行的,在这场比赛中自己的工作并不是很多,主要还是队友给力,另外B榜前的一次组队也提升不少,同时呢能进入最终决赛答辩非常感谢前排两个小号,在此向你们致敬!
接下来奉上此次比赛完全方案,干货满满!!
本文内容:
- 赛题分析
- 探索性分析
- 特征构造
- 训练集构建
- 模型选择
- 不足与总结
1.赛题分析
目的:本次大赛通过给出近3个月购买过目标商品的用户以及他们在前一年的浏览、购买、评价等数据信息,需要参赛者预测下个月可能购买的用户以及相应用户第一次购买的时间。
数据理解:数据主要包括用户的基本信息,商品的基本信息,用户订单信息,用户浏览信息,用户评论信息。由于需要预测的是9月份购买的用户以及对应的第一次购买时间,因此时间的相关信息显得尤为重要。
目标解读:本次大赛分为两个部分,一个是预测购买的用户集合,一个是相应的第一次购买时间。第一个目标毫无疑问是个二分类问题,通过预测的购买概率并从大到小排序就能够确定对应的50000个用户。第二个问题可以看成回归问题或者多分类问题,通过模型预测出对应的天数(如果回归就取整)。
评价指标:
(1)用户评价
其中,
表示选手预测的第 i 个用户的正确标志,当预测正确时
=0。N为选手提交的记录数。
(2)用户下单日期评价
其中,
为答案用户集合,
表示用户 u 的预测日期与真实日期之间的距离。
2.探索性分析
我们主要分析的是用户购买间隔的来做的数据分析,如下图
- 用户购买间隔
- 有收藏行为的用户购买间隔天数
- 有浏览行为的用户购买间隔天数(分为促销和非促销)
数据预处理
- 对订单表和行为表去重,减少了噪声
- 缺失值填充:离散特征众数填充,连续特征均值填充
- 删除缺失值较多的特征,例如sex特征,近一个千分点的提升
- 看下边的图表,可以看出618,双十一和双十二的流量出现异常,因此我们做s2时去掉了一些节日
3.特征构造
由于S1,S2可以看作两个问题,所以特征部分我们分为两个部分进行构造
S1:
用户订单特征:用户订单数,用户有过购买的月份数,订单中商品的属性特征(统计值)等。
用户行为特征:用户浏览的天数,用户浏览的月份数,浏览商品的属性特征(统计值)等。
时间特征:用户订单的时间分布特征,用户浏览的时间分布特征,用户评论的时间分布特征,订单的时间间隔特征,浏览的时间间隔特征,最后订单、浏览、评论的时间特征等。
S2:
基本特征:用户基本特征(age,user_lv_cd等),商品的基本特征(para_1,priced等)
统计特征:
- 基于用户本身的统计特征:user_id和age,user_id和sex,user_id和user_lv_cd等
- 基于商品统计特征:user_id和para,user_id和price,user_id和cate等
- 基于行为的统计特征:user_id和a_type,user_id和a_num,user_id和a_date等
- 基于订单的统计特征:user和o_id,o_area,o_sku_num等
- 基于评论的统计特征:user_id和score_level,comment_create_tm等
- 交叉统计特征:基于user_id和socre_level的一些商品统计特征等
时间特征:
- 简单统计:基于订单时间,评论时间和行为时间的月,日,星期的统计特征
- 时间差特征:订单的时间间隔特征,浏览的时间间隔特征
比率特征 : 购买非目标的数量/购买目标的数量等
4.训练集构建
S1:
由于线上需要我们预测9月份是否购买,因此在线下我们可以假设8月份未知,用8月份之前的数据来提取用户集和特征。同时,为了扩大样本量,我们进行了滑窗采样:
同时,为了保证线上线下一致性,我们取了标签区间前3个月购买过目标品类的用户集作为我们构建训练数据的用户集合,标签日前9个月提取特征。
- 4组样本分布不同,标记区分样本组别,A榜带来一个百分点的提升
- 与线上评测保持分布一致,2~3个千分点的提升
S2:
由于线上需要我们预测9月份是否购买,因此在线下我们可以假设8月份未知,用8月份之前的数据来提取用户集和特征。同时,为了扩大样本量,我们进行了滑窗采样,分为两组训练集,一组测试集:
(我们放弃了6月,因为分析数据得知618出现流量异常,同时我们也用了去除流量异常的节日,发现效果不佳。)
为了保证线上线下一致性以及其他用户的干扰,我们取了标签区间前3个月购买过目标品类的用户集作为我们构建训练数据的用户集合,标签日前1,3,6,9个月提取特征。
5.模型选择
S1:
- 主要选择了LightGBM模型和XGBoost模型。
- 在模型训练方面,主要使用了交叉预测,也就是stacking的第一层,由于这题的特殊性,我们发现交叉预测的效果与单模型预测的效果差距不大。
- 初赛中主要使用了XGBoost和LightGBM两个模型的融合,对预测的概率文件以5:5的比例加权融合。
S2:
- 选择了LightGBM单模型
- 在模型训练方面,主要使用了stacking和bagging相结合对模型进行融合,以及使用cv交叉验证
S1合并S2:
S1我们获得购买用户的集合,S2获得每个用户下次购买的时间
代码语言:javascript复制res1=pd.read_csv('../submit/S1.csv')
res2=pd.read_csv('../submit/S2.csv')
# s1,s2合并
res1=res1.merge(res2,on='user_id',how='inner')
# 进行排序
res1=res1.sort_values(by='pre',ascending=False)
6.不足与总结
- 滑窗采样的同时需要注意每个窗口的正负样本分布
- 每天评测次数有限,需要保证线下的验证结果可靠,因此构造数据时线上线下需要保证分布一致
- 比赛中S2部分没有尝试使用线上评测函数作为目标函数来训练模型,有点遗憾,据说提升很大。
- 对于618和双十一的噪声数据没有处理好,这部分和前排差距明显。