Omphalos, Uber的并行和语言可扩展时间序列回测工具

0
Omphalos, Uber的并行和语言可扩展时间序列回测工具

优步在全球600多个城市运营,利用用户偏好的综合数据来改善乘客和司机的体验。随着时间的推移,这些匿名聚合的数据点会生成数百万个时间序列,这些时间序列可以广泛地查看,也可以在较深的时间粒度级别上查看。从市场优化、成本建模到硬件容量规划,这些时间序列预测对我们的许多决策都至关重要。

为了实现快速、灵活、准确的预测,并在我们的模型中提供更高的可靠性和一致性,Uber的预测平台团队创建了Omphalos。Omphalos是一个时间序列回测框架,它可以生成跨语言预测模型的高效和准确比较,并简化我们的模型开发过程,从而改善客户体验。在本文中,我们将讨论这个新框架的设计、实现和应用。

预测在超级

当利用时间序列数据时,预测算法通常需要按时间顺序测试,或称为val.简单地说,应用这些算法的模型不应该用超过预测水平的数据值来训练。

一种常见的做法是,在保留时间顺序的同时,任意地将时间序列划分为训练集和验证集,类似于随机选择一个训练通过(如图1所示)。然而,考虑到Uber的业务度量差异和相对较短的生命周期,我们发现这种方法不可靠。例如,考虑到我们业务的快速增长(逐年增长),使用和不使用新年前夜数据训练的时间序列模型显示了显著的预测性能差异。

两种形式的回测

为了实现对模型性能的更一致的度量,我们设计了一个回测过程交叉验证说明数据集的顺序性质的逻辑。

此过程应用两种类型的回测:滑动窗口和展开窗口。虽然两者都有各自的适用用例,但滑动窗口形式在模型精度和训练时间之间实现了良好的平衡,特别是在测试高频率数据(如每日和每小时时间序列)时。另一方面,扩展窗口形式更多地用于周、月或季度时间序列,在这些时间序列中历史点的数量是有限的。

接下来,我们将概述如何将这两种类型的回测应用于预测:

滑动窗口

滑动窗口法需要三个超参数:训练窗口大小、预测窗口大小(水平)和滑动步骤,具体如下:

  • 培训窗口大小:包含在训练通行证中的数据点数
  • 预测窗口大小:用于预测的数据点数
  • 滑步:从一遍到另一遍跳过的数据点数
图1:在滑动窗口回测模型中,一个固定大小的训练窗口(黑色)在时间序列的整个历史中滑动,并与一个预测窗口(橙色)进行重复测试,其中较早的数据点下降。

扩展窗口

扩展窗口形式需要四个超参数:起始窗口大小、结束窗口大小、预测窗口大小和展开步骤,概述如下:

  • 从窗口大小包含在第一个训练通行证中的数据点的数量
  • 结束窗口大小包含在最后一个训练通行证中的数据点的数量
  • 预测窗口大小用于预测的数据点数
  • 扩张的步骤从一个阶段到另一个阶段,增加到训练时间序列中的数据点的数量
图2:在扩展窗口回测模型中,一个训练窗口(黑色)扩展了时间序列的整个历史,并针对预测窗口(橙色)重复进行测试,而不删除旧的数据点。

测量预测精度

一旦使用这两种回测方法中的任何一种测试了时间序列预测算法,Omphalos就会自动生成预测值和相应的实际值的数组,我们可以从中计算各种度量预测精度

虽然这些度量通常假设一个单一的训练通过,但是我们需要调整这些度量以更好地反映回测设置中的模型性能。此外,由于优步在全球数百个城市运营,模型的准确性可能因城市指标而异。例如,在预测未来两周的典型预测中,我们观察到较大的加权平均绝对百分比误差(wMAPE当同一模型应用于不同城市时,我们使用的是一种绩效衡量指标)的范围。因此,我们需要一种可靠的方法来总结整个模型的性能,以确定我们应该使用哪个模型。

为了应对这些挑战,我们开发了一种自动模型评估策略,根据城市和培训合格证比较wMAPE的中位数,同时为最不准确的wMAPE和中位数偏差设置一个阈值。wMAPE的直方图如果有必要,也可以在手动检查期间使用。

有了这项新技术,我们只需要一个回测工具来应用它。

建筑肚脐

虽然用一种语言实现回测过程通常并不困难,但是跨语言校准模型性能度量需要付出更多的努力,甚至在同一个团队中的两个数据科学家之间也需要。因此,我们决定创建一个语言可扩展的框架,它可以应用我们的自动模型评估策略;只要使用相同的回测配置,跨语言的模型性能应该是可比较的。

我们还需要框架来有效地编排针对数百(甚至数千)个时间序列运行的数十个算法,同时保持轻量级。为了实现这一点,我们选择将框架写入因为它的健壮性和可伸缩性。

结合language-extensibility

考虑到Uber的工程和数据科学团队使用的各种语言,我们需要确保Omphalos可以与Go之外的语言一起使用。在整个行业中,由于R语言的知名度,它一直是时间序列预测的默认语言预测包,Python已经成为这个领域的一个重要参与者,因为它的支持良好的机器学习包,如Scikit-Learn而且TensorFlow.基于这些原因,我们决定构建支持这三种语言的接口,并在未来能够合并其他语言。

在配置用于Omphalos测试的算法时,我们需要三个功能:

  • 算法输入代码的文件路径
  • 接受输入数据帧的模型生成函数
  • 接受模型和预测视界,并返回分位数预测的预测函数

