Yandex.Taxi如何使用机器学习预测汽车交付时间

想象一下,您需要打车。 您打开应用程序,看到汽车将在大约7分钟内到达,单击“订购”-……如果有汽车,则离您15分钟路程。 同意,不愉快吗?

切入点,我们将讨论机器学习方法如何帮助Yandex.Taxi更好地预测ETA(预计到达时间-预计到达时间)。



首先,回想一下用户在订购之前在应用程序中看到的内容:



在地图上,蓝色表示登上出租车的最佳点。 红色大头针-用户叫出租车的地方。 该图钉显示汽车将到达多长时间。 在一个完美的世界。 但是在现实世界中,附近的其他人也通过Yandex.Taxi应用程序自称为汽车。 而且我们不知道哪辆车将送给谁,因为它们仅在订购后才分发。 如果已经分配了汽车,则为了进行预测,我们将在沿最佳路径行驶时使用Yandex.Maps路线和时间。 这次(可能会有少量利润),我们将在订购后立即向用户显示。 问题仍然存在:订购前如何预测ETA?

这里出现了机器学习。 我们用对象和正确答案进行选择,并根据对象的特性教算法猜出答案。 在我们的案例中,对象是用户会话,答案是实际到达汽车的时间。 对象的符号可能是在订购之前已知的数字参数:靠近图钉的应用程序的驱动程序和用户数量,到最近的服务车辆的距离以及其他可能有用的值。

为什么这很重要



在理想的世界中,人们会提前做所有事情,并始终准确地计划他们的时间。 但是我们生活在现实世界中。 如果一个人上班迟到,或更糟的是去机场,对他来说很重要的是要了解他是否会准时离开并到达目的地。
在决定订购什么时,除其他事项外,未来乘客会受到等待时间的引导。 在呼叫出租车的不同应用程序和一个应用程序的不同费率中,它可能会大不相同。 为了让用户不会后悔选择,显示准确的ETA非常重要。

一切似乎都很简单。 提出更多的迹象,训练诸如CatBoost之类的模型,预测汽车抵达之前的时间-您可以在那结束。 但是经验表明,最好不要急于思考,然后再做。

首先,毫无疑问,我们有必要预测驾驶员实际到达用户的时间。 是的,我们不确定在下订单之前会分配哪辆车。 但是我们可以使用不是有关特定驱动程序的数据,而是有关订单附近的驱动程序的数据来预测ETA。 当然,预测必须足够诚实,以便用户可以计划时间。

但是“诚实”是什么意思? 毕竟,任何预测算法都是不好的,或者仅仅是统计学上好的。 成功和坦率地说都是不好的结果,但是您需要“平均”不要明显偏离正确答案。 应该理解,“平均”是不同的。 例如,平均值至少是统计中的三个概念:期望,中位数和时尚。 达雷尔·霍夫(Darrell Huff)宏伟的著作《如何使用统计数据撒谎》中的图片完美地展示了两者的区别:



我们希望模型平均不会犯任何错误。 根据“平均值”的值,可以使用两种方法来评估预测的质量。 第一种选择是向用户显示出租车到达之前的时间数学期望。 结果,将训练一个使预测误差(均方误差,MSE)的均方最小的模型:

MSE= frac1n sumni=1yi hatyi2 rightarrowmin



在这里 yi -正确答案, \帽yi -模型预测。

另一种选择是不要将ETA预测误认为是向上或向下的一个方向。 在这种情况下,我们将向用户显示出租车到达之前的时间分布的中位数。 结果,将训练一个模型来优化预测误差的平均模块(平均绝对误差,MAE):

MAE= frac1n sumni=1|yi hatyi| rightarrow



但是我们意识到我们已经领先了一步。

重新思考问题陈述


约会后,我们知道将使用哪种汽车,这意味着我们可以在Yandex.Maps上估算其行驶时间。 该时间显示在订购后的大头针上。 一方面,我们现在拥有更多信息,并且预测将更加准确,但是,另一方面,这也是带有误差的估计。

那是ETA固定任务中的难点。 未分配驾驶员时,有必要准确预测Yandex.Mart路线显示的时间而不是汽车交付之前的实际时间。

