直接使用 LSTM 进行时间序列预测的效果不佳。
这令人惊讶,因为众所周知神经网络能够学习复杂的非线性关系,而 LSTM 可能是最成功的循环神经网络类型,能够直接支持多变量序列预测问题。
Uber AI Labs 最近进行的一项研究表明,如何将 LSTM 的自动特征学习能力和处理输入序列的能力结合在一个端到端模型中,该模型可用于预测公共假期等罕见事件的驾驶需求。
在这篇文章中,您将了解一种开发可扩展的端到端 LSTM 模型用于时间序列预测的方法。
阅读本文后,你将了解:
- 在多个站点(在本例中为城市)进行多变量、多步预测的挑战。
- 一个用于时间序列预测的 LSTM 模型架构,由独立的自动编码器和预测子模型组成。
- 所提出的 LSTM 架构在罕见事件需求预测方面的技能,以及在不相关的预测问题中重用已训练模型的能力。
通过我的新书《深度学习时间序列预测》启动您的项目,包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。
概述
在这篇文章中,我们将回顾 Nikolay Laptev 等人于 2017 年在 ICML 2017 时间序列研讨会上发表的题为《Uber 中使用神经网络进行时间序列极端事件预测》的论文。
这篇文章分为四个部分;它们是
- 动机
- 数据集
- 模型
- 发现
动机
这项工作的目标是开发一个用于多步时间序列预测的端到端预测模型,该模型可以处理多变量输入(例如,多个输入时间序列)。
该模型的目的是预测 Uber 的拼车司机需求,特别是预测假期等具有挑战性日期的需求,在这些日期,经典模型的不确定性很高。
通常,这种针对假期的需求预测属于一个名为极端事件预测的研究领域。
极端事件预测已成为估算高峰电力需求、交通拥堵严重程度以及拼车和其他应用激增定价的热门话题。事实上,统计学中有一个分支被称为极值理论(EVT),它直接处理这个挑战。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
描述了两种现有方法
- 经典预测方法:为每个时间序列开发一个模型,可能根据需要进行拟合。
- 两步法:将经典模型与机器学习模型结合使用。
这些现有模型的困难促使人们希望有一个单一的端到端模型。
此外,需要一个可以在不同地区(特别是针对每个城市收集的数据)进行泛化的模型。这意味着一个模型可以在一些或所有有可用数据的城市进行训练,并用于在一些或所有城市进行预测。
我们可以将其总结为对支持多变量输入、进行多步预测并跨多个站点(在本例中为城市)进行泛化的模型的普遍需求。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
数据集
该模型是在 Uber 专有数据集上拟合的,该数据集包含美国主要城市五年匿名拼车数据。
使用美国主要城市五年人口的每日已完成行程历史记录,以提供所有美国主要假期的预测。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
每次预测的输入包括每次行程的信息,以及天气、城市和假期变量。
为了规避数据不足的问题,我们使用了额外的特征,包括天气信息(例如,降水量、风速、温度)和城市级别信息(例如,当前行程、当前用户、当地假期)。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
下图中摘自论文的图表提供了六个变量一年的样本。

模型的缩放多变量输入
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
通过将历史数据分割成输入和输出变量的滑动窗口来创建训练数据集。
论文中没有具体说明实验中使用的回溯和预测范围的具体大小。

滑动窗口方法建模时间序列
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
时间序列数据通过对每批样本进行归一化来缩放,并且每个输入序列都进行了去趋势处理,但未进行去季节性处理。
神经网络对未缩放的数据很敏感,因此我们对每个小批量进行归一化。此外,我们发现去趋势处理数据比去季节性处理能产生更好的结果。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
模型
LSTM,例如 Vanilla LSTM,在该问题上进行了评估,显示出相对较差的性能。
这并不令人惊讶,因为它与其他地方的发现相吻合。
我们最初的 LSTM 实现并未显示出优于现有方法的性能。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
使用了一种更精巧的架构,由两个 LSTM 模型组成
- 特征提取器:用于将输入序列提取为特征向量的模型,该向量可用作进行预测的输入。
- 预测器:使用提取的特征和其他输入进行预测的模型。
开发了一个 LSTM 自动编码器模型作为特征提取模型,并使用堆叠 LSTM 作为预测模型。
我们发现,普通的 LSTM 模型的性能比我们的基线差。因此,我们提出了一种新的架构,该架构利用自动编码器进行特征提取,实现了优于我们基线的性能。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
在进行预测时,时间序列数据首先提供给自动编码器,自动编码器将其压缩为多个特征向量,然后进行平均和连接。然后将特征向量作为输入提供给预测模型,以进行预测。
……该模型首先通过自动特征提取来预训练网络,这对于在特殊事件期间大规模捕获复杂时间序列动态至关重要。[……] 然后通过集成技术(例如,平均或其他方法)聚合特征向量。最终的向量然后与新输入连接,并馈送给 LSTM 预测器进行预测。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
尚不清楚在进行预测时,自动编码器具体接收了什么,尽管我们可以猜测它是一个多变量时间序列,用于预测的城市,包含预测区间之前的观测值。
将多变量时间序列作为自动编码器的输入将导致多个编码向量(每个序列一个),这些向量可以连接起来。目前尚不清楚平均在此处可能扮演什么角色,尽管我们可以猜测它是执行自动编码过程的多个模型的平均值。

