美团用户出行坐席预测

背景

通过预测用户出行所选择的坐席类别,来评价一个用户在美团大交通业务的消费能力以及价格敏感性。

建模方案

建模对象

由于用户所选的坐席类别与出行距离具有相关性,不同用户长途短途之间选择的坐席并无可比性,例如,一个人选择飞机,另外一个人选择高铁二等座,并不能说明前者消费能力更强,很有可能前者是长途,而后者是短途旅行。因此在给定用户出行场景的条件下,预测用户所选择的坐席类别。即我们并不建模P(坐席|用户u),而是建模条件概率 P(坐席|用户u,长程 or 短程 or中程)。目前,我们将出行距离分为3个区间,短程:小于500km;中程:大于600km小于1100km;长程:大于1200km小于4000km

Q:为什么这么划分出行区间?

A:从选择硬卧出行的角度出发,普快火车时速为80-100km/h,将6个小时算做一晚,一晚的行程大概是600公里,为了进一步保证数据质量,将小于500km划为短程;进一步,将大于600km做划分,根据二等座和经济舱的出行距离分布(直方图和箱线图),以1200为界(大于1200km在二等座出行中占比较少,大于1200km在经济舱出行中占比仍然很大)大于600km小于1100km为中程,大于1200km小于4000km为长程

预测目标

根据不同坐席的数量和价格,将所有坐席划分为9个类别

类别编号 坐席 数量
0 商务舱或特等舱 1.2w
1 商务座或特等座 3w
2 一等座或高级软卧或动卧 35w
3 经济舱 220w
4 二等座 530w
5 软卧 9w
6 软座 9w
7 硬卧 110w
8 硬座或无座 380w

数据准备

从美团火车票机票订单表中选取下单时间在2018年4月和5月的订单记录,根据出行距离划分为短程出行、中程出行和长程出行,然后再根据坐席类别生成label信息。

节假日是购票高峰期,可能存在票量不足的情况,因此过滤掉节假日期间的订单。

训练集与测试集划分:用4月份的数据做训练集,5月份的数据作为测试集

特征选择

最近一年有活跃的用户才有特征,v1版没有用户历史的坐席特征,更有利于预测新客

模型选择

xgboost,lr

效果评估

指标:xgb短途准确率:0.634 xgb长途准确率:0.616 统计出混淆矩阵,各类别的p r f1值。

lr短途准确率:0.623 lr长途准确率:0.594

组内评估基本符合预期

用户分组

根据用户在长途短途各坐席上的概率分布,对用户聚类分析。用kmeans聚成5类

模型优化

数据优化

  1. 可以对长程进一步划分为中程和长程
  2. 对每一类的数据进行优化,比如经济舱,可以去除掉特价机票(统计不出折扣信息,因此作废),去除火车出行距离异常的数据

特征优化

根据v1版特征重要性可以看出,1.火车机票浏览信息 2.反映用户消费水平的特征 3.用户优惠券相关特征 这几类特征比较重要,v2版加入用户历史的坐席特征和其他bu的历史下单特征,由于加入了历史特征,所以对新老客分开评估。

效果评估

由于重新对出行距离进行了划分,因此只有短途可以跟之前的效果相比较,短程准确率:0.677(+4.3%),老客提升较大12.6%,新客提升2.3%;中程准确率:0.678;长程准确率:0.86

组内评估比之前更准确

从特征重要性可以看到,重要的特征为用户历史出行特征

遇到的问题

  1. 在优化的时候,首先我重新回顾了下目标:根据用户价格敏感度将用户分群,也就是9个类别能反映出用户的敏感度等级,因此引出一个问题,现在将长短途坐席划分成这9类是否是合理的,比如软卧类别,软卧的价格和二等座价格基本相等,而且类别数量很少,分类效果差。跟mentor讨论后,决定沿用初始的类别划分,原因是根据长短途每个类别的概率生成向量,对用户进行聚类,像软卧这种数量较少的类别,概率基本都很低,即这一维的方差很小,因此对聚类结果不会产生太大的影响。
  2. 数据表权限问题、字段问题。想统计机票打折信息,但是相关表负责人说订单表已经没有折扣字段了,因此作废;想统计其他bu的详细的消费情况,考虑到这样需要用到的表较多,而且已经有一些用户消费情况的特征,因此简单统计了用户各bu的下单次数和金额
  3. 数据穿越问题。在做组内评估时,发现结果与预期差别较大,不符合实际,后来通过case分析,发现有一个特征会导致预测变差,检查etl后发现,该特征包含了label相关的信息,即数据穿越。修改etl解决了该问题,组内预测结果正常。