Instacart 是一家在线配送服务公司,提供杂货一小时送达服务。用户通过网站或手机APP对商品下单,所购商品由一组Instacart代购人员到当地商店购买并快递给用户。
为了解如何借助机器学习保障更好的客户体验这一问题,InfoQ访谈了Instacart的数据科学家Mathieu Ripert。
Ripert:首先,我们具有分布式的架构。我们将系统按业务领域划分(商品目录、物流、合作厂商、客户等),对每个领域做独立的开发和部署,并确保各个领域中代码和模型具有的清晰从属关系。由于每个领域具有自己的数据存储,为便于领域间的通信,我们采用了 RabbitMQ 。
我们的生产数据库采用了 PostgreSQL ,离线分析采用了 Amazon Redshift 。根据数据的质量,数据按日期或者星期分区。例如在订单履行引擎中,我们实时追踪所有代购者的GPS定位信息。这样的定位信息大约每天1GB左右,这个数据就是按日期分区的。
Ripert:首先,我们的模型使用了历史数据做大范围的回顾测试。这有助于我们确认模型训练后就可良好工作,并对在同一时间段内以及未来一段时间内的数据同样工作良好。为应对日常的新变化和趋势变化,模型每天都要做重新训练。
其次,我们使用了多种统计量(例如用于回归模型的 RMSE 和 MAE )追踪生产环境中的模型性能。我们有内部查询工具,可轻易地在生产数据上计算这类统计量,并在统计量偏离正常值时抛出告警。最后,我们具有一个监测市场变化的运营团队,当监测到由恶劣天气或是其它特殊事件导致突发了性能变化时,我们会使用自己的接口对预测做出实时调整。我们正努力实现将这些调整中的大部分工作自动化。
Ripert:给定一个市场,我们可能要在随后的几个小时中完成数千次配送、轮班数百代购人员完成订单。这需要我们的订单履行系统实时决策如何将订单合并为批量配送,以使驻店的代购人员可以从同一商户采购,配送司机可以一并装货并发货到客户地址。我们对此系统的目标是:(1)确保顾客收到他们所订购的商品;(2)确保发货在顾客结账后一个小时窗口期内完成;(3)确保代购人员尽可能高效,使我们可以得到更多的客户订单。
我们使用 GBM 模型给出的预测去估计任一代购人员所需的时间,或是在商户那里采购订单商品,或是是将订单配送到客户地址处。对于确保所做的履行订单决策会按时配送,在一定程度上这些预测起到了决定性的作用。但也许更为重要的是,这些预测使我们的优化算法知道哪些代购人员与快递的组合使得系统整体上尽可能的快,最终增加了我们订单的履行速度。
Ripert:就订单履行而言,我们使用了单一实例构建模型,并使用XGBoost原生支持的多核处理技术。这在一定程度上是可行的,因为我们可为不同区域构建各自的模型,因为最为重要的特性是本地时间和空间效应,所以模型的泛化能力并不会通过组合大片区域而得到显著改进。
考虑到 AWS 所 推出 实例的内存和CPU容量(高达2TB内存,128个CPU),对大部分问题我们得以避免使用分布式处理架构。只是在做产品推荐时,才会出现全部数据不能加载到内存中的问题。我们使用Apache Spark和 MLLib 实现了用于产品推荐的 协同过滤 模型。
Ripert:对于配送时间,我们使用了起始和目的地的经纬度信息、计划开始配送的时间戳、用户地址的相关信息(住家地址或是公司地址),以及快递模式(是驾车、骑自行车或步行)。
就我们的优化引擎所针对的大规模地理范围而言,我们必须每分钟做100,000次的预测,因为其中考虑了多种配送和代购的组合。这限制了在这些预测中可包括的额外信息的规模。这不仅是因为许多信息当前尚不可知,而且因为特性的生成和预测必须是高度可扩展的。
一旦我们分配了配送人员,我们可以使用特定的代购、地理位置、近期空间移动 信息以及天气等额外信息在更新对未来的预测。我们正在对这些扩展理念做继续探索和测试。
Ripert:Instacart的业务发现与NLP是密切相关的。仅分析以往的采购行为,我们就可为用户给出可信的热卖产品推荐。但是我们的商品目录中包括了来自数百零售合作商的几百万商品,这些商品的订单频次满足长尾分布。我们使用NLP技术去泛化我们的推荐,使得推荐对不常被购买的商品也适用。例如,如果我们知道了某个用户十分喜好无麸质食品和意大利菜,那么我们可以将推荐扩展到所有的类似商品。
Ripert:那是当然。我们的“搜索和发现”团队已经使用了嵌入(Embedding)模型去解决自然语言处理问题。我们的“商品目录”团队也在积极测试将 卷积神经网络 用于图像的处理。最终我们建立了一个深度学习模型的原型,用于预测指定的商户中的代购者的最优采购商品序列,并规划在新的一年中测试使用该模型重排代购者的采购清单。
从根本上讲,深度学习开拓了以往标准机器学习工具棘手的新问题,它需要大量的特征工程。鉴于我们收集的数据量,对我们而言使用深度学习去改进客户和代购者的体验是一个很大的机遇。
Ripert:我们面对了不同类型的挑战:
数据完整性:机器学习中最为重要的是数据。需要确保我们采集的数据是干净的,没有噪声的。举个例子,一名代购人员在完成了一次配送后,他必须点击代购APP中的一个按钮才能结束整个流程。我们使用这些时间戳去训练配送时间预测模型。但是由于种种原因,一些代购人员可能并不会在完成配送时点击“Delivered”按钮。因此我们构建了一些模型,根据GPS数据去过滤和推理正确的时间戳信息。
异常检测:如果将时间作为特性,发生暴风雨将会使未来的近期预测发生偏离。
方差建模:为最小化订单的整体履行时间,并确保订单按时送达,我们的订单履行引擎需要决定如何合并订单。为确保预测的方差可解释,我们使用了一种分位回归技术预测配送时间的上界,并基于此上界做出规划。
延迟:鉴于每分钟我们要调用数十万次的预测运算,“速度与延迟”间的权衡成为一个切实的挑战。
性能评估:另一个挑战在于如何基于我们的业务目标选择最优的模型评价指标。例如,对于我们的预测模型,MEA可能并非最好的度量。事实上,取决于预测的订单是被延迟了还是提前了,正负一分钟的偏差具有不同的意义。
查看英文原文: Mathieu Ripert on Instacart's Machine Learning Optimizations
感谢刘志勇对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。