2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

本文作者:王贺

本文给出2019JDATA比赛亚军的完整方案和完整代码,直接学习代码,没有比这个更“硬核”的了。

代码在此:

https://github.com/anzhizh/2019-taida-jdata-top3

赛题背景

https://jdata.jd.com/html/detail.html?id=8

      京东零售集团坚持“以信赖为基础、以客户为中心的价值创造”这一经营理念,在不同的消费场景和连接终端上,在正确的时间、正确的地点为3亿多活跃用户提供最适合的产品和服务。目前,京东零售集团第三方平台签约商家超过21万个,实现了全品类覆盖,为维持商家生态繁荣、多样和有序,全面满足消费者一站式购物需求,需要对用户购买行为进行更精准地分析和预测。基于此,本赛题提供来自用户、商家、商品等多方面数据信息,包括商家和商品自身的内容信息、评论信息以及用户与之丰富的互动行为。参赛队伍需要通过数据挖掘技术和机器学习算法,构建用户购买商家中相关品类的预测模型,输出用户和店铺、品类的匹配结果,为精准营销提供高质量的目标群体。同时,希望参赛队伍通过本次比赛,挖掘数据背后潜在的意义,为电商生态平台的商家、用户提供多方共赢的智能解决方案。

评价指标

      参赛者提交的结果文件中包含对所有用户购买意向的预测结果。对每一个用户的预测结果包括两方面:

(1)该用户2018-04-16到2018-04-22是否对品类有购买,提交的结果文件中仅包含预测为下单的用户和品类(预测为未下单的用户和品类无须在结果中出现)。评测时将对提交结果中重复的“用户-品类”做排重处理,若预测正确,则评测算法中置label=1,不正确label=0。

(2)如果用户对品类有购买,还需要预测对该品类下哪个店铺有购买,若店铺预测正确,则评测算法中置pred=1,不正确pred=0。

对于参赛者提交的结果文件,按如下公式计算得分:score=0.4F11+0.6F12

此处的F1值定义为:

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)其中:Precise为准确率,Recall为召回率;F11 是label=1或0的F1值,F12 是pred=1或0的F1值。

问题定义

问题一:“预测该用户2018-04-16到2018-04-22是否对品类有购买”

问题二:“预测对该品类下哪个店铺有购买”

我们将问题一定义为预测用户ID+品类ID组合成的F11ID,在2018-04-16到2018-04-22是否发生购买行为的二分类问题。

我们将问题二定义为预测用户ID+品类ID+店铺ID组合成的F12ID,在2018-04-16到2018-04-22是否发生购买行为的二分类问题。

解决方案:我们针对问题一和问题二分别建立模型,考虑到问题一和问题二关联度很强,采用的特征工程的思路基本相同,最终对两个结果进行融合得到预测结果。


探索性数据分析

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

EDA探索的一些重要发现:

预测需要的cate条目存在于商品表中,且店铺表中同样存在cate条目,此条目(shop_cate)  和商品表中的cate条目不同,仅是同名的不同特征,更不可用于F11问题的预测;

店铺表下, 仅有vender_id==3666(商家ID )关联多个shop_id,进一步探索后发现,这些shop_id关联的所有行为记录中(约占全部数据的40%),没有一条是购买记录

用户行为中的type=5的情况(加入购物车)仅在4.08之后出现

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

存在未关联数据,需要进行剔除。

异常数据处理方法:

1.由于春节前后数据分布异常,很可能与测试集的数据分布不一致,在构建训练集的时候应避免使用2.22日之前的数据。

2.构建时间相关(前N天行为统计等)特征避免使用春节前后的数据,构建累积特征则不需要特别考虑。

3.对3.27,3.28两天出现的异常采样问题,我们考虑到其购买行为的分布与前后基本一致,只在构建部分时间相关特征避免使用,其他并未做特别处理。

训练集构建

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

2018-03-10到2018-04-11的行为表中出现的F11ID、F12ID作为训练集的F11ID、F12ID。

2018-04-11到2018-04-16的行为表中出现的,且也在训练集中出现过的F11ID、F12ID作为标签集。

在2018-02-01到2018-04-11(全量)时间区间内完成对训练集中F11ID、F12ID的特征提取。

测试集构建

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

2018-03-15到2018-04-16的行为表中出现的F11ID、F12ID作为测试集的F11ID、F12ID。

在2018-02-01到2018-04-16(全量)时间区间内完成对测试集中F11ID、F12ID的特征提取。

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

此外,为了合理利用只有在最后八天存在的加入购物车行为记录,建立了另一个类似的模型,随后将做介绍。

特征工程基本思路

结合基本的统计特征,通过使用户的行为记录,在长效、中期、短期三个时间维度,对用户、品类、商铺、F11ID(消费者和品类)、F12ID(消费者、品类、店铺)进行表示建立,建立时效行为兴趣特征同时合理利用type==5存在的最后八天数据,围绕type==5建立特征工程以及新的模型。

