M4预测竞赛:引入一种新的混合ES-RNN模型

M4预测竞赛:引入一种新的混合ES-RNN模型

作者:Slawek Smyl, Jai Ranganathan, Andrea Pasqua

优步的业务依赖于准确的预测。例如,在我们运营的600多个城市中,我们使用预测来预测司机的预期供应量和乘客的需求,以确定我们的系统何时会出现故障,以确保我们总是有足够的司机客户的困扰代理管理我们的支持系统,当然,计划我们的业务支出。

正因为如此,优步投入巨资在预测领域建立深厚的专业知识。我们的团队在机器学习、概率编程和许多其他方法方面处于前沿技术的最前沿,以确保我们预测算法的准确性。

最近,我们的一位领先的数据科学家Slawek Smyl被命名为M4竞赛的获胜者,这是著名的M4竞赛的最新版本Makridakis (M)竞争这一挑战要求研究人员开发出更精确的时间序列预测模雷竞技是骗人的型。

以主要组织者的名字命名,Spyros Makridakis自1982年以来,M比赛一直是预测界最重要的活动之一。比赛大约每十年举行一次,比较不同时间序列预测方法的准确性,从天真的预测推进新的统计模型和机器学习方法。竞赛只处理时间序列预测,没有任何额外的回归量——整个序列的数据只是一个数字向量。

反复出现的结果“M竞赛”的一个重要问题是,简单的方法与更先进的方法一样好,甚至更好,这个问题偶尔会在一些研究人员中引起相当大的痛苦。雷竞技是骗人的M4竞赛使用了大量的数据集——10万个时间序列——一般来说,结果证实了这一假设:纯机器学习和神经网络(NN)方法比ARIMA或指数平滑(ES)等标准算法表现更差,在这些基础统计方法的各种组合下表现更差。

然而,比赛优胜者,边缘稳定,是Slawek的混合指数平滑-循环神经网络(ES-RNN)方法。它混合了手工编码的部分,如ES公式和黑盒循环神经网络(RNN)预测引擎。ES-RNN模型的版本正在开发中,以解决Uber在各种用例中时间序列预测中一些最具挑战性的问题。

在这篇文章中,Slawek讨论了他的获胜方法,以及其他人如何利用他的研究来满足自己的时间序列预测需求。雷竞技是骗人的

把它拿走,斯拉维克……

M4比赛数据集

下表提供了在比赛中使用的系列的一些细节。参赛者被要求提供点预测(期望值)和95%覆盖率的预测区间,所以还有两个预测,分别是97.5和2.5个百分点。

预测范围各不相同,例如,年6个,月18个,小时48个。该系列的规模各不相同,有时范围很广,例如一个月的系列在42到2794之间。因为在非常长的时间序列中,早期点的重要性是值得怀疑的,而且长序列会增加大量的计算成本,我倾向于将它们切碎,并且只使用最近20年的月序列和60年的年序列。该系列的起源,例如金融和宏观(经济学),是已知的,我将它们作为一个热编码特征使用。

表1。M4时间序列在广泛的范围内跨越各种大小。

指数平滑法

指数平滑是一个古老的时间序列预测算法家族,60多年前首次提出了一个简单的算法:

在哪里是0到1之间的平滑因子。该算法表示,对下一步的预测等于对前一步的预测,经过前一步误差的一部分调整。

这个简单的公式扩展了隐藏状态变量,也就是未观察到的成分,如水平、趋势和季节性,现在包含了超过15个方法,例如在预测指数平滑方法在商业时间序列上表现良好,其中最著名的版本之一是具有乘法季节性的Holt-Winters。它的公式分别如下:

在哪里一个状态变量叫什么另一个状态变量是局部线性趋势,和是季节系数的乘法,所以它们倾向于保持在1左右。为0到1之间的平滑系数,由优化算法拟合。水平是y的平滑版本。

提前一步的预测是

现在,这种方法工作得很好,但没有特别的理由假设趋势成分应该是线性的;只是线性形式允许有效的模型拟合。此外,由于模型是按系列拟合的,因此不存在跨系列学习的可能性。提前多个步骤,非线性预测可以通过对所有系列进行训练的神经网络来实现,然而,当涉及到预测时,它们有自己的一组要求和问题,我们将在后面详细讨论。

用于预测的神经网络

神经网络(NN)是一个非常广泛的机器学习模型家族,但是,像几乎所有的机器学习模型一样,它们没有时间轴的概念。需要对序列数据进行预处理,正确地进行预处理并不简单。神经网络往往有太多的参数(权重)来拟合每个时间序列。跨多个时间序列的学习可能会解决这个问题,并开辟交叉学习的可能性,但它需要更仔细的数据准备(特别是规范化和经常的去季节性化)。即使有非常好的预处理和网络架构,结果也往往令人失望:似乎在许多时间序列、神经网络甚至rnn上进行训练,它们的响应过于平均。换句话说,输出不是时间序列特定的。

