干货 | 机器学习算法在饿了么供需平衡系统中的应用
image:url(https://ask.qcloudimg.com/avatar/1292807/6341kxs4h2.png?imageView2/2/w/72)">用户1292807发表于携程技术中心订阅
作者简介
陈宁,饿了么人工智能与策略部高级算法专家,负责供需平衡系统的算法与研发工作。获新加坡南洋理工大学计算机博士学位,研究方向包括:数据挖掘,机器学习,自然语言处理,软件工程等,曾发表7篇*国际会议 (期刊)论文。
一、前言
即时配送物流系统是外卖领域核心价值所在。区别于其他物流,这个行业的“物流”是希望30分钟内能够送到,这就对我们的算法模型具有很大的挑战。智能调度系统更是即时配送物流系统中的核心。
在本文中,我将介绍饿了么的智能调度系统,着重介绍其中的压力平衡子系统,并通过两个实例,分享机器学习算法在构建压力平衡系统中起到的关键作用以及取得的成果。
希望通过本文,帮助一线的机器学习算法工程师和爱好者们了解饿了么即时配送系统中压力平衡系统的构建,以及如何利用常见机器学习算法有效地解决O2O场景下的实际问题。
二、饿了么智能调度系统
饿了么智能调度系统是外卖即时配送领域中最核心的环节,该系统替代了调度员大部分的工作,减少了人力介入的程度,实现了自动化、智能化的派单。
智能调度系统主要可以划分为四个子系统,如图1所示:
图1 饿了么智能调度系统
- 智能派单:包括骑手与订单的匹配策略, 骑手的路径规划等;
- 时间预估:包括骑手行程时间预估, 骑手楼内停留时间预估, 出餐时间预估与下单送达时间预估等;
- 供需平衡:包括实时的压力平衡,中长期订单预测、运力规划和短期的骑手排班等;
- 位置服务:包括配送范围划定, 商圈/楼宇/配送点的建设,位置校准等。
以上各个子系统相辅相成,组成了整个饿了么智能调度系统。本文中我将重点介绍机器学习算法在供需平衡中的实时压力平衡系统中起到的作用。
三、压力平衡系统
3.1 系统目标
压力平衡系统要解决的问题是:当配送供给(骑手)与用户需求(订单)出现日内的异常不匹配时,为了保证用户体验不受到过大损伤,及时有效地使用调控手段来平衡需求与供给。
图2 压力平衡系统目标
造成用户需求和配送供给日内异常不匹配的原因有很多:比如遇到恶劣的天气、商家搞一些临时性的大活动,骑手运力本身不充足等。
当出现异常不匹配时(压力高于某个阈值),压力平衡系统会采取一定的措施。比如上调配送费、缩小配送范围、下满减活动、关店等。
3.2 算法框架
图3展示了压力平衡算法的总体架构:
图3 压力平衡算法框架图
首先,图3的最上方 (M1) 展示的是团队(饿了么组织运力的最小单元,一个团队由若干骑手组成) 压力系数及其辅助指标的实时监控和预测模块。这个模块主要的作用是估算自动调控开始的最佳时机和调控的量化控目标:即当压力系数大于一定的阈值时,开始自动采取一系列的措施,使得压力系数降低到可接受的范围。
其次,图3的中部 (M2) 展示的主要是两个模块:1)餐厅理解;2)调控策略池。其中,餐厅理解:利用餐厅重要性排序模型,单店爆单模型,餐厅配送难度等信息来细化调控的基本单元,它使我们知道哪些餐厅是应该首先被调控的。调控策略池包含了调控可用的调控手段,例如:增加配送费,下大额满减活动,缩小餐厅的配送范围等。
最后,图3的底部 (M3) 展示的是自动调控策略生成主模型:我们会根据量化的调控目标,来优化单个或多个指标的组合。通过数据、算法来决定调控哪些餐厅,每个餐厅使用什么样的调控策略。
图中每个模块都通过数据驱动,应用了机器学习算法来实现相应的目标。图中绿色标记是我们已经完成的,标记黄色部分是我们正在或者规划中的工作。在第四章中,我将通过两个例子来介绍我们取得的一些成果。
3.3 数据监控
我们还构建了一套策略实时监控系统,方便相关人员查看。例如,图4显示的是某个团队的实时压力系数。团队压力系数,我们做到了归一化(所有团队值域一致,含义一致),并且能根据天气、温度等情况自适应地变化。当前,这个指标我们做到了每隔5分钟更新一次。在第四章中,我将会更加详细地介绍团队压力系数的计算方式。
图4 压力系数监控看板
四、机器学习算法在压力平衡中的应用
在这个章节中,我将通过两个案例来介绍机器学习算法在构建饿了么压力平衡系统中起到的关键作用。
4.1 骑手最大背单能力模型
骑手的最大背单能力反应了一个骑手的水平,是骑手画像的非常重要的组成部分。第一版,由于我们只是为了得到团队的最大背单能力,所以我们只使用了简单的规则,计算了团队的平均最大背单能力,用这个平均最大背单能力作为这个团队骑手的最大背单能力。显然,这是非常不合理的。
在第二版中,我们通过一些负责的规则,将骑手分成了若干等级,每个等级的骑手具有一个相同的最大背单能力。这个版本的骑手最大背单能力具有了一些个性化,但是任然无法细致、有效地区分不同骑手的水平。
在第三版中,我们采用了机器学习的方法,把这个问题抽象成一个二分类的问题,从而得到了每个骑手在不同背单量情况下超时的概率。图5显示了以上介绍的迭代内容,下面介绍V3.0版本我们的思路。
图5 骑手最大背单能力模型迭代
解决这个问题的关键思路在于,我们将骑手最大背单能力的估算转化为一个二分类问题。具体步骤如下:
第一步:我们队每张骑手的运单构建一条训练数据;
第二步:统计这张运单运送过程中骑手的最大背单量作为其中一个特征;
第三步:统计其他特征,包括骑手画像相关特征,天气特征等;
第四步:构建二分类的Label,一张运单超时记为1,不超时记为0;
第五步:使用大量的训练数据,训练得到一个线性的二分类模型;
第六步:给定一个骑手,固定其他特征,并滑动最大背单量特征,得到该骑手在不同最大背单量下超时的概率。
下面,我详细介绍一下特征工程部分,主要包括以下几块内容:
1)骑手历史最大非超时背单量。包含前28天、21天、14天、7天、5天、3天的骑手平均最大非超时背单量; 2)天气和温度信息; 3) 骑手的个性化信息:包括骑手的等级,骑手的工作天数,骑手所在团队的信息等; 4) 时间信息:主要包括该日是一周的哪一天,是否是工作日两个特征; 5)运单信息:运单运送过程中骑手的身上最大背单量。
接下来我介绍一下模型的选择和训练集和预测集的构造。根据简单有效原理(即:奥卡姆剃刀定律),我们采用了常用的线性模型,即Logistic Regression(LR)模型,我们的考虑如下:
- 线性模型,模型非常简单,有效,计算速度快;
- 模型可解释性很强,便于业务人员理解;
- 问题需要输出[0,1]之间的概率值, LR使用sigmoid函数能够将预测值转化为概率值。
训练集的构造我们采用了最近14天的运单数据,即数据日期范围是[T-13,T], 时间范围限定在了午高峰(10:30~12:30)。由于超时单相比非超时单占比非常小,所以我们对正负样本的比例进行了调整,对非超时样本按照10%左右进行了降采样。
在构造测试集时,我们对运单运送过程中骑手的最大背单量特征进行滑动,从0 ~ 30按照0.5的间隔进行构造。然后通过训练的模型进行预测,从而得到骑手在不同背单量下的超时概率。如图6所示, 是taker_id =342853的骑手在不同max_order_num_on_taker情况下超时的probability。
图6 骑手在不同背单量情况下超时的概率
下面我来介绍一个骑手最大背单模型的重要应用场景,即计算团队的压力系数:
我们定义团队压力系数 = load / (q1 + q2 + .... qn)
1)load = 团队负载
2)qn = 该团队第n位骑手的个性化最大背单量(使用骑手最大背单模型计算的数值)
团队压力系数的定义简洁有效,直接支持了饿了么即时配送相关10多个相关业务系统:包括智能派单,压力平衡,运单分流,T模型,客服系统等。
4.2 团队压力系数预测模型
正如章节4.1所介绍,团队压力系数是即时配送中一项非常重要的基础指标,因此,如果我们能提前预测这一指标将会对多个业务系统产生巨大的价值。基于此,我们构建了一个实时的团队压力系数预测模型,它能够每隔5分钟对团队未来1个半小时(每15分钟一个时间片,共6个时间片)的压力系数进行预测。图4中的虚线即展示了其中一次预测的值。我们将这个模型应用在以下2个场景中:
1)定量描述压力平衡自动调控的目标,辅助确定自动调控的时间点,进行提前调控;
2)应用在智能派单策略上,通过压力系数的预知,规划不同的派单策略。
如下图所示:截止目前,我们完成了团队压力系数预测模型的三轮迭代。通过
持续迭代,我们大幅提高了模型预测的准确率和预测的频率。
五、总结展望
通过本文,我们希望读者能够对饿了么即时配送体系中的压力平衡系统以及如何利用常见的机器学习算法有效解决O2O场景下的实际问题有所了解。展望未来,压力平衡系统中仍然有很多问题可以抽象成机器学习问题(例如:排序学习,时间序列等),希望在不久的未来,有机会和大家分享我们更多的成果。