你拿到数据,被告知要开发一个预测模型。
你会怎么做?
这是一个常见的情况;比大多数人想象的要常见得多。
- 也许你收到一个CSV文件。
- 也许你获得了数据库的访问权限。
- 也许你正在开始一场比赛。
问题可以定义得相当好
- 你拥有或可以访问历史时间序列数据。
- 你了解或可以找出需要预测的内容。
- 你了解或可以找出评估候选模型时最重要的是什么。
那么,你如何解决这个问题呢?
除非你经历过这种浴火考验,否则你可能会感到挣扎。
- 你可能会挣扎,因为你是机器学习和时间序列领域的新手。
- 即使你拥有机器学习经验,你可能也会感到挣扎,因为时间序列数据是不同的。
- 即使你拥有时间序列预测的背景,你可能也会感到挣扎,因为机器学习方法可能在你的数据上胜过经典方法。
在所有这些情况下,仔细而系统地解决问题将使你受益。
在这篇文章中,我想为你提供一个具体且可操作的程序,你可以用它来解决你的时间序列预测问题。
通过我的新书《深度学习时间序列预测》启动你的项目,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

如何开发一个高超的时间序列预测模型
图片由Make it Kenya提供,保留部分权利。
流程概述
此流程的目标是尽快获得一个“足够好”的预测模型。
此流程可能不会交付最好的模型,但它将交付一个好的模型:一个优于基线预测的模型,如果存在这样的模型的话。
通常,此流程将交付一个能够达到问题上可实现效果的80%到90%的模型。
这个过程很快。因此,它侧重于自动化。超参数是通过搜索而非基于仔细分析来指定的。鼓励您并行测试模型套件,快速了解哪些有效,哪些无效。
然而,该流程是灵活的,如果您有时间和资源,您可以返回或深入到某个步骤。
这个过程分为四个部分;它们是:
- 定义问题
- 设计测试工具
- 测试模型
- 最终确定模型
你会注意到这个过程与预测建模问题的经典线性工作流程不同。这是因为它旨在快速获得一个可用的预测模型,然后放慢速度,看看是否能获得更好的模型。
你处理新的时间序列预测问题的流程是什么?
在下面的评论中分享。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
如何使用这个过程
最大的错误是跳过步骤。
例如,几乎所有初学者都会犯的错误是直接进入建模,而没有清晰地了解要解决的问题或如何可靠地评估候选解决方案。这几乎总是导致大量时间的浪费。
放慢速度,遵循流程,并完成每个步骤。
我建议为每个实验编写独立的代码,以便随时可以重新运行。
这很重要,这样当你发现一个bug时,你可以回溯,修复代码,并重新运行实验。你正在快速运行实验和迭代,但如果你粗心大意,那么你不能相信你的任何结果。这在设计用于评估候选模型的测试工具时尤其重要。
让我们仔细看看这个过程的每个步骤。
1. 定义问题
定义你的时间序列问题。
以下是一些需要考虑的主题以及每个主题中的启发性问题:
- 输入 vs. 输出
- 预测的输入和输出是什么?
- 内生 vs. 外生
- 什么是内生变量和外生变量?
- 非结构化 vs. 结构化
- 时间序列变量是非结构化的还是结构化的?
- 回归 vs. 分类
- 你正在处理一个回归还是分类预测建模问题?
- 如何以其他方式构建你的时间序列预测问题?
- 单变量 vs. 多变量
- 你正在处理单变量还是多变量时间序列问题?
- 单步 vs. 多步
- 你需要单步预测还是多步预测?
- 静态 vs. 动态
- 你需要静态模型还是动态更新模型?
回答每个问题,即使你必须估算或猜测。
一些有助于获得答案的有用工具包括:
- 数据可视化(例如线图等)。
- 统计分析(例如ACF/PACF图等)。
- 领域专家。
- 项目干系人。
随着你了解更多,更新这些问题的答案。
2. 设计测试工具
设计一个可用于评估候选模型的测试工具。
这包括用于估计模型技能的方法和用于评估预测的指标。
如果您正在寻找思路,下面是一种常见的时间序列预测模型评估方案:
- 将数据集分成训练集和测试集。
- 在训练数据集上拟合一个候选方法。
- 直接在测试集上或使用步进验证进行预测。
- 计算一个比较预测值和期望值的指标。
测试工具必须稳健,并且你必须完全信任它提供的结果。
一个重要的考虑事项是,确保用于数据准备的任何系数仅从训练数据集估算,然后应用于测试集。这可能包括数据标准化情况下的均值和标准差。
3. 测试模型
使用你的测试工具测试许多模型。
我建议仔细设计实验,测试标准模型的一套配置,并让它们运行。每个实验都可以将结果记录到文件中,以便您快速从每次运行中发现前三到五个最熟练的配置。
你可以围绕以下一些常见的方法类别设计实验:
- 基线。
- 持久性(网格搜索被持久化的滞后观测值)
- 滚动移动平均。
- …
- 自回归。
- 适用于平稳数据的ARMA。
- 适用于有趋势数据的ARIMA。
- 适用于有季节性数据的SARIMA。
- …
- 指数平滑。
- 简单平滑
- 霍尔特-温特斯平滑
- …
- 线性机器学习。
- 线性回归
- 岭回归
- Lasso回归
- 弹性网络回归
- ....
- 非线性机器学习。
- k-近邻
- 分类与回归树
- 支持向量回归
- …
- 集成机器学习。
- Bagging
- 提升
- 随机森林
- 梯度提升
- …
- 深度学习。
- MLP
- CNN
- LSTM
- 混合模型
- …
此列表基于单变量时间序列预测问题,但您可以根据您问题的具体情况进行调整,例如,在多变量时间序列预测的情况下使用VAR/VARMA/等。
根据需要,插入更多您喜欢的经典时间序列预测方法和机器学习方法。
这里的顺序很重要,它按照从经典方法到现代方法复杂性递增的结构排列。早期的方法简单且能快速获得良好结果;后期的方法较慢且更复杂,但要达到熟练水平也需要更高的门槛。
所得的模型技能可以用作一个棘轮。例如,最佳持久性配置的技能提供了一个基线技能,所有其他模型都必须超越这个基线。如果一个自回归模型比持久性模型做得更好,它就成为新的超越水平,以便一个方法被认为是熟练的。
理想情况下,您应该在进入下一个级别之前穷尽每个级别。例如,充分利用自回归方法,并将其结果作为新的基线来定义“熟练”,然后才转向指数平滑方法。
我把深度学习放在最后,因为神经网络通常不擅长时间序列预测,但这个领域仍有很大的改进和实验空间。
你拥有的时间和资源越多,可以评估的配置就越多。
例如,有更多时间和资源,你可以:
- 在已知表现良好的配置周围,以更精细的分辨率搜索模型配置。
- 搜索更多的模型超参数配置。
- 使用分析来更好地设定要搜索的模型超参数的界限。
- 利用领域知识更好地准备数据或设计输入特征。
- 探索不同的可能更复杂的方法。
- 探索表现良好的基础模型的集成。
我也鼓励您将数据准备方案作为模型运行的超参数。
有些方法会进行一些基本的数据预处理,例如ARIMA中的差分,然而,通常不清楚究竟需要哪些数据预处理方案或方案组合才能最好地将数据集呈现给建模算法。与其猜测,不如进行网格搜索并根据实际结果进行决策。
一些需要考虑的数据准备方案包括:
- 差分以消除趋势。
- 季节性差分以消除季节性。
- 标准化以居中。
- 归一化以重新缩放。
- 幂变换使其正态化。
如此多的搜索可能会很慢。
一些加快模型评估的想法包括:
- 通过云硬件(如Amazon EC2)并行使用多台机器。
- 减少训练或测试数据集的大小以加快评估过程。
- 使用更粗糙的超参数网格,如果以后有时间再回过头来细化。
- 也许在步进验证的每一步都不重新拟合模型。
4. 确定最终模型
在上一时间步结束时,你已经知道你的时间序列是否可预测。
如果它是可预测的,你将有一个在问题上表现出色的前5到10个候选模型列表。
你可以选择一个或多个模型并将其最终确定。这包括在所有可用的历史数据(训练和测试)上训练一个新的最终模型。
模型已准备好使用;例如:
- 对未来进行预测。
- 将模型保存到文件中,以便将来用于进行预测。
- 将模型集成到用于进行预测的软件中。
如果你有时间,你总是可以回到上一步,看看是否能进一步改进最终模型。
如果数据随时间发生显著变化,可能需要定期进行此操作。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在这篇文章中,你发现了一个简单的四步过程,你可以用它来快速发现一个熟练的预测模型来解决你的时间序列预测问题。
你觉得这个过程有用吗?
请在下方留言告诉我。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
开发预测回归模型的成本/价格是多少?
你具体指的是什么?
嗨,Jason,
一如既往,热爱你的文章。除了传统的时间序列分析(平滑、差分等)之外,是否有事实上的模型显示出最大的前景,或者更确切地说,在标准机器学习模型之前,是否有时间序列分析的已知组合(如差分作为预处理技术)?
循环网络在顺序数据(如NLP问题)中显示出前景,但您是否发现过关于何时应更倾向于考虑循环网络/LSTM而非ARIMA的规则?您的文章表明这仍然是一门艺术(就像机器学习一样),但我不知道您个人是否有见解。
感谢您的时间。
是的,CNN、CNN-LSTM和ConvLSTM似乎在各种时间序列预测问题上表现出色。
我将这些作为我正在编辑的关于时间序列预测深度学习新书的重点。
那本书叫什么名字?我在哪里可以买到?谢谢Jason的辛勤工作。
用于时间序列预测的深度学习
https://machinelearning.org.cn/deep-learning-for-time-series-forecasting/
在你的一个博客文章中,你曾建议不要将深度学习用于时间序列。你只是因为这是一种时尚才想将其用于时间序列吗?
最近,我在时间序列预测方面,使用CNN、CNN-LSTM和ConvLSTM取得了巨大成功。
我有一系列关于该主题的帖子计划,还有一本关于该主题的书籍来分享这些发现。
真的很期待这本书!!谢谢Jason的辛勤工作。
谢谢。
嗨,Jason,
我想知道这些帖子/书何时能出版?
我目前正在进行一个时间序列分析项目,试图评估(比较)不同DL算法与“传统”时间序列分析基准模型的性能。而这些集成模型是整体比较中非常关键的一部分。
你的许多帖子已经对我帮助很大,我期待着即将发布的关于DL和时间序列的帖子。(我真希望它能尽快发布)
非常感谢你的努力和出色的工作!
一两周内,正在进行最终编辑。
我非常了解如何使用LSTM网络(至少我是这么认为的),但我对本文中提到的大多数简单方法一无所知(我从未听说过它们!)。我对普通数据集上的深度学习有一些经验,我正在尝试将我的知识应用于时间序列预测。这样做可以吗?
做最适合你、你的项目和你的利益相关者的事情。
HI Jason B. 我是深度学习的新手。我想在环境建模中进行时间序列预测。请建议我应该选择哪个工具包来实现我的深度学习模型。
你可以从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series
你好 Jason,
祝你一切顺利。
非常感谢您提供如此信息丰富的帖子。
我请求您分享关于如何检测时间序列中异常值的知识。这里的异常值指的是序列的突然上升或下降。
谢谢,
Ravindra
这可能是一个很好的起点
https://machinelearning.org.cn/how-to-use-statistics-to-identify-outliers-in-data/
谢谢 Jason!
关于你的新书,有印刷版吗?
不,只有PDF格式,抱歉。
抱歉关于那本书的印刷版。
我刚刚在常见问题解答中看到您不提供印刷版。
再次抱歉,请删除我的评论。
谢谢。
没问题,这是给有同样问题的其他人的链接
https://machinelearning.org.cn/faq/single-faq/can-i-get-a-hard-copy-of-your-book
非常感谢Jason,一如既往地非常有用,值得未来参考。
一个问题,你会尝试将LTSM/LTSM与注意力机制(或任何其他神经网络)模型应用于具有不连续非均匀采样输出数据的多元时间序列回归问题吗?看起来不连续数据的情况比大多数方法通常假设的常规情况更难处理,文献在这方面也比较稀少。我见过一些论文推荐对基本LSTM单元架构进行修改。
除了重采样/插补数据之外,还有其他建议吗?
此致,
是的,在尝试纠正它们之前,先测试不连续性是否会影响模型性能。
此外,LSTMs对缺失或嘈杂的输入数据具有鲁棒性,就像大多数神经网络一样。
嗨,Jason,
我正在实现一个LSTM,用于根据多个特征预测单个标签(股票收盘价),并从今天(t)可视化这个预测。
我的问题是,如何使用LSTM来预测未来t+10天、t+20天、t+一个月后的收盘价?我看到的大多数示例都是基于测试数据的预测价格图,但要在股票上采取行动,我需要看到未来日期的预测。
希望这能说得通。
此致
你好Jason,目前,我也在尝试应用LSTM根据测试台获取的历史数据预测振动信号,但效果不佳,特别是对于长时间预测。你能给我一些建议,以提高LSTM在长时间预测非平稳信号时的性能吗?非常感谢。
我推荐这个框架,例如测试其他模型
https://machinelearning.org.cn/how-to-develop-a-skilful-time-series-forecasting-model/
我还尝试通过EMD将振动信号分解为6个分量,然后每个分量都通过LSTM进行预测。振动的最终预测是通过6个分量预测的总和获得的。然而,性能仍然不佳。您还有其他好的建议吗?因为振动是非平稳信号。
是的,尝试MLP、CNN、CNN-LSTM等。
更多想法在这里
https://machinelearning.org.cn/start-here/#better
你能告诉我,对于非平稳信号,你能预测的最长周期是多少?1000个点怎么样?
你可以预测任何你想要的未来间隔,但误差大小取决于你所建模序列的复杂性。
我只能说,试试看。
嗨,Jason,
我有一个数据集,包含100套公寓365天的能源消耗,每分钟采集一次数据。我想预测这100套公寓未来一年的能源消耗。我应该使用哪个模型来实现这个目的?
这个可能会有帮助
https://machinelearning.org.cn/faq/single-faq/what-algorithm-config-should-i-use
在时间序列中,如果日期缺失,对于多个产品的预测模型,我可以选择哪个模型(LSTM)?需要这方面的帮助
好问题,这可能会有帮助
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-discontiguous-time-series-data
嗨,如果你能把时间序列问题的分类学文章链接在那里,那就太方便了
https://machinelearning.org.cn/time-series-forecast-study-python-monthly-sales-french-champagne/
我是在谷歌上自己搜索了所有术语之后才发现它的!将来对其他人可能会很有用。
感谢您的精彩文章,先生!!
感谢您的反馈,mistr!
不好意思,链接错了:正确的链接在这里
https://machinelearning.org.cn/taxonomy-of-time-series-forecasting-problems/#:~:text=Unstructured%3A%20No%20obvious%20systematic%20time,trend%20and%2For%20seasonality).
你好Jason,我正在进行一项电力负荷消耗预测,将气象数据作为自变量。我使用了过去三年的数据。我的问题是,如何处理数据中这三年中的日期和月份?我需要删除它们还是将它们标准化,因为它们每365天重复一次。请帮忙
你好Migom…我建议为数据集中的每条记录建立一个一致的时间框架。也就是说,每行代表一个测量值,例如每小时或每天采集一次。
你好,希望你能回答我的问题。我有一个关于酒店预订的时间序列问题。我已经用ARIMA完成了,但结果很奇怪,它预测的是平坦值(即每天280个常数)。我也尝试了Prophet,但它给出了负值。我有的数据是一年的酒店每日预订数据。
我的问题是,您建议的预处理步骤是什么?我应该先对数据进行minmax缩放吗?
嗨,Aldo……我推荐使用LSTM模型来达到这个目的。以下资源将帮助你入门
https://machinelearning.org.cn/how-to-develop-lstm-models-for-multi-step-time-series-forecasting-of-household-power-consumption/
https://machinelearning.org.cn/use-timesteps-lstm-networks-time-series-forecasting/
如果您对我们与LSTM相关的内容有任何疑问,请告诉我们。