京东如期而至比赛/电商平台个性化推荐项目经验分享

1 数据情况
2 项目目的
预测出以往购买过的用户在未来一段时间内最有可能购买的指定商品类别的50000个用户,以及可能购买日期

3 项目整体实现思路
要做两个模型。第一个模型用来预测用户下个月购买这个类别商品的概率;第二个模型用来预测首次购买的日期。

第一个模型(主要负责):
例:要预测2017-09-01~2017-09-30这个月内最有可能购买目标品类的50000个用户。
<1>生成3组训练集:包括训练数据和标签。
第一组训练集用5,6,7月份的数据(去除6.17、6.18、6.19三天的数据)生成有效用户id,用2,3,4,5,6,7月份的数据生成训练数据X,用8月份的数据生成对应的标签(label1:用户是否在本月份购买),groupby(“user_id”)
第二组训练集用4,5,6月份的数据(去除6.17、6.18、6.19三天的数据)生成有效用户id,用1~6月数据生成训练数据X,用7月份的数据生成对应的标签(label1:用户是否在本月份购买),groupby(“user_id”)
*第三组训练集用2,3,4月份的数据生成有效用户id,用11~4月数据生成训练数据X,用5月份的数据生成对应的标签(label1:用户是否在本月份购买),groupby(“user_id”)
考虑到效果,最后不用第三组数据。
对为什么选择8,7,5月份做标签月做解释:
分析以往整年的数据、8、7、5的数据分布情况和预测月9月相近,6月有618活动影响,噪声太大,不适合做取标签的数据集。但最后没有用第三组数据。

为什么不用第三组数据?
因为第三组数据做训练集X的时候没有考虑618,而第一组、第二组、测试集都有考虑,所以第三组的数据分布其实是和它们不一样的,放进去对模型效果有影响。

对为什么这么选有效用户id做解释:
离标签月就近的解释:
通过分析用户间隔购买的天数与人数数据关系,可以发现越间隔天数越小的购买人数越多(也就是重复购买的概率越大),当间隔购买天数超过60天,购买概率就变得很小了。所以选标签月的就近3个月用户在标签月再次购买的概率会比较大,作为有效用户。
选有效用户不考虑6.17、6.18、6.19三天的数据的解释:
6月有618,噪声大,可能有很多跟着活动而来的不稳定用户,不适合当有效用户参考,去掉头尾和当天共三天的数据。

标签是如何生成的?
以8月为提取标签数据集,2~7月为特征提取数据集生成的一组训练数据为例:
用2~7月数据得到的X中,用户在8月有购买过目标品类(101/31)商品的打上”1”标签,否则打上”0”标签。
<2>生成测试集:
用6,7,8月份的数据(去除6.17、6.18、6.19三天的数据)生成待预测的有效用户,用3~8月数据生成测试数据X,groupby(“user_id”),预测9月份的情况。
<3>预测:
用这两组训练集(数据顺序打乱)训练模型,输入测试数据预测8月份的情况。

4 细节:数据分析、特征工程、特征数据处理、用的算法等
数据分析
不同订单数的用户占比
订单/行为中只出现一次的用户
每月订单数统计
每月用户数统计
每天订单数统计
每天用户数统计

再次购买间隔天数与购买用户人数的关系
用户回购平均天数
101/30品类平均回购时间间隔

特征工程:统计特征、时间特征、其他特征

<1> 统计特征
订单:
用户下单次数
用户订单商品的id数目
用户订单中下单天数
用户订单消费价格水平
用户订单中地区数目

行为:
用户有无发生浏览关注行为
用户对商品浏览关注行为的次数/频率

评论:
用户好评率
用户评论101/30类目订单的好评率

<2> 时间特征(主要是时间差特征)
订单:
用户浏览到购买订单前后的时间差的平均值
用户浏览到购买101/30品类商品的时间差的平均值
用户浏览到购买非101/30品类商品的时间差的平均值
用户倒数15次购买日期距9.1的时间差平均值

商品:
用户购买同一商品的时间间隔平均值
用户购买不同商品的平均时间间隔
各个商品最后购买日期距离9.1的平均时间间隔

