干货 | 机器学习算法在饿了么供需平衡系统中的应用

image:url(https://ask.qcloudimg.com/avatar/1292807/6341kxs4h2.png?imageView2/2/w/72)">用户1292807发表于携程技术中心订阅

830

作者简介

陈宁,饿了么人工智能与策略部高级算法专家,负责供需平衡系统的算法与研发工作。获新加坡南洋理工大学计算机博士学位,研究方向包括:数据挖掘,机器学习,自然语言处理,软件工程等,曾发表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场景下的实际问题有所了解。展望未来,压力平衡系统中仍然有很多问题可以抽象成机器学习问题(例如:排序学习,时间序列等),希望在不久的未来,有机会和大家分享我们更多的成果。

原文发布于微信公众号 - 携程技术中心(ctriptech)

原文发表时间:2018-01-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于 2018-03-16href="/developer/article/1063407">干货 | 携程度假智能云客服平台

  • 干货 | 携程个性化推荐算法实践
  • 干货 | 平安银行算法实践
  • 干货 | 机器学习在酒店呼叫中心自动化中的应用
  • 干货 | 深入理解Python装饰器

干货 | 机器学习算法在饿了么供需平衡系统中的应用相关推荐

  1. 算法与算力在智能语音系统中的应用

    人工智能的"智"与"能" 人工智能核心技术就是算法与算力,即"智"与"能".算法决定了人工智能的智力高低,它是未来智力高 ...

  2. linux 线程优先级算法,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 图 1 RT-Linux结构 RT -Linux的关键技术是通过软件来模拟硬件的中断控制器.当Linux系统要封锁CPU的中断时时,RT-Linux中的实 ...

  3. 通信算法之五十九:SC_FDE系统中的匹配滤波与频偏纠正

    1. 匹配滤波与初始位置无影响 2.频偏纠正与初始位置无影响,初相会变化 1279682290

  4. OCR算法:车牌识别在停车系统中的工作原理

    车牌识别在停车场系统中的工作原理 1.车辆查看:可采用埋地线圈查看.红外查看.雷达查看技术.道闸视频查看等多种办法感知车辆的通过,并触发图像搜集抓拍. 2.图像搜集:通过高清摄像抓拍主机对通行车辆进行 ...

  5. 机器算法有哪几种 python_8种顶级Python机器学习算法-你必须学习

    今天,我们将更深入地学习和实现8个顶级Python机器学习算法. 让我们开始Python编程中的机器学习算法之旅. 8 Python机器学习算法 - 你必须学习 以下是Python机器学习的算法: 1 ...

  6. 2020-1-29 深度学习笔记5 - 机器学习基础(构建机器学习算法)

    第5章 机器学习基础 官网 学习算法 机器学习算法是一种能够从数据中学习的算法. 所谓学习是指,对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指,通过经验E改进后,它在任务T上由 ...

  7. 机器学习算法背后的数学原理

    不同的机器学习算法是如何从数据中学习并预测未知数据的呢? ​ 机器学习算法的设计让它们从经验中学习,当它们获取越来越多的数据时,性能也会越来越高.每种算法都有自己学习和预测数据的思路.在本文中,我们将 ...

  8. 人工智能 自动规划 ppt 蔡自兴_分布式优化算法及其在多智能体系统与机器学习中的应用【附PPT与视频资料】...

    关注微信公众号:人工智能前沿讲习对话框回复"张家绮"获取PPT与视频资料视频资料可点击→播放视频查看 导读 分布式优化理论和算法近年来在多智能体系统中得到了广泛的发展与应用,目前在 ...

  9. 各种机器学习算法比较

    前言  简单介绍各种机器学习算法的优缺点,和用python中的一些相关库的用法 一.监督学习算法 1.k-NN近邻 1.1 简介  k-NN 算法可以说是最简单的机器学习算法.构建模型只需要保存训练数 ...

最新文章

  1. Spring 定时器
  2. rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
  3. 问题解决: SSR 的 1080 端口被占用
  4. 10 个 GitHub 上超火的 CSS 奇技淫巧项目,找到写 CSS 的灵感!
  5. sqlite事务模型、性能优化tips、常见误区
  6. 门面模式(Facade)
  7. Python+OpenGL实现物体快速运动时的模糊效果
  8. 从网络到分布式-负载均衡
  9. 3-4 创建一个新的项目
  10. 使用itertools建立词表
  11. 基于广度优先搜索的哈密顿图的判断算法
  12. 企业级多用户发卡平台源码 源码完全开源 无任何加密
  13. 不积跬步无以至千里(C语言笔记)
  14. Swift零基础学习之用TableView做个景点App
  15. win10 excel和ppt变成英文了,word正常,怎么解决?
  16. csgo如何保存自己的cfg_CSGO进阶教程:cfg文件调试指南
  17. OpenGL 镜面反射光
  18. Hdoj 2190.悼念512汶川大地震遇难同胞——重建希望小学 题解
  19. 固高Otostudio软件使用基础知识
  20. 百度地图的驾车路线规划

热门文章

  1. sql 为什么要用where 1=1或者where 1 =0 ?
  2. 二叉树前序、中序、后序遍历非递归写法的透彻解析
  3. RTOS 任务间互斥的难题
  4. 从单片机步入Linux之文件系统的构建
  5. last_kmsg和ram console
  6. 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序
  7. hive 语句总结_Hive常用命令总结
  8. 每日一题(34)—— 线程
  9. AntDesign组件库的使用
  10. axis=0 与axis=1 的区分