移动推荐算法比赛已经结束了一个多星期了,现在写一篇文章来回顾一下自己的参赛历程。
首先,对不了解这个比赛的同学们介绍一下这个比赛(引用自官网):
赛题简介
2014年是阿里巴巴集团移动电商业务快速发展的一年,例如2014双11大促中移动端成交占比达到42.6%,超过240亿元。相比PC时代,移动端网络的访问是随时随地的,具有更丰富的场景数据,比如用户的位置信息、用户访问的时间规律等。
本次大赛以阿里巴巴移动电商平台的真实用户-商品行为数据为基础,同时提供移动时代特有的位置信息,而参赛队伍则需要通过大数据和算法构面向建移动电子商务的商品推荐模型。希望参赛队伍能够挖掘数据背后丰富的内涵,为移动用户在合适的时间、合适的地点精准推荐合适的内容。
赛制安排
第一赛季,3月20日—4月25日
1. 可下载的少量淘宝数据,并在本地调试算法,提交结果;若队伍一天内多次提交结果,新结果版本将覆盖原版本;
2.4月1日起开放提交结果入口,4月2日出首次排行榜,每天更新排行榜, 按照F1分从高到低排序;排行榜将选择选手在本阶段的历史最优成绩进行排名展示;
3.4月20日将进行一次数据切换,排行榜取20日之后成绩排名;
4. 第一赛季截止时,最好成绩排名前500名的队伍进入第二赛季;
第二赛季,4月30日-7月1日
1. 第二赛季分为2个阶段:
1)Part 1,4月30日-6月23日, Part 1截止时,最好成绩排名前200名的队伍进入Part 2;
2)Part 2,6月24日-7月1日, Part 2截止时,最好成绩排名前5名的队伍将受邀参加决赛答辩;
注:
Part 1答案数据包含在观测日期当天有购买行为的用户全集50%的用户购买数据;
Part 2答案数据包含在观测日期当天有购买行为的用户全集100%的用户购买数据,即Part 2阶段的用户量是Part 1阶段的2倍;
2.入围选手需登录天池平台,访问和使用海量淘宝数据,并利用Map&Reduce、SQL及各种平台集成的机器学习算法包调试模型,提交结果;
3.第二赛季提供每天1次的评测机会,提交截止时间为0点,每天更新排行榜, 按照F1分从高到低排序;
数据说明
竞赛数据包含两个部分。第一部分是用户在商品全集上的移动端行为数据(D),表名为tianchi_mobile_recommend_train_user,包含如下字段:
字段 |
字段说明 |
提取说明 |
user_id |
用户标识 |
抽样&字段脱敏 |
item_id |
商品标识 |
字段脱敏 |
behavior_type |
用户对商品的行为类型 |
包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。 |
user_geohash |
用户位置的空间标识,可以为空 |
由经纬度通过保密的算法生成 |
item_category |
商品分类标识 |
字段脱敏 |
time |
行为时间 |
精确到小时级别 |
第二个部分是商品子集(P),表名为tianchi_mobile_recommend_train_item,包含如下字段:
字段 |
字段说明 |
提取说明 |
item_id |
商品标识 |
抽样&字段脱敏 |
item_ geohash |
商品位置的空间标识,可以为空 |
由经纬度通过保密的算法生成 |
item_category |
商品分类标识 |
字段脱敏 |
训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。
评分数据格式
具体计算公式如下:参赛者完成用户对商品子集的购买预测之后,需要将结果放入指定格式的数据表(非分区表)中,要求结果表名为:tianchi_mobile_recommendation_predict,包含user_id和item_id两列(均为string类型),要求去除重复。例如:
初赛数据
初赛阶段提供10000用户的完整行为数据以及百万级的商品信息;训练和预测的数据将会在4月20日进行一次切换(即切换为另一批10000用户的数据)。
决赛数据
决赛阶段提供500万用户的完整行为数据以及千万级的商品信息。
评估指标
比赛采用经典的精确度(precision)、召回率(recall)和F1值作为评估指标。具体计算公式如下:
其中PredictionSet为算法预测的购买数据集合,ReferenceSet为真实的答案购买数据集合。我们以F1值作为最终的唯一评测标准。
知道了这个比赛的背景及数据之后我们开始介绍第一赛季:
第一赛季用户数为1万,一个月的用户商品交互总共千万级别,商品子集十万级别,我们第一次根据用户的心里行为,觉得前一天的购物车商品很有可能第二天就被购买,所以我们直接提交了12月18号一天的购物车(跟商品子集交),得到的成绩为
这个成绩在当时确实不错,特别是好多人还没想到这个侥幸的方法的时候,我们觉得还是挺机智的。这种直接提交购物车的方式不涉及任何算法,我们以后就称为规则了。之后的几天我们开始很兴奋的去寻找各种规则,包括剔除掉在30天里从来不买东西的人
包括把前一天加入购物车然后当天购买的剔除掉
还有一条云泛天音小哥给我们的指导,就是假设用户在12月18号上午9点加入购物车三件东西,10点买了其中一件,那么剩下两件就可以删掉了,因为如果要买,为何不一起买呢,因为用户做出了选择,F1继续提升
这时候F1已经破9了,但是由于我们一直是在一天的数据集上进行操作,所以recall是有瓶颈的。但此时对于我们来说还是想继续找规则,相信那个阶段很多队伍都跟我们一样,原因只有一个,那就是规则提升太快了。
后来实在找不出啥强有力的规则来了,就准备用一下算法,因为LR快速简单,在python里面有包,我们就直接拿来用了,对稀疏问题采用了L1正则化.LR自己写的话也很快,就一个梯度下降定参。同一队的小哥之前用过那个包,我们就直接拿来用了。拆分数据集我们是这样做的
19号:线上测试
18号:线下测试用
17号:线下训练用(用当天购买或没购买的作用对打标签,然后用16号及之前的提特征)
16号之前的:提特征用
其中的具体数据是多少由于时间久远记不太清楚了,但其中最大的问题就是训练的时候正负样本不均衡的问题,我们是在写代码的时候把他当做一个参数设置的,然后选择最优的,第一赛季负样本我们做了1/20的抽样,正负样本比例我记得是在1:5左右。