似乎是胡说八道:以其他预测作为目标,而不是确切的值? 但这是有道理的,这就是原因。 在前往您的途中,指定的汽车可能会流连忘返。 驾驶员在道路上处于危险状态,由于交通事故而堵车,或者出门买水。 这种延迟很难预测。 它们在目标变量中产生额外的噪声,因此,已经很难预测引脚中的ETA的任务变得更加困难。

如何消除噪音? 预测平滑的目标变量-根据到达用户的路线分配机器后显示的时间。

从业务角度来看,这是一种逻辑:无论如何,您都不能沿着从ETA出发的最佳路径浪费时间,但是可以通过与驾驶员合作来减少其他延误。

质量指标,数据,模型和培训


我们发现对于销钉中的ETA,有必要预测的不是实际时间,而是预测沿路径分配机器后将收到的时间。 在MAE和MSE这两个质量指标中,我们选择了MAE。 从预测的直观性来看,也许评估平均期望(MSE)而不是中位数(MAE)更合乎逻辑。 但是MAE具有一个很好的功能:模型在训练示例中更能抵抗异常值。

标志分为几组:
-根据当前时间建立;
-地理位置(坐标,到市中心的距离以及地图上的重要物体);
-引脚(附近有多少辆汽车,哪些汽车密度不同,计算得出);
-有关区域的统计信息(通常我们会犯错误,我们会预测多少);
-有关最近的驱动程序的数据(它们到达的时间,第一个比第二个更近等)。

当然, CatBoost接受了这些标志的培训。 决定性的论点是,长期以来,在CatBoost中实现的平衡树上的梯度提升已确立为一种非常强大的机器学习方法,并且在CatBoost中对分类特征进行编码的方法通常会为我们的任务带来回报。 该库的另一个不错的功能是可以在GPU上快速学习。

现在几句话,比较哪些模型。 初始ETA(在通过机器学习指定之前)是根据最接近用户的机器可以到达的时间计算的。 当前的模型(现在在应用程序中使用)是使用机器学习完成的以及本文的内容。 此外,新型号将很快投入生产。 她使用一个数量级的重要功能来解决该问题。 下表根据历史数据显示了这些模型的质量度量。 顺便说一下,我们还有很多计划- 来帮忙

ETA验证预测质量*


平均绝对误差
错误超过1分钟
错误超过2分钟
错误超过5分钟

原始预计到达时间


82,082


29.95


18.12


3,7


当前模型


79.276(–3.4)


29.33(–2.1)


16.98(–6.3)


3(–19.2)


新模式


78.414(–4.5)


28.95(–3.4)


16.62(–8.2)


2.8(–23.2)




*百分比(括号中表示与原始ETA相比的变化)。

机器学习使我们赢得了大约2秒钟的时间,即平均预测偏差的3.4%。 在新模式中-几乎再增加一秒,总计4.5%。 但是从这些数字中,很难理解ETA已得到显着改善。 要感受到机器学习的好处,您应该注意最后一列。 预计超过5分钟的错过率变为19.2%,而在新模型中-甚至减少了23.2%! 顺便说一句,在使用机器学习的模型中,此类错误仅在3%和2.8%的情况下发生。

总结


我们在引脚上指定了ETA主要是为了向用户提供可靠的预测。 但是,当然,在机器学习在商业中的任何应用中,必须评估经济效果。 并了解它是否可与构建和实施模型的成本相媲美。 在进行在线A / B测试之后,事实证明,使用机器学习,我们从订单到旅程的转换在统计上显着增加(毕竟可以取消订单),从用户会话到订单的转换也有所增加。

在这两种情况下,我们所讨论的效果都是0.1个百分点。 顺便说一下,这并不与统计意义相抵触:在我们的数据量上,即使这种差异在2-4周内也能可靠地检测到。 而且,与业务相关性,实际上,一切还不错:事实证明,澄清ETA的成本在短短几个月内就抵消了转化率的提高。

结果,我们得到了一个有用的说明性案例。 针脚中ETA的细化已成为有关精心选择目标变量的有启发性的故事。 在产品方面,这是一个非常有启发性的示例:我们改进了应用程序,并看到用户赞赏它。 我们希望完善的ETA可以帮助我们的乘客更多地开会,开会和乘飞机。

PS:如果您对其他Yandex.Taxi技术感兴趣,我们建议您动态发布我的同事最近发布的帖子

Source: https://habr.com/ru/post/zh-CN431196/


All Articles