控制台层使用Go语言编排不同语言的模型训练执行包中。该系统使我们能够灵活地测试支持这些需求的任何算法,重用不需要在每个回测步骤重新训练的模型(神经网络),并使用公共库(例如,应用R中的预测包作为预测函数)。

到目前为止,我们已经测试了10种R、3种Python和4种Go时间序列预测算法,如下表1所示:

表1:使用Omphalos测试的时间序列预测算法包括在R、Go和Python中传统应用的算法。

鲁棒性和可扩展性

除了语言的可扩展性,我们还希望Omphalos足够健壮和可扩展,以满足Uber的预测需求。更具体地说:

  1. 该工具应该利用计算能力,为我们的用户提供更快的迭代和更好的反馈。
  2. 它应该能够在本地工作站上运行,或者在CPU/GPU增强的服务器上远程运行。
  3. 它应该很简单,便于用户轻松适应并将他们的算法接口到框架中。

为了实现这些条件,Omphalos设计的核心是一个命令行界面控制台层,它加载用户定义的配置文件和时间序列数据,将这些数据输入用不同语言实现的预测算法,收集预测值,并生成全面的回测报告。

图3:Omphalos体系结构接受时间序列数据和一个包含指定参数的用户定义配置文件作为输入,并生成一个全面的回测汇总报告作为输出。

考虑到Go的并发设计,我们构建的控制台可以协调和监督许多单线程R和Python算法,以充分利用所有可用的cpu。Omphalos还促进了时间序列的并发回测,控制台层触发X次Y次运行例程——每个例程负责运行一个算法与一个时间序列的回测。

然后,每个训练阶段的预测结果分别存储,并用于计算汇总指标,如wMAPE的中位数。

使用肚脐

Omphalos有两个主要功能,可以让我们更快更有效地回测时间序列:比较语言内部和跨语言的模型,以确定最适合给定数据集的模型;利用我们的AutoForecaster API来测试预测的准确性。

模型比较

考虑到Uber各种各样的预测用例,我们需要一种工具,可以跨预测指标、算法运行时和错误率无缝比较模型。有了Omphalos,我们可以把神经网络的性能放在一起TensorFlow(Python),到R中的传统统计算法,再到围棋中500ms的轻量级实现。

为了测试Omphalos的效率,我们将R中的8种流行的预测算法与我们的AutoForecaster API(一种针对任何给定时间序列提供精确预测的内部工具)进行了比较,使用了来自全球20个城市的每日完成旅行计数。

表2:当比较R中的流行预测算法与AutoForecaster时,我们使用来自20个城市的每日完成行程计数作为输入数据,并配置了一个滑动窗口回测程序,训练窗口大小、预测窗口大小和滑动步长分别设置为189、14和14。

鉴于这种能力,Omphalos已经成为我们模型开发过程中不可分割的一部分。现在,数据科学家无需额外努力就可以将他们自己的模型与许多现有的模型进行比较;一旦一个特定的模型被证明是最有效的,它可以很快被其他人采用。

Auto-Forecaster

我们的预测平台团队构建了Auto-Forecaster,以最小的输入为任何给定的时间序列提供精确的预测,使整个公司的数据科学家能够预测无限的用例。然而,为了评估该算法的性能,我们需要在不同时间段的大范围时间序列上测试它,而Omphalos是这项工作的优秀候选人。

为了测试它的性能,我们想确定Auto-Forecaster是否可以在数百个用户定义的仪表板上同时提供数十万个时间序列的预测。我们的测试包括:构建错误性能的直方图(如图4所示),识别性能非常好或非常差的时间序列类型,并确保执行被拒绝的时间序列(那些提供不可靠预测的时间序列)。一个简单的计算表明,按平均预报时间2秒连续运行这些预报需要155小时或约6.5天。

图4:在给定的时间序列中使用自动预测器时,反向测试错误的直方图可以帮助我们理解算法的执行情况。

但是,通过利用Omphalos编排并发进程的能力,我们立即将预测作业分割为单个服务器上的24个核心(每个核心对应一个时间序列)。使用其他方法,一个单一的预测可能只需要几秒钟,但测试时间序列的乘法往往需要几天。通过使用Omphalos,我们确定在R和Python中运行这些预测只需要四分之一天的时间——大约150小时的时差。

接下来,我们用自动预测器的Go实现在Omphalos上测试这个数据集。这导致了更快的性能(平均0.5秒)和更好的并发管理,将反馈时间减少到1小时——现在与串行进程相差154小时。这种类型的性能改进允许我们将完整的数据集回测合并到持续集成管道中,从而实现更精确的预测。

未来的工作

尽管Omphalos最初被设计为时间序列预测算法的语言可扩展和并行的回测框架,但我们已经确定了两个可以进一步利用该工具的领域:

构建经验预测区间

由预测算法生成的预测区间通常是太窄,导致低估风险;另一方面,由于我们经常使用预测模型的集合,生成集合预测区间可能是棘手的。因此,我们正在探索使用Omphalos构建经验预测区间的可能性,以更好地为预测相关的业务决策提供信息。

机载异常检测算法

预测和异常检测天生的联系。未来,我们计划在Omphalos中添加新的特性,使滑动窗口和扩展窗口回测方法都可以直接应用到异常检测算法中。这将大大扩展我们的预测能力,进而促进改善我们服务的用户体验。

如果您有兴趣拓展时间序列预测或异常检测的界限,请考虑申请角色在我们的团队!

来源:Go Gopher是Go编程语言的吉祥物,由Renée French创建。R标志是根据条款使用的使用4.0,根据R基金会

评论