行为:
用户开始发生浏览/关注行为距离购买的平均时间间隔
用户发生浏览–>关注的行为平均时间间隔

*评论:(线下模型验证发现关于评论的时间特征没有起到提升模型效果的作用,删除)
用户购买到评论的平均时间间隔

<3> 其他特征
交叉特征:
比如行为与商品的交叉特征:用户发生浏览/关注行为次数最多的sku_id、cate
等等…
Onehot:
用户基本属性年龄、性别、等级是有用特征,也加入模型。对用户年龄离散化后做onehot

特征数据处理
对做好的训练集X进行数据分析可视化,对有长尾分布的特征(说出哪些特征)进行log处理。
618等异常数据如何处理?
在选有效用户id和取标签数据需要考虑618的影响,做训练集、测试集X是可以不用考虑618的影响的,因为它们都有考虑618,它们实际上数据分布是一致的。
对离群点的处理

算法与模型调优:
算法:Xgboost,最后整合3个人的结果做stacking
调参:
xgboost如何调参?参考:https://segmentfault.com/a/1190000014040317
1 xgboost常见参数
eta:学习率,用于更新叶节点权重时,乘该系数,避免步长过大。就是梯度下降损失函数下降的那一张图的解释,每一轮迭代损失函数都是沿着减小幅度最大的那个方向下降,如果步长太大,可能下降到接近最低点的时候,损失就跨到另一边去了比前一个模型的损失还大,导致无法收敛。参数值越大,越可能无法收敛。把eta设置的小一些,小的学习率可以使后面的学习更加仔细。
min_child_weight:每个叶子里面的h的和至少是多少,这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数越小,越容易过拟合。
max_depth:每棵树的最大深度,该参数设置越大,越容易过拟合。
max_leaf_nodes:最大叶节点数,和max_depth类似。
gamma:后剪枝时,用于控制是否后剪枝。
max_delta_step:该参数可以使得更新更加平缓,如果取0表示没有约束,如果取正值则使得更新步骤更加保守,防止更新时迈的步子太大。
subsample:样本随机样本,该参数越大,越容易过拟合,但设置过大也会造成过拟合。
colsample_bytree:列采样,对每棵树生成时用的特征进行列采样,一般设置为0.5-1。
lambda:模型的L2正则化参数,参数越大,越不容易过拟合。
alpha:模型的L1正则化参数,参数越大,越不容易过拟合。
scale_pos_weight:如果取值大于0,在类别样本偏斜时,有助于快速收敛。
2 使用工具:网格搜索法GridSearchCV()
3 具体调参例子:
<1> 初始化参数值
learning_rate: 0.1
n_estimators: 500
max_depth: 5
min_child_weight: 1
subsample: 0.8
colsample_bytree:0.8
gamma: 0
reg_alpha: 0
reg_lambda: 1
<2> 逐个调参:相关的参数一起调参,如果没有相关的参数,单个调参。每调到一个最优参数,把其更新。
调节最佳迭代次数:n_estimators
此时得到的最优迭代次数n_estimators=600,可能取值的参数尝试用更小的粒度,‘n_estimators’: [550, 575, 600, 650, 675]。根据实际情况再调整参数取值粒度,知道效果最优。
把other_params的n_estimators更新为最优参数。同样的方式依次调节max_depth和min_child_weight–>gamma–>subsample以及colsample_bytree–>reg_alpha以及reg_lambda–>learning_rate。
最后得到要调节的参数的最优参数组合。

第二个模型:预测可能购买的50000个用户在下个月的哪个日期购买
模型整体建模思路与第一个模型建模思路基本一致,是个回归问题。
打标签有些不一样,用标签月的用户购买目标品类的日期离当月1号的距离(即购买当天的日期号数)作为标签值,如果标签月的用户没有购买目标品类的商品,则标签值为31。 得到总体用户(约100000个)在下个月可能购买的日期,然后用第一个模型得到的50000个id merge第二个模型的预测结果,就是整个比赛的最终预测结果输出。

*附:数据分析github代码:
https://github.com/yangbeans/JD_Match/blob/master/JD_EDA.ipynb

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值