比赛已经结束快两个月了,一直拖到现在才开始总结。
官网网址:https://biendata.com/competition/mobike/
GitHub源码:https://github.com/Magic-Bubble/Mobike
任务背景
- 随着绿色出行和环保观念的深入人心,摩拜单车自推出以来不仅深受用户喜爱,也减轻了城市路网压力和拥堵情况
- 摩拜致力于应用前沿科技帮助人们更好地出行,利用机器学习预测用户的出行目的地是众多应用场景中重要的一个
- 目前,摩拜单车在北京的投放量已超40万,为更好地调配和管理这些单车,需要准确地预测每个用户的骑行目的地
任务目标
根据给出的300万的用户出行记录训练数据,对用户出行的目标地点进行预测
衡量指标
其中,|U|是需要预测的orderid总个数,P(k)是在k处的精度,n是地点个数。
评测函数代码请参考: https://github.com/benhamner/Metrics/blob/master/Python/ml_metrics/average_precision.py
数据说明
问题抽象
可以将其转化为一个二分类的问题,首先构造出当前订单可能会去的若干地方,然后用二分类的方式给每个候选地址进行打分,选择分数最高的top3集合即可。
候选目的地构建
- 样本预过滤。从海量候选集中筛选出最可能的候选样本,清理异常样本,减少样本规模,提高候选集的覆盖率和模型精度。比如用户常去的topN地方,以及从这个地点出发常去的topN地方等。
- 规则预过滤。定义规则过滤候选集,如距离等,超过某个距离的就过滤掉
- 起点漂移。将geohash区块临界8块区域记为同一区域,取该区域top连接数目的地。事实证明,这是我们整个方案的瓶颈所在,很多人找车不会在同一个地方找,而大概率可能也会去其附近的地方找车,所以这一步很有必要。
数据集构建
比赛给出的数据是连续两周的用户出行记录,需要预测后面一周的目的地。因此数据集的合理构建也十分有必要,构建方式如下:
具体地,是采用19号之前的为19号加特征,20号之前的为20号加特征,...,最终构建出19,20,21,22,23,24六天的数据作为训练数据。
特征构建
通过对数据的统计和挖掘,从如下两个视角进行特征的构建:
- 特征群。共有三个特征群,用户、时间和地点。其中,用户包含热启动和冷启动(之前没有过出行记录),时间包含周内、周末、小时、天等特征,地点包括经纬度、热度、方向等特征。
- 特征类型。主要包含五个部分,计数特征(比如用户到过这个地方多少次),距离角度特征(出发地到候选目的地的距离方向等),Label窗特征,比率特征(用户到这个地方占其出行次数的比率是多少)等。
模型训练及融合
采用经典的XGBoost和LightGBM进行训练,融合也非常简单,就是两个模型的概率相乘融合。
结果
训练细节
- 样本候选集覆盖率
2. 特征维度
特征重要性排序
总结
- 样本候选集的构建是整个比赛的瓶颈和突破点。我们和前面队伍的差距主要在于此,可以再多扩展一层,变成4*4的漂移区域
- 候选集的覆盖率提升很关键
- 特征基本上都差不多,没有什么强特征,维度太多不仅会影响速度,也可能拉低效果
总体来说,第一次参加数据挖掘类的比赛,还是收获很多!