结合以上思路,我们的特征可以基本分为三类

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

基础统计特征

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

时效行为兴趣特征

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

时效行为兴趣特征-user_id上的补充

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

购物车行为上的探索

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

在EDA环节中,我们提到过,用户行为中的type==5的记录(加入购物车)仅在4月8日零点之后出现,仅有最后八天的记录。

经过EDA后发现这8天内type==5的分布较为稳定,应该是前后差异应当是人工采样的结果。

这种结果导致训练集(3.10-4.09)只含有一天的加入购物车记录,而测试集(3.15-4.16)则含有8天的加入购物车记录,导致两个数据集的分布严重不同,因而比赛的初期,在考虑特征工程时暂时先将所有的购物车记录进行了删除。

购物车行为特征建立

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

第一中思路为在原有七天作为label的模型的基础上,通过对购物车记录进行处理保证前后分分布一致。

具体方法为:训练集中保留4.08当天的type==5的记录;

测试集中保留4.15当天的type==5的记录;

并针对这一天(也是数据集的最后一天)的购物车记录进行特征提取,特征如下:

1. 加入购物车行为在5个维度下的次数;

2. 加入购物车行为在5个维度下的转化率(与其他行为次数的比值);

3. 加入购物且未发生购买行为次数;

4. 加入购物且未发生购买行为的相关商品数。

购物车相关新模型建立

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

在上一步的基础上,我们思考了如何能利用更多的购物车信息。为满足分布一致的要求,我们将原预测七天改为预测五天,可以将训练集的购物车信息从一天增加到三天,同时删去测试集除最后三天之外所有购物车信息,使分布一致。最后使用类似的特征工程方法对type==5的记录进行了特征提取。

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

具体构建方法如下:

训练集构建:

2018-03-10到2018-04-11的行为表中出现的F11ID、F12ID作为训练集的F11ID、F12ID。

2018-04-11到2018-04-16的行为表中出现的,且也在训练集中出现过的F11ID、F12ID作为标签集。

在2018-02-01到2018-04-11(全量)时间区间内完成对训练集中F11ID、F12ID的特征提取。

测试集构建:

2018-03-15到2018-04-16的行为表中出现的F11ID、F12ID作为测试集的F11ID、F12ID。

在2018-02-01到2018-04-16(全量)时间区间内完成对测试集中F11ID、F12ID的特征提取。

模型的训练与融合

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

模型训练:

1.采用LightGBM模型进行训练,降低二分类的log loss。

2.为加快模型的训练速度,使用全部的正样本,并通过随机抽样选取正样本数三十倍左右的负样本进行训练(正样本数约为2.6万,负样本数约为80万)。

模型融合:

通过对评价函数的解读,可知F11的β^2为0.5,F12的β^2为1.5,因而F11分数对准确率更为敏感,F12分数对召回率更为敏感。

我们采取的融合方法如下:

1.取出F11模型预测结果prob的TOP26000,F12模型的预测结果prob的TOP32000,按照F11ID取交集进行inner merge操作,再取出F12模型的TOP15000条融合后去重。

2.两组F11/F12模型都完成融合后,各得到长度22000条的最终结果,取出五天模型的TOP15000与七天模型进行融合并去重,得到最终结果。

赛后经验

1.EDA是理解赛题,处理数据以及构建特征的基础,这一步的工作的好坏,决定了整体工作的方向是否正确以及模型性能的最终上限;

2.在充分的EDA的基础之上,将直觉认为可行的方法快速落地,是一种能有效提高工作效率与质量的方法;

3.过于复杂的推导和脱离数据本身的特征工程往往不会有效,且会浪费非常多的时间,将方法快速落地再根据结果更新改进的方式更有效率。

工作的不足之处

1.由于比赛全程时间较短,且过程中使用的计算机的算力非常有限,还有很多直觉上可行的方案没有机会实践;

2.对score以及F11、F12分数定义公式的理解程度不足,很多问题都是赛后总结中才最终发现;

3.建立的线下验证集可靠程度有限,直觉上感觉最后的融合方法仍然欠佳;

4.特征工程比较复杂,可能存在一些冗余特征,对模型的时间性能有一定的影响。

总结:

本文给出2019JDATA比赛亚军的完整方案和完整代码,直接学习代码,没有比这个更“硬核”的了。

代码在此:

https://github.com/anzhizh/2019-taida-jdata-top3

作者的知乎专栏:

https://zhuanlan.zhihu.com/c_152307828

本站简介↓↓↓ 

“机器学习初学者”是帮助人工智能爱好者入门的个人公众号(创始人:黄海广)

初学者入门的道路上,最需要的是“雪中送炭”,而不是“锦上添花”。

2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)

本站的知识星球(黄博的机器学习圈子)ID:92416895

目前在机器学习方向的知识星球排名第一(上图二维码)

往期精彩回顾

备注:本站qq群:865189078(共8个群,不用重复加)。

加入本站微信群,请加黄博的助理微信2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)说明:公众号用户加群。