特征提取模型和预测模型概述
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
作者评论说,可以将自动编码器作为预测模型的一部分,并且已经对此进行了评估,但单独的模型产生了更好的性能。
然而,根据我们的经验,拥有一个独立的自动编码器模块产生了更好的结果。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
所开发模型的更多细节在演示论文时使用的幻灯片中提供。
自动编码器的输入是 512 个 LSTM 单元,自动编码器中用于创建编码特征向量的瓶颈是 32 或 64 个 LSTM 单元。

LSTM 自动编码器用于特征提取的详细信息
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
编码的特征向量与“新输入”一起提供给预测模型,尽管没有说明这个新输入是什么;我们可以猜测它是一个时间序列,可能是一个多变量时间序列,用于预测的城市,包含预测间隔之前的观测值。或者,如关于该论文的博客文章所示,从该序列中提取的特征(尽管我对此持怀疑态度,因为论文和幻灯片与此相矛盾)。
该模型是在大量数据上训练的,这是堆叠 LSTM 或一般 LSTM 的普遍要求。
所描述的生产神经网络模型在数千个时间序列上进行训练,每个时间序列都有数千个数据点。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
在进行新的预测时,模型不会重新训练。
还实现了一种有趣的估计预测不确定性的方法,该方法使用了自举法。
它涉及分别使用自动编码器和预测模型估计模型不确定性和预测不确定性。输入被提供给给定模型,并使用激活的 dropout(如幻灯片中评论的)。这个过程重复了 100 次,模型和预测误差项被用于预测不确定性的估计。

预测不确定性估计概述
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
这种预测不确定性方法可能在 2017 年的论文《Uber 中时间序列的深度和可信预测》中得到了更好的描述。
发现
该模型以美国城市为单位,对美国假期的需求预测进行了特别评估。
模型评估的具体细节未指明。
发现新的广义 LSTM 预测模型优于 Uber 现有的模型,如果假设现有模型经过良好调整,这可能令人印象深刻。
所呈现的结果显示,与当前由单变量时间序列和机器学习模型组成的专有方法相比,预测精度提高了 2%-18%。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
在 Uber 数据集上训练的模型随后直接应用于 M3-竞赛数据集的一个子集,该数据集包含大约 1,500 个每月单变量时间序列预测数据集。
这是一种迁移学习,这是一个非常理想的目标,它允许在不同问题领域重用深度学习模型。
令人惊讶的是,该模型表现良好,虽然与表现最好的方法相比不算出色,但优于许多复杂的模型。结果表明,也许经过微调(例如,在其他迁移学习案例研究中进行的)后,该模型可以被重用并具有技能。

在 Uber 数据上训练并在 M3 数据集上评估的 LSTM 模型的性能
摘自《Uber 中使用神经网络进行时间序列极端事件预测》。
重要的是,作者建议深度 LSTM 模型在时间序列预测中最有益的应用可能是在以下情况下:
- 时间序列数量庞大。
- 每个序列的观测值数量庞大。
- 时间序列之间存在强相关性。
根据我们的经验,选择用于时间序列的神经网络模型有三个标准:(a) 时间序列的数量 (b) 时间序列的长度和 (c) 时间序列之间的相关性。如果 (a)、(b) 和 (c) 都很高,那么神经网络可能是正确的选择,否则经典的时间序列方法可能效果最好。
— Uber 中使用神经网络进行时间序列极端事件预测,2017。
这在论文演示中使用的幻灯片中得到了很好的总结。

