注意,本篇博文代码存在一些问题,请查看修改版的博文,地址为:
- 写在开头:本篇博文的适用对象为对天池比赛完全不知如何下手的小伙伴。本文将从头开始记录如何最简单地整理数据、提取特征,再建立模型或者使用人工规则进行预测,然后选出数据并提交,最后得到结果。所以,本文并不会更多得关注特征的选择提取以及模型该如何建立。最后,本人所使用的工具为Spark,非常地方便,它包含了spark-sql工具,数据库默认使用的是derby,同时,Spark含有mllib库,能非常方便地进行机器学习相关工作,可以说,线下比赛能够完全用Spark完成。
赛题说明
官方说明如下,这里只进行简单解释。
https://tianchi.shuju.aliyun.com/getStart/introduction.htm?spm=5176.100068.5678.1.VEirgR&raceId=231522
可以看到,有两个表。第一个表UI是用户这个月内在商品全集上的行为数据,第二个表P是商品子集信息。而赛题说了,评分数据是12月19号用户对商品子集里商品购买信息的预测。所以,这里提供几个简单规则:
- 可以根据P表里的商品信息,对UI表进行过滤,只留下含有P表商品的交互记录。这条规则背后蕴含的原理是,因为用户对不同类别商品或者服务,购买的策略不同,所以我们只去考虑P表内含有的那些类别的数据去进行学习。
- 将实际情况简化,这里只通过预测日前两天的用户商品交互情况来预测。即,为了预测19号的购买情况,我们就用17、18号的用户交互情况来预测。为了进行预测,我们就需要学习一个模型出来。所以,我们可以去根据16、17号的用户交互数据,以及18号用户的购买数据来学习出这个模型,本文将简单地选择决策树模型。
- 因为UI表格里只含有浏览、收藏、加购物车以及购买这四个数据,对于构建一棵决策树来说肯定不够,所以我们要想办法扩充特征,例如对用户进行打分(例如对某个商品浏览一次加2分,收藏加3分等等)、算一下浏览占总交互次数的比例,等等等。这里只是我随意举的特征,具体的还需要自己打开脑洞想一想。
- 有一个重要问题需要注意,对于我们提取出来的训练集数据里,在18号不会购买的项的数据量比18号购买的项的数据量多得多,也就是正负样本比例相差得太大!这对于模型学习是灾难性的,学习出的模型完全不能用。所以,我们需要选出训练集里所有在18号购买了的,再选出同等数量或者相差不多的数量的负样本作为新的训练集,利用新训练集去学习决策树模型,这样才能起效果。
数据准备
如果涉及到Spark集群,那么操作文件都默认在HDFS上。首先将两个源数据