我的M4竞争模型试图通过层次结构-部分时间序列-特定和部分全局来解决这个问题。创建这种模型是可能的,这要感谢最近的创建动态计算图神经网络系统(DGNNs),比如DyNet而且Pytorch,以及最近的“急于执行”模式TensorFlow.接下来,我们讨论了如何进行预处理。

预处理

预处理是非常重要的一步;在这里犯错误会破坏神经网络的预测性能,无论神经网络架构多么复杂。

我使用恒定大小的输入和输出窗口。输出大小等于预测水平,输入大小部分由实验确定,部分由经验法则确定,它至少应该等于季节性,例如,一个月的系列为12。对于非季节性序列,例如年,我让它比预测范围小一点。当输入窗口的较大和较好的特征被熟练地提取出来时,它是有用的,但它的大小也受到序列长度的限制。例如,在M4数据集中,有许多短系列。

预处理的一个必要步骤是归一化。这可以在整个时间序列中完成,但最好在局部进行:我们移动输入和输出窗口,两个窗口内的时间序列值被一些相当稳定的值所除,但该值仍随序列而变化,例如,上个季节的中位数-点数。在这个项目中,我使用了水平

图1。滚动窗口特征提取。平滑的曲线表示水平。

在M4竞争中,当处理来源未知、时间戳和不同季节性模式的时间序列数据集时,nn往往会与季节性作斗争。一个标准的补救措施是首先使用STL(使用黄土的季节和趋势分解)这样的统计程序来消除该系列的季节性。尽管如此,一个去easonalization算法,无论多么健壮和复杂,都是为了满足一些统计标准而设计的,这些标准可能只是部分地与产生良好特征的目标相一致,而NN的总体目标是强预测。当去easonalization是预测算法不可分割的一部分时,就像在ES的情况下,而不是在学习过程之前发生时,效果会更好。

混合模型

有了这些见解,合并Holt-Winters和NN模型(实际上是rnn,因为它们更适合序列和时间序列)是有意义的:

我们不需要考虑局部线性趋势:

预测公式为:

在哪里是预处理数据的向量,乘法是按元素进行的。由归一化和去季节化时间序列派生的特征组成,通常为季节性长;它的单个标量分量,计算公式为:

此外,增加了单热编码序列原点。

记住这一点很重要,是每个系列系数,而RNN是全局的,在所有系列上进行训练,它是一个层次模型。每个系列的计算图是不同的,因为它包含一些特定于系列的参数,这就是为什么我们需要利用动态计算图神经网络系统。

到底是怎么做到的呢?我怀疑你做不来Keras,因为您需要一个低级别的控制。我用的是DyNet,用c++写的。首先,我们收集每个系列的参数:

auto additionalParams= additionalParams_map[series];
表达式levSm_ex = logistic(参数(cg, additionalParams.levSm));/ /水平平滑
表达式sSm_ex = logistic(参数(cg, additionalParams.sSm));/ /季节性平滑
...

然后我们用它们来计算水平季节性系数:

