背景
通过预测用户出行所选择的坐席类别,来评价一个用户在美团大交通业务的消费能力以及价格敏感性。
建模方案
建模对象
由于用户所选的坐席类别与出行距离具有相关性,不同用户长途短途之间选择的坐席并无可比性,例如,一个人选择飞机,另外一个人选择高铁二等座,并不能说明前者消费能力更强,很有可能前者是长途,而后者是短途旅行。因此在给定用户出行场景的条件下,预测用户所选择的坐席类别。即我们并不建模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版没有用户历史的坐席特征,更有利于预测新客
- mt_train_features:
- 过去两周回家指数
- 去年同期位移次数、最大位移距离
- 过去一周火车票页面活跃天数
- 过去一周各bu是否下单、是否异地下单
- 相同geohash下单情况
- mt_user_hotel_coupon_features.predict
- 用户一级品类偏好特征
- 用户活跃度
- 用户画像基础特征
- 用户最近一周定位特征
- 美团用户酒店相关特征(过去6个月、17个月消费次数,金额,活跃度,流失倾向,异地,消费价格区间,酒店星级,未使用的酒店优惠券)
- 昨天的浏览及各bu购买行为
- 敏感度相关特征
- 使用红包比例
- 点击券中心比例
- 霸王餐比例
- 酒店首次下单是否用红包
- 大交通业务首次下单是否用红包
模型选择
xgboost,lr
效果评估
指标:xgb短途准确率:0.634 xgb长途准确率:0.616 统计出混淆矩阵,各类别的p r f1值。
lr短途准确率:0.623 lr长途准确率:0.594
组内评估基本符合预期
用户分组
根据用户在长途短途各坐席上的概率分布,对用户聚类分析。用kmeans聚成5类
模型优化
数据优化
- 可以对长程进一步划分为中程和长程
- 对每一类的数据进行优化,比如经济舱,可以去除掉特价机票(统计不出折扣信息,因此作废),去除火车出行距离异常的数据
特征优化
根据v1版特征重要性可以看出,1.火车机票浏览信息 2.反映用户消费水平的特征 3.用户优惠券相关特征 这几类特征比较重要,v2版加入用户历史的坐席特征和其他bu的历史下单特征,由于加入了历史特征,所以对新老客分开评估。
- 历史出行特征
- 过去一年购买飞机票次数
- 过去一年购买商务舱/特等舱次数
- 过去一年购买经济舱次数
- 过去一年飞机出行总距离
- 过去一年飞机出行总消费
- 上一次飞机出行距今天数
- 过去一年购买火车票次数
- 过去一年购买商务座或特等座次数
- 过去一年购买一等座或高级软卧或动卧次数
- 过去一年购买二等座次数
- 过去一年购买硬卧次数
- 过去一年购买硬座或无座次数
- 过去一年火车出行总距离
- 过去一年火车出行总消费
- 上一次火车出行距今天数
- 选飞机比例
- 选二等座比例
- 选硬座无座比例
- 平均每公里花费
- 历史浏览特征
- 过去一年境内游页面浏览次数
- 过去一年境外游页面浏览次数
- 过去一年境外游页面浏览占比
- 过去一年火车票浏览次数
- 过去一年飞机票浏览次数
- 过去一年飞机票页面浏览占比
- 过去一年特价飞机票页面浏览次数
- 过去一年抢票页面浏览次数
- 过去一年选择只看高铁次数
- 过去一年选择只看高铁比例
- 一级品类历史下单特征
- 过去一年下单次数
- 过去一年下单金额
- 平均每单金额
效果评估
由于重新对出行距离进行了划分,因此只有短途可以跟之前的效果相比较,短程准确率:0.677(+4.3%),老客提升较大12.6%,新客提升2.3%;中程准确率:0.678;长程准确率:0.86
组内评估比之前更准确
从特征重要性可以看到,重要的特征为用户历史出行特征
遇到的问题
- 在优化的时候,首先我重新回顾了下目标:根据用户价格敏感度将用户分群,也就是9个类别能反映出用户的敏感度等级,因此引出一个问题,现在将长短途坐席划分成这9类是否是合理的,比如软卧类别,软卧的价格和二等座价格基本相等,而且类别数量很少,分类效果差。跟mentor讨论后,决定沿用初始的类别划分,原因是根据长短途每个类别的概率生成向量,对用户进行聚类,像软卧这种数量较少的类别,概率基本都很低,即这一维的方差很小,因此对聚类结果不会产生太大的影响。
- 数据表权限问题、字段问题。想统计机票打折信息,但是相关表负责人说订单表已经没有折扣字段了,因此作废;想统计其他bu的详细的消费情况,考虑到这样需要用到的表较多,而且已经有一些用户消费情况的特征,因此简单统计了用户各bu的下单次数和金额
- 数据穿越问题。在做组内评估时,发现结果与预期差别较大,不符合实际,后来通过case分析,发现有一个特征会导致预测变差,检查etl后发现,该特征包含了label相关的信息,即数据穿越。修改etl解决了该问题,组内预测结果正常。