目录
一、问题描述
在电商平台中,有海量的商品,如何为用户挖掘出感兴趣的商品,真正实现千人千面具有重要的意义。商品得分排名,在电商平台个性化推荐排序具有重要的应用。
用户对商品偏好得分受哪些因素的影响,以及这些因素最终如何共同决定商品得分?本文总结了一个实际电商平台中用户对商品偏好得分的构建过程。
二、数据摸底
为用户偏好品类下的商品进行个性化推荐,初步的分析思路是通过对前三个月份的用户行为数据和商品属性数据的分析,寻找他们与未来7天用户下单商品之间的关系(选择7天数据作为标签,为了积累足够多的正样本;选择下单的商品,因为购买行为更能说明用户对商品的喜好)。
在进行数据摸底后发现,老用户未来7天的订单量150000(大约占71%),偏好分类的商品大约占到29%。对数据摸底后,结合业务逻辑,列出潜在的分析特征,如下:
在上面原始字段的基础上,结合业务逻辑,增添一些重要的衍生变量如下:
商品折扣率(discount),商品现在的卖价除以商品原价。因为折扣大的商品更容易刺激用户的购买欲。
商品转化率(procr),购买该商品的用户数除以查看该商品的用户数。
三、数据清洗和特征筛选
3.1 数据抽取和清洗
抽取和清洗数据的目的主要包括:熟悉数据的分布特征和数据的基本统计指标(count、min、max、mean、stddev、skewness、kurtosis)、发现数据中的缺失值、发现数据中的异常值、发现数据中明显与业务逻辑相矛盾的错误。这样最终可以得到比较干净的数据,从而提高随后分析的准确性和后期模型搭建的效果。
在数据清洗过程中,发现了以下的数据错误:
价格字段有少数样本的观察值是999999,这是商品因为某种原因不在网站上显示时,该商品的价格会被设置为上限,可以直接删除记录。
Procr字段有将近40%+样本的观察值是Na,数据排查后发现,是因为商品的订单量为0,在除法中,分母为零没有意义。将样本中该变量的观察值从Na修改为0。
Onlinetime字段有少数样本的观察值小于0,显然不符合业务逻辑。我们只需要在分析时间段内在线的商品,对于在该时间段之后上线的商品不在我们分析范围内,可直接删除。
3.2 特征筛选:决策树
特征筛选具有重要意义,因为过多的输入变量很可能会带来过拟合的问题,这会导致模型的稳定性下降;同时,筛选有效的输入变量也是提高运算速度和运算效率的需要。利用决策树模型,计算特征重要性分数值如下,最终筛选有效的特征:similar_score、orderuv_7d、procr、 basketuv_7d、discount、online_time。
特征 |
重要性 |
累积得分 |
similar_score |
0.5093 |
0.5093 |
orderuv_7d |
0.2885 |
0.7978 |
procr |
0.0374 |
0.8352 |
basketuv_7d |
0.0251 |
0.8603 |
discount |
0.0241 |
0.8844 |
online_time |
0.0236 |
0.908 |
clickuv_7d |
0.0198 |
0.9278 |
Origin_price |
0.0193 |
0.9471 |
favorateuv_7d |
0.0193 |
0.9664 |
Extend_price |
0.0172 |
0.9836 |
Sell_price |
0.0105 |
0.9941 |
3.3 特征分布转换
根据前面变量的基本统计指标偏度Skewness和峰度Kurtosis,改善特征分布,强化自变量和因变量的线性关系,从而提升自变量的预测能力,提升模型的拟合效果。Similar_score偏度skewness为9.2341,峰度kurtosis为132.095,basketuv_7d偏度skewness为5.0373,峰度kurtosis为30.9339,orderuv_7d偏度skewness为5.1001,峰度kurtosis为32.9219,这样的分布非常不均衡,不利于后期模型的拟合,因此需要对这些特征进行开方转换。
feature |
skewness |
kurtosis |
newfeature |
skewness |
kurtosis |
similar_score |
9.2341 |
132.095 |
Sqrt_similar_score |
2.8657 |
11.5567 |
basketuv_7d |
5.0373 |
30.9339 |
Sqrt_basketuv_7d |
2.4288 |
6.983 |
orderuv_7d |
5.1001 |
32.9219 |
Sqrt_orderuv_7d |
2.4162 |
6.8912 |
3.4 特征共线性检查
计算两两特征变量的pearson相关系数,检查特征之间是否存在较强的线性相关性。当特征之间高度相关时,数据小小的变化,比如误差的发生都会引起模型参数严重震荡,明显降低模型的预测能力。同时共线性导致模型结果难以解释,因为难以分辨每个特征对结果的影响。Sqrt_basketuv_7d与Sqrt_orderuv_7d线性相关系数为0.9452,说明这两个特征之间有明显的线性相关性,在后续的建模中只考虑Sqrt_orderuv_7d一个特征。
|
Sqrt_similar_score |
discount |
Sqrt_basketuv_7d |
Sqrt_orderuv_7d |
procr |
online_time |
Sqrt_similar_score |
1 |
-0.0191 |
0.184 |
0.2079 |
0.1341 |
0.0467 |
discount |
-0.0191 |
1 |
-0.033 |
-0.0526 |
-0.0688 |
-0.1779 |
Sqrt_basketuv_7d |
0.184 |
-0.033 |
1 |
0.9452 |
0.3203 |
0.0029 |
Sqrt_orderuv_7d |
0.2079 |
-0.0526 |
0.9452 |
1 |
0.4167 |
0.0368 |
procr |
0.1341 |
-0.0688 |
0.3203 |
0.4167 |
1 |
0.2495 |
online_time |
0.0467 |
-0.1779 |
0.0029 |
0.0368 |
0.2495 |
1 |
经过特征筛选后,进入模型训练的特征共有五个:Sqrt_similar_score、discount、Sqrt_orderuv_7d、procr、online_time。
四、模型搭建
4.1 数据集
选择2018/01/14-2018/04/13用户点击、收藏、加购、订单行为数据中,构建特征(Sqrt_similar_score、discount、Sqrt_orderuv_7d、procr、online_time)作为自变量,2018/04/14-2018/04/20用户订单数据作为因变量,自变量和因变量通过customers_id,products_id进行连接,过滤未下单的注册用户和新注册的用户,得到样本数据(下单的商品为正样本,未下单的商品为负样本)。对样本数据随机抽样,保证正负比例为1:1,按照80:20的比例划分训练集和测试集。
4.2 模型训练
在本案例中,我们选择了两种机器学习算法—逻辑斯蒂回归(LR)、随机森林(RF)。在对算法进行参数调优后,最终选择逻辑斯蒂回归模型,主要考虑两个原因:一方面,LR模型的精度与RF的精度没有相差无几,另一方面,LR模型效率更快,更适用线上实时计算。
模型过拟合与欠拟合判断 |
|
trainError |
0.147520764 |
testError |
0.149485083 |
模型精度 |
|
ROC |
PR |
0.926509 |
0.930102 |
特征 |
Sqrt_similar_score |
Sqrt_orderuv_7d |
discount |
procr |
online_time |
系数 |
3.3301 |
0.2795 |
-0.2317 |
0.0983 |
0.0003 |
注:特征系数的绝对值代表特征对因变量的预测能力。
4.3 模型验证
测试集虽然可以评估模型是否过拟合,但是也参与了模型的选择。为了保证模型上线后,对新数据有较好的泛化能力,还需要用新时间段的数据集对模型进行验证。利用训练好的模型,预测用户2018/04/15-2018/04/21下单的商品,计算命中率为19.58%,符合预期。
五、模型上线效果跟踪
模型上线后,通过featureAB对比,转化率有明显提升,在此基础上又进行了优化,一方面,用户之前感兴趣的分类已下架,推荐时对失效分类进行过滤;另一方面,分类下的商品候选集保留400个,若所有商品都被用户已浏览,选择相似分类补充(扩展推荐结果的多样性)。经过两个周的连续观察,转化率CR和用户人均收入ARPU分别提升8.51%、17.67%。