For (int i=1;我< m4Obj.vals.size();我+ +){
表达式newLevel_ex=m4Obj.vals[i]*cdiv(levSm_ex,season_exVect[i]) + (1-levSm_ex)*levels_exVect[i-1];
levels_exVect.push_back (newLevel_ex);
表达式newSeason_ex=m4Obj.vals[i]*cdiv(sSm_ex,newLevel_ex) + (1-sSm_ex)*season_exVect[i];
season_exVect.push_back (newSeason_ex);

...cdiv()是逐元素除法,m4Obj。Vals包含时间序列值,.运行此循环将上述公式添加到计算图中。

接下来,在另一个循环中,我们遍历系列点并准备输入,如下所示:

表达式input0_ex =输入(cg, {INPUT_SIZE}, input_vect);
表达式input1_ex = cdiv (input0_ex inputSeasonality_ex);/ / deseasonalization
input1_ex= cdiv(input1_ex, levels_exVect[i]);/ /正常化
joinedInput_ex.emplace_back(噪音(南瓜(input1_ex), NOISE_STD));/ /标准化+噪音
joinedInput_ex。emplace_back(input(cg, {NUM_OF_CATEGORIES}, m4obj . categorories_vect));
表达式input_ex = connecenate (joinedInput_ex);
...

最后将它传递给RNN堆栈:

rnn_ex = rNNStack[0].add_input(input_ex);
For (int il=1;il < dilations.size ();il + +)
rnn_ex = rnn_ex + rNNStack (il) .add_input (rnn_ex);/ / resNet-style

您可能已经注意到RNN调用不是单个调用。这是因为RNN堆栈是由几个扩展的长短期记忆单元(lstm)块组成的ResNet样式的快捷方式,如下节所述。

神经系统架构

部署了几个架构,主要由实验(回溯测试结果)指导。在高层次上,它们都是基于lstm的扩展块,有时后面跟着一个非线性层,后面总是跟着一个线性“适配器”层,其主要工作是从隐藏层大小转换为输出大小(即预测水平)。

LSTM块由许多(1-2)子块组成,可选地与resnet风格的快捷方式连接。每个子块是一到四层的序列,属于三种类型的扩展LSTMs之一:标准(张2017年),并附有注意机制(秦2017),以及使用特殊类型的快捷方式(Kim, El-Khamy和Lee 2018)。图2显示了三个配置示例:

  1. 季度系列点位预测,它由两个块组成,每个块是两个扩展的LSTMS,由围绕第二个块的单个“经典”快捷方式连接。
  2. 月度点位预测系列,由一个由四个扩展lstm组成的块组成,剩余连接类似于(Kim, El-Khamy和Lee 2018)。注意,快捷键箭头正确地指向剩余LSTM单元格的内部——这是一个非标准的剩余快捷键。
  3. 预测区间预测每年的系列,它由一个由两个扩展的lstm组成的块组成,利用注意力机制,接着是一个密集的非线性层(带有tanh()激活),然后是一个线性适配器层,其大小等于输出大小的两倍,允许我们同时预测较低和较高的分位数。
图2。在所有病例中,都使用了扩张的神经网络,但具体的结构不同;给出了三个例子。

训练损失函数

点预测的M4竞争误差度量是对称平均绝对百分比误差(sMAPE)和平均绝对比例误差(MASE)的平均值。它们都是预测值和实际值之间的平均绝对差异,尽管标准化方式不同。在我的ES-RNN模型中,RNN堆栈的输入和即时输出值也被归一化了,尽管再次有点不同(除以水平),所以我认为L1的差异与sMAPE和MASE在这种情况下足够相似,首先我使用它作为我的训练损失函数。然而,当回溯测试时,系统倾向于有正偏倚。为了解决这个问题,我决定使用一个具有非对称惩罚的弹球损失函数(最小化它会导致分位数回归)。它的定义为:

其中Q是分位数,例如0.5,(在这种情况下,它与L1差相同)。

为了抵消正向偏差,我使用了更低的值,比如0.48。

预测区间覆盖率的M4竞赛误差度量是其平均尺度区间得分(MSIS)。它是一个单一的指标,在同一时间上和下预测区间得分。它的公式是

在哪里上区间和下面那个是指示器吗1当条件成立时为1,否则为0,为显著性水平,这里为0.05,分母与MASE一样,是样本内初始预测的平均绝对误差(在序列的已知部分上)。你可以浏览M4比赛指南关于这个公式的更多细节。

我没有详细描述分母,因为就像点预测的度量一样,我没有使用它,因为我的RNN堆栈的输入和直接输出都是标准化的。

所以在预测预测区间时,我的损失是上面公式的分子。

代码和文档

M4竞争github库包含一些由组织者和参赛者分支提供的基准测试方法。看看我的代码和更详细的文档了解更多我的混合模型。

前进

Slawek的ES-RNN模型和其他类似的模型除了是许多实验和研究的中心之外,还在优步得到了多种应用。雷竞技是骗人的考虑到我们的问题空间的复杂性,需要先进的解决方案来有效地解决它。

例如,密集开发的一个领域是预测稀疏时间序列,考虑到机器学习模型将知识从密集时间序列转移到稀疏时间序列的能力,它很适合ES-RNN这样的混合模型。

此外,M4竞赛的特点是没有回归器的纯时间序列,但在实际应用中,还可以使用其他回归器,包括天气、事件信息、地理属性等。结合它们可以丰富模型,提高性能。

然而,第三个探索领域是预测时间序列,这需要领域知识。ES-RNN等混合模型提供了一种对这些知识进行编码的方法,使预测更适合Uber遇到的现实应用。我们还计划将这个模型包含到我们未来的Pyro预测库中,因此Python用户可以使用它。

ES-RNN在M4比赛中的出色表现使其成为一个重要的预测里程碑。

如果您有兴趣了解更多我们如何应用预测来改善Uber平台上的出行体验,请申请一个角色在我们队。

订阅我们的通讯以跟上优步工程公司的最新创新。

评论