将 LSTM 应用于时间序列预测的经验教训
摘自《Uber 中使用神经网络进行时间序列极端事件预测》幻灯片。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- Uber 中使用神经网络进行时间序列极端事件预测, 2017.
- Uber 使用循环神经网络进行极端事件工程预测, 2017.
- Uber 中使用神经网络进行时间序列建模,幻灯片,2017。
- 时间序列极端事件预测案例研究,幻灯片 2018。
- 时间序列研讨会,ICML 2017
- Uber 中时间序列的深度和可信预测, 2017.
总结
在这篇文章中,您发现了用于时间序列预测的可扩展端到端 LSTM 模型。
具体来说,你学到了:
- 在多个站点(在本例中为城市)进行多变量、多步预测的挑战。
- 一个用于时间序列预测的 LSTM 模型架构,由独立的自动编码器和预测子模型组成。
- 所提出的 LSTM 架构在罕见事件需求预测方面的技能,以及在不相关的预测问题中重用已训练模型的能力。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你好,
有没有办法在不影响罕见事件的情况下识别并从数据集中删除异常值?
或者如何避免错误地将异常值视为罕见事件?
谢谢
瓦利
你必须仔细定义“异常值”和“罕见事件”的含义,这样检测前者的R方法就不会检测后者。
异常值通常是指异常的异常现象,即超出正常分布。例如时间序列中均值+/-2*标准差之外的尖峰,即使有罕见事件,其频率也远高于正常信号。
例如,黑色星期五是一个罕见事件,但符合正常频率,而异常值的频率要高得多。
那么,我如何将频率部分引入方程式呢?
谢谢
好问题,我没有关于这个主题的资料,所以我无法给你很好的即时建议。
我将来可能会涵盖这个主题。
“高频率”意味着更频繁。我想你的意思是真正的异常值频率要*低得多*。但即使这样也不一定准确。我见过一些网络流量时间序列,它们偶尔会出现尖峰,与已知事件无关,在某些情况下比少数已知特殊事件更常见。
感谢您的帖子。您知道在哪里可以找到该算法的实现吗?
目前还没有。但这可能是一个开始
https://machinelearning.org.cn/lstm-autoencoders/
我看不懂这篇论文,因为它包含了时间序列多变量 lstm 循环模型等术语
也许从更简单的东西开始,例如
https://machinelearning.org.cn/how-to-develop-lstm-models-for-time-series-forecasting/
你好,
感谢这篇文章。我正在尝试使用 Tensorflow 低级 API 实现这篇论文。
你能详细解释一下置信区间计算吗?
我的意思是,一旦你得到了不确定性误差和不可约误差,你如何通过 MC Dropout 得到区间?
非常感谢
也许看看这篇论文或者联系论文作者,我读这篇论文已经好几个月了。
解释得很好,一如既往!您的许多其他文章都包含代码,可以帮助我们更好地理解概念。我相信您很忙,但如果您能在这篇文章中添加代码,或者给我一些与这篇文章相关的文章/存储库,那就太好了。谢谢,
谢谢,您可以在这里了解更多关于 LSTM 的信息
https://machinelearning.org.cn/start-here/#lstm
我也想要那个!
嗨,Jason,
我是一名硕士研究生,对将这种方法应用于气候数据系列很感兴趣。在我的研究中,我面临一个附加挑战(维度),即极端或罕见事件的纬度和经度。
我通过从 ECMWF (https://apps.ecmwf.int/datasets/data/interim-full-daily/levtype=sfc/) 下载 10 年的 ERA Interim、每日:压力和地表数据创建了一个时间序列。
因此,举例来说,我感兴趣的是预测一个选定区域(0.75 分辨率)的极端降雨量(24 小时内 > 50 毫米):纬度从 -18.75 到 -20.25,经度从 315.0 到 316.5。这是一个 3 x 3 = 9 个网格的网格。
降雨量(总降水量,单位毫米)不呈高斯分布,因此,有很多 00mm 的日子,而且降雨量的时间序列不是一个连续的序列。
根据你的经验,这种“Uber”方法是否能适应分布问题?我对这种方法有一些疑问,比如“LSTM 自动编码器用于特征提取”是如何工作的。你是否期望编写一个像这种“Uber”方法一样的完整示例?
我不知道这种方法对你的数据会有什么影响,也许可以试一试?
嗨,Jason,
感谢您对这篇论文的解释。
我有一个问题,也许你能帮我解决。我创建的 LSTM 自动编码器看起来像这样——
inputs = Input(shape=(n_steps, input_dim))
encoder1 = CuDNNLSTM(128, return_sequences = True)(inputs)
encoder2 = CuDNNLSTM(64, return_sequences = True)(encoder1)
encoder3 = CuDNNLSTM(32)(encoder2)
repeat = RepeatVector(10)(encoder3)
decoder1 = CuDNNLSTM(32, return_sequences=True)(repeat)
decoder2 = CuDNNLSTM(64, return_sequences=True)(decoder1)
decoder3 = CuDNNLSTM(128, return_sequences=True)(decoder2)
dense1 = TimeDistributed(Dense(100, activation=’relu’))(decoder3)
dense2 = TimeDistributed(Dense(1))(dense1)
sequence_autoencoder = Model(inputs, dense2)
encoder_model = Model(inputs, repeat)
我们应该从“repeat”层还是“encoder3”层提取特征?
您能给我一些关于提取特征的绘图/可视化提示吗?
谢谢及问候
Savan
我很乐意帮忙,但我没有能力调试您的代码,抱歉。
谢谢你的回答,贾森!你不必感到抱歉 🙂 你有任何示例代码或者能推荐一些可以可视化特征向量的方法吗?
谢谢你 🙂
您可以使用 PCA 来可视化高维向量。
Uber 的这篇论文的数据集在哪里可以找到?你能发给我吗?
以及如何实现它
所有代码和数据都在这里
https://github.com/M4Competition/M4-methods
请给我这个数据集的实现及结果
请给我这篇论文的数据集。我的研究工作急需这个,请帮帮我
那是 Uber 数据,并未发布。
这是我们最接近的
https://github.com/M4Competition/M4-methods
请给我提供任何已下载的数据文件以及如何实现它
如果您正在寻找数据集,可以从这里开始
https://machinelearning.org.cn/faq/single-faq/where-can-i-get-a-dataset-on-___
你能给我提供与罕见事件这个主题相关的论文吗?请帮我实现它
不能,抱歉。
嗨 Jason,感谢您的帖子。请问!蒙特卡洛 dropout 和普通 dropout 有什么区别?您有关于如何在 LSTM 模型实现中添加蒙特卡洛 dropout 的教程链接吗?
谢谢!
什么是蒙特卡洛 dropout?
它是一种随机 dropout,用作模型不确定性估计的贝叶斯近似。它等效于对神经网络执行 T 次随机前向传播并平均结果。它也可以通过平均 NN 的权重(即在测试时将每个权重乘以概率 p)来近似。MC dropout 用于您详细阐述的论文以及您在这篇文章中提供的参考文献(“Uber 中时间序列的深度和可信预测”)中的模型不确定性估计。
谢谢!
请!给我一些关于如何使用 LSTM 模型实现它的教程
谢谢你的建议,我将来可能会涵盖它。
我写了一篇帖子,其中复制了这些结果。您可以在这里找到这篇文章:https://towardsdatascience.com/extreme-event-forecasting-with-lstm-autoencoders-297492485037(包含 Python 代码)
做得好,感谢分享。
@Marco。在您的一篇文章中:https://towardsdatascience.com/anomaly-detection-with-lstm-in-keras-8d8d7e50ab1b,您使用分位数回归进行异常检测。是否可以在使用 lstm 自动编码器进行极端事件预测中,使用分位数回归来识别异常?如果可以,我该如何更新它?
做得好。但我必须说,我受够了阅读这篇不完整的论文。“新输入”在论文的任何部分都没有明确说明。他们发表了一篇论文,却隐藏了一些细节或使其模糊不清。有什么意义呢?
论文总是不完整的,它们只是足以给你一个粗略的概念——这可能就足够了。
这很痛苦。除非一篇论文有相关的代码,否则它几乎是欺诈——他们可以编造任何东西。
值得庆幸的是,大多数好的论文都有相关的 github 项目——以前不是这样的。
这个“新输入”是什么?我卡在这里了。
也许这会有帮助。
https://machinelearning.org.cn/make-predictions-long-short-term-memory-models-keras/
如果你正在从不同的序列转换新的输入数据,然后平均+连接到先前的输入以进行新的预测,那么他们为什么还要添加另一个新的输入?这个新的输入是否与编码器转换前的输入相同?我仍然不明白这一点。
你说的“另一个新输入”是什么意思?
我建议阅读这篇论文,它可能包含更多细节,并使情况更清楚。
这些网络训练需要多少时间序列才足够?(作者建议这种类型的网络需要更多时间序列才能成功,但具体是多少呢?)
你能给一些数字让我有个大概的概念吗?
感谢这篇非常有见地的帖子!
这真的要看情况。
如果你没有大量数据,可以通过正则化来避免过拟合
https://machinelearning.org.cn/introduction-to-regularization-to-reduce-overfitting-and-improve-generalization-error/
有没有办法在时间序列轨迹中分离重叠事件?
我想这取决于数据。
所以轨迹中的每个独立事件都有其独特的持续时间和体积(y 值)。重叠事件看起来像一堆堆叠的矩形事件。有什么建议吗?谢谢
恕我直言,可能需要进行一些研究。也许可以在 scholar.google.com 上搜索一下
好的
谢谢 😀
我希望每 15 分钟预测 t+1(实时:永远运行)。
是寻找一个好的模型,然后我预测下一步(离线),还是每次预测后用新的预测更新我的模型(在线)更好?
尝试几种方法,看看哪种方法最适合您的特定数据集。
嗨,Jason,
我必须执行异常检测,我只有一个单变量时间序列数据(大约 1 年)。
从相同时间序列创建滞后和派生特征(例如不同窗口的均值、最小值、最大值、标准差、偏差等)并训练 LSTM 自动编码器模型是否有意义?
想法是,如果我使用滞后和派生特征对新数据点进行评分/预测,并且重构误差 > 阈值,那么它就是异常。您推荐这种方法吗?
我建议测试一系列问题框架和模型,以发现最有效的方法。
嗨,Jason,
谢谢你的回复。
但是,如果我创建的特征本质上来自 1 个单变量时间序列,然后使用自动编码器,这在概念上没有错,对吗?
只是想确认我的理解。
此致,
艾米丽
嗯,没有真正的对错,只有奏效的模型和不奏效的模型。
你的想法很复杂,但也许会奏效——试试看。这些库的伟大之处在于测试想法非常快——就像几分钟一样。
非常感谢!
嗨,Jason,
我正在处理一个问题,我有一个每日时间序列,每天都有一组大约 100 个特征。每天还有一个 0/1 事件。数据中缺少一些日期。我想根据未来的特征预测当天是否会发生事件。我真的不明白该怎么做?
非常感谢!
我建议测试多种不同的数据集框架,看看哪种效果最好。
谢谢您的及时回复。我不知道从何开始才是好的方法?我应该将其框定为简单的分类问题还是时间序列方法
从简单开始,然后走向复杂。
从分类开始,例如将前几天的特征作为输入,将今天的标签作为输出,或者其他什么。也许可以在此基础上探索特征选择。
然后开始为一些/所有特征添加更多历史记录,针对不同的先前时间间隔。找出哪些结果能产生对您的数据有用的熟练模型。
扮演科学家的角色。
你好 Jason,
单变量 LSTM RNN 能否对 1200 个每日销售数据观测值给出良好结果,其中 20% 的观测值有销售发生,另外 80% 没有销售发生,因此被视为零。销售数据以每日销售单位数量的形式存在。
我正在尝试使用这个模型。您能推荐其他时间序列模型来解决这种只有几天有销售的问题吗?60% 的准确率作为一个开始就很好。
我将问题分为两部分
1. 销售何时发生以及
2. 销售量是多少。
对于第 1 部分,我将没有销售发生的日期标记为 0,将有销售发生的日期标记为 1,而不考虑销售量。
单变量 LSTM 有助于识别 0 和 1 的模式吗……?之后我将进行第 2 部分,即销售量……如果您有任何其他技术,请告诉我……
此致
Bandeep
或许可以在您的数据上测试模型并评估结果?
我强烈建议您测试其他模型,因为 LSTM 在单变量时间序列预测方面通常表现不佳。
感谢您发表的这篇文章,以及许多其他有用的文章。
在 Uber 的研究中,您的网络是否识别出与事先已知事件(公共假期)无关的尖峰和低谷?
我正在努力开发一个能够在罕见事件(需求激增)发生之前识别它们的网络。我遇到的需求激增似乎是凭空出现的。
我有一个简单的神经网络可以预测订单何时到来,但预测下一个订单是否会激增至今仍未得到分析。运行测试表明订单大小并非随机的,经过多年在行业内的直觉告诉我,某个地方存在一个模型。
我相信它们是预期的,但我对此猜测并不确定。或许可以仔细查阅一下论文?
碰巧,一个普通的 LSTM 网络在我的数据上取得了惊人的好结果:非常令人兴奋。我猜,如果我能做到,专家们会做得更好。
因此,我认为为 Uber 工作的那些人会预测与假期无关的随机需求激增。也许这太明显了,他们觉得没有必要提及。
与他们一样,实际需求水平的不确定性也出现在我的模型中。对我来说,这是一个不那么紧急的问题,但进一步的改进让我有机会提升自己的技能。
嗨
我的数据集是 11000*6
RNN 的准确率是否可能等于或大于 LSTM?
如果您知道这个领域的来源,请告诉我
谢谢你
LSTM 是一种 RNN。
也许可以在您的数据集上测试一系列模型,然后发现哪个效果最好。
每日时间序列数据中有多少数据点才算是长时间序列数据
这真的要看情况。
通常,LSTM 每个样本的时间步长限制在 200-400。