使用Python进行现代时间序列预测
第二版
利用PyTorch和pandas进行工业级机器学习和深度学习时间序列分析
Manu Joseph
Jeffrey Tackes
Packt及本书与Python无正式关联。本书是Python专家社区为帮助更多开发者所做的努力。
使用Python进行现代时间序列预测
第二版
序言
预测作为一门学科已经发生了显著变化。几十年来,该领域一直被那些往往比复杂模型表现更佳的简单模型所主导。在各种竞赛中,机器学习方法一再被证明缺乏竞争力,或者最多只能增加很少的价值。这段时期,我作为一名博士生开始从事预测工作,被一些人称为预测寒冬。
自那以后,许多事情发生了变化,我们现在生活在一个不同的预测世界中。随着全局建模范式的发展以及更多数据和高频数据的可用性,机器学习方法在许多预测情境中变得极具竞争力,预测研究现在也由这些方法驱动。同样,在从业者方面,预测通常由具有机器学习背景但缺乏专门预测培训的数据科学家进行。他们偏好的编程工具通常是Python。
Manu 的书是我所知的第一本也是最全面地反映这一深刻转变的资源。它将众多概念和思想整合成连贯易懂的形式,而数据科学家们若想自行获取并理解这些内容将颇为困难。对于任何从事预测工作的数据科学从业者来说,这应是一本必读之书。
第二版承认了该领域的快速发展。它使用了最成熟的软件框架(如 NIXTLAverse)进行了更新,介绍了一些最新模型,并涵盖了概率预测的方法,尤其是保形预测。
Manu 及其合著者 Jeffrey 均拥有丰富的实践经验,显然对主题了如指掌。就连我在阅读本书时也学到了一些新东西。
Christoph Bergmeir
María Zambrano (Senior) Fellow
Department of Computer Science and AI
University of Granada
Spain
贡献者
关于作者
是一位自学成才的数据科学家,拥有 15 年与众多财富 500 强企业合作推动数字化转型和人工智能转型的经验,特别是在基于机器学习的需求预测领域。他被视为时间序列预测领域的一位专家、思想领袖和强有力的声音。目前,Manu 是沃尔玛的一名高级数据科学家,也是开源库 PyTorch Tabular 的开发者。他原籍印度特里凡得琅,现与妻子和儿子居住在印度班加罗尔。
我衷心感谢我亲爱的妻子多年来的坚定支持,也感谢 Siddharth Roy 给了一个数据科学界的新人机会,让我得以攀登知识之梯。即使我没有一一指名,也感谢所有支持并帮助我走过这段旅程的人。
是一位拥有十余年行业经验的需求预测方向资深数据科学家。目前,他就职于卡夫亨氏,领导负责需求预测的研究团队。他率先开发了世界一流的预测系统,被多家财富500强领先企业采用。Jeff的方法结合了强大的数据驱动方法论与创新策略,显著提升了预测模型及业务成果。通过领导跨职能团队,Jeff设计并实施的需求预测系统大幅提高了预测准确性、库存优化水平和客户满意度。他还积极为开源社区做贡献,尤其是PyTimeTK,并开发了增强时间序列分析能力的工具。目前,他与妻子和儿子居住在伊利诺伊州芝加哥。
我谨向我的妻子致以最深切的感谢,她的坚定支持、耐心和鼓励是我整个旅程中不断的力量源泉。没有她的信任,这部作品不可能完成。我也衷心感谢众多导师、同事和朋友,他们分享知识、提供宝贵机会,塑造了我的道路。对所有在个人和职业成长上给予我帮助的人,我深表感激。这份成就同样属于你们。
关于审稿人
是《使用Prophet预测时间序列数据》一书的作者。他是旧金山湾区的数据科学家,拥有十余年工作经验,曾任职于谷歌、Meta和IBM等多家顶级科技公司。Greg还曾为零售领域的公司(如Gap和Albertsons/Safeway)担任顾问,在Coursera教授商业分析课程,并领导过面向数据科学与分析领域行业专业人士的面对面研讨会。
博士是“复杂度感知预测”概念的创始人,这是一种新颖的方法,通过量化输入数据的复杂度并设计与之匹配的AI模型,来识别和整合数据的内在复杂性。
他是一位拥有超过25年行业经验的AI科学家,在数据科学和AI领域表现出色,并在AI研究和模型开发方面有突出成果。他也是多本书籍的作者,包括《AI驱动的时间序列预测:复杂度感知预测与决策》。
前言
人类一直渴望拥有预测未来的能力。自最早的文明开始,人们便试图预知未来。萨满、神谕者和先知们利用从占星术、手相学到命理学等各种方法,以满足人类窥见未来的需求。上世纪,随着信息技术的发展,预测未来的重任落到了数据分析师和数据科学家肩上。那么,我们如何预测未来呢?不再是通过观察手掌的纹路或星辰的位置,而是利用过去生成的数据。与其说是神谕,不如说是预测,我们现在有了预测。
时间作为我们世界的第四维度,使得世界上生成的所有数据都是时间序列数据。现实世界中生成的所有数据都具有与时间相关的元素。时间方面是否与问题相关则完全是另一个问题。然而,为了更具体和直接,我们在许多行业中都可以找到时间序列预测的应用案例,例如零售、能源、医疗和金融。我们可能想知道某个特定产品需要配送到某个特定商店多少单位,或者我们可能想知道需要生产多少电力以满足需求。
在本书中,你将使用真实数据集学习如何使用 pandas 和 plotly 处理和可视化时间序列数据,使用 darts 生成基线预测,并借助流行的 Python 库(例如 scikit-learn 和 PyTorch)使用机器学习和深度学习进行预测。本书最后用几个章节介绍了少有人涉及的方面,例如多步预测、预测指标和时间序列交叉验证。
本书将帮助你通过掌握并应用机器学习和深度学习中的现代概念,构建能够扩展到数百万时间序列的真实世界时间序列预测系统。
本书适合读者
本书非常适合希望构建行业级时间序列模型的数据科学家、数据分析师、机器学习工程师和 Python 开发者。由于本书从基础开始讲解大多数概念,你只需具备基本的 Python 熟练度即可。对机器学习或预测的预先理解将有助于加快学习速度。对于机器学习与预测领域的经验丰富的从业者,本书在高级技术和探索时间序列预测的最新研究前沿方面提供了大量内容。
本书涵盖内容
第1部分——熟悉时间序列
第1章,介绍时间序列,主要向你介绍时间序列的世界。我们给出了时间序列的定义,并讨论了它与数据生成过程(DGP)的关系。我们还将讨论预测的局限性,并说明哪些无法预测,最后通过定义一些术语来结束本章,这些术语将帮助你理解本书的其余部分。
第2章,获取和处理时间序列数据,介绍了如何处理时间序列数据。你将理解不同形式的时间序列数据如何以表格形式表示。你将学习 pandas 中不同的日期时间相关功能,并学习如何使用适合时间序列的技术填充缺失数据。最后,使用真实数据集,你将逐步完成使用 pandas 处理时间序列数据的旅程。
第3章,分析和可视化时间序列数据,通过学习如何可视化和分析时间序列来进一步介绍时间序列。你将学习时间序列数据常用的不同可视化方法,然后学习如何通过将时间序列分解为其组成部分来深入一层。最后,你还会学习识别和处理时间序列数据中异常值的方法。
第4章,建立强大的基线预测,直接进入时间序列预测的主题,我们使用经过验证的计量经济学方法(例如 ARIMA 和 指数平滑)来生成强大的基线。这些高效的预测方法将提供强大的基线,以便我们超越这些经典技术,学习现代技术(如机器学习)。你还将了解另一个关键主题——使用 谱熵 和 变异系数 等技术评估可预测性。
第2部分——时间序列的机器学习
第5章,时间序列预测作为回归问题,开启了使用机器学习进行预测的旅程。对机器学习的简要介绍为后续章节奠定了基础。你还将从概念上理解如何将时间序列问题转化为回归问题,以便应用机器学习。本章结尾,我们简要介绍了全局预测模型的可能性。
第6章,时间序列预测的特征工程,转向更实用的课程。使用真实世界数据集,你将学习不同的特征工程技术,例如滞后特征、滚动特征和傅里叶项,这些技术有助于将时间序列问题表述为回归问题。
第7章,时间序列预测的目标变换,继续探讨不同的目标变换以适应时间序列的非平稳性。你将学习诸如扩展的迪基-富勒检验和曼-肯德尔检验等技术来识别和处理非平稳性。
第8章,使用机器学习模型预测时间序列,延续上一章的内容,开始在我们一直处理的数据集上训练机器学习模型。使用本书中的标准代码框架,你将训练诸如线性回归、随机森林和梯度提升决策树等模型。
第9章,集成与堆叠,退一步探讨如何利用多个预测并将它们组合以生成更好的预测。你将探索流行技术,如最佳拟合、不同版本的爬山算法、模拟退火和堆叠,以组合之前生成的多个预测来获得更优结果。
第10章,全局预测模型,以令人兴奋的新范式——全局预测模型——结束你的机器学习预测引导之旅。你将学习如何使用全局预测模型和行业验证技术来提升其性能,从而最终为数千个时间序列开发可扩展且高效的机器学习预测系统。
第3部分——深度学习用于时间序列
第11章,深度学习入门,我们切换赛道,开始探讨一种特定类型的机器学习——深度学习。在本章中,我们通过探讨不同主题奠定深度学习的基础,例如表示学习、线性变换、激活函数和梯度下降。
第12章,时间序列深度学习的构建模块,通过使深度学习专门针对时间序列来继续这一旅程。考虑到深度学习系统的组合性,你将学习不同的构建模块,并以此构建深度学习架构。本章首先建立编码器-解码器架构,然后讨论不同的模块,如前馈网络、循环神经网络和卷积神经网络。
第13章,时间序列的常见建模模式,通过展示一些具体且常见的构建模块排列模式来生成预测,从而强化上一章介绍的编码器-解码器架构。这是一个动手实践章节,你将使用基于深度学习的表格回归和不同的序列到序列模型来创建预测。
第14章,时间序列的注意力机制与Transformer,涵盖了使用注意力机制改进深度学习模型的当代话题。本章首先讨论广义注意力模型,你将学习不同类型的注意力方案,如缩放点积注意力和加性注意力。你还将调整上一章的序列到序列模型以引入注意力,然后训练这些模型生成预测。接着本章讨论Transformer模型,这是一种完全依赖注意力的深度学习架构,然后你也会用它来生成预测。
第15章,全局深度学习预测模型的策略,处理深度学习预测的另一个重要方面。尽管本书前面已经讨论了全局预测模型,但深度学习模型实现上存在一些差异。在本章中,你将学习如何实现全局深度学习模型以及提升这些模型性能的技术。你还将在动手实践部分看到它们的效果,我们将使用之前一直处理的真实世界数据集生成预测。
第16章《面向预测的专用深度学习架构》通过讨论几种流行的专用时间序列预测深度学习架构,结束了您在基于深度学习的时间序列预测中的旅程。利用您在前几章中学到的概念和构建模块,本章将带您走向研究前沿,揭示时间序列预测中最先进的模型,如N-BEATS、N-HiTS、Informer、Autoformer和Temporal Fusion Transformer。除了理解它们,您还将学习如何使用这些模型生成基于真实数据集的预测。
第17章《概率预测与更多》带您进入概率预测的领域,涉及保形预测、蒙特卡洛丢弃、分位数函数和概率密度函数等技术,并让您能够使用流行的开源框架实际实现这些技术。本章还涉足时间序列预测中较少探讨的领域,高层次讨论了间歇性预测、可解释性、冷启动预测和分层预测,作为您在这些领域探索的起点。
第4部分——预测机制
第18章《多步预测》探讨了很少被讨论但高度相关的多步预测话题。您将学习生成未来多个时间步预测的不同策略,例如递归、直接、DirRec、RecJoint和Rectify。本书还讨论了每种策略的优点和缺点,并帮助您为问题选择正确的策略。
第19章《评估预测误差——预测指标综述》又探讨了一个很少被讨论且充满争议的话题,不同观点众说纷纭。您将学习衡量预测好坏的不同方法,并通过可运行的实验揭示不同指标的优缺点。本章最后提出了一些指导原则,帮助您为问题选择正确的指标。
第20章《评估预测——验证策略》通过讨论可用于时间序列的不同验证策略,结束了评估预测的部分以及全书。您将学习不同的验证策略,如留出法、交叉验证及其变体。本章还涉及在设计全局设置的验证策略时需要考虑的方面。在本章结束时,您将看到选择验证策略的一些指导原则,以及诸如时间序列能否使用交叉验证?等问题的答案。
如何充分利用本书
本书必须与GitHub中的笔记本和关联代码库一起使用,最佳实践是两者结合使用。您可以通过本书进行三个层次的学习。第一层次仅依靠书中的文本,它将带您了解理论,培养直觉,并介绍基本代码以快速实现某些功能。为了巩固学习,我们建议您迈出下一步,使用提供的笔记本并进行实验。在大多数笔记本中,我们展示了如何以特定方式做一件事。但有许多杠杆,如超参数,您可以调整并运行,以了解输出如何随着这些变化而变化。这个层次的学习将使您理解代码,并对从书中学到的概念有更深入的理解。
最后,我们将部分代码抽象到存储库中的src文件夹中,这些代码在笔记本中使用。您的最后一个学习层次是浏览并理解这些代码,从而了解其内部工作原理。大多数代码都有良好的注释,以便您更容易理解笔记本中使用的函数和类背后的机制。这将把您的学习提升到一个层次,使您能够自信地将这些技术像专家一样应用于其他用例。
您应当具备Python编程的基本熟悉度,因为我们在实践部分使用的所有代码都是Python。熟悉Python的主要库,例如pandas和scikit-learn,虽然不是必需的(因为本书涵盖了一些基础知识),但将帮助您更快地完成本书。熟悉深度学习框架PyTorch(本书使用的框架)也不是必需的,但会加速您的学习。任何软件需求都不应阻止您,因为在当今互联网时代,阻碍您与知识世界之间唯一的东西是您最喜欢的搜索引擎中的搜索栏。
环境搭建
强烈建议为本书搭建一个环境,最好是独立的环境。我们建议两种主要方法来创建环境——Anaconda/Mamba或Python虚拟环境。
使用 Anaconda/Miniconda/Mamba
搭建环境最简单的方式是使用 Anaconda,这是面向科学计算的 Python 发行版。如果你不想安装 Anaconda 自带的预装包,也可以使用 Miniconda(即 Conda 的轻量级安装程序)。此外,还可以使用 Mamba,它是 conda 包管理器在 C++ 中的重新实现,速度比 conda 快得多,并且是 conda 的即插即用替代品。推荐使用 Mamba,因为它几乎不会卡在 Anaconda 中那令人头疼的 Resolving dependencies… 界面。如果你使用的是 Anaconda 23.10 或更高版本,则无需过多担心 Mamba,因为快速高效的包解析器已默认集成在 Anaconda 中。
- 安装 Anaconda/Miniconda/Mamba/MicroMamba:可以从 https://www.anaconda.com/products/distribution 安装 Anaconda。根据你的操作系统选择相应的文件并按照说明操作。或者,也可以从此处安装 Miniconda:https://docs.anaconda.com/miniconda/。你可以从此处安装 Mamba 和 MicroMamba:https://mamba.readthedocs.io/en/latest/。如果你使用 Mamba,请在以下所有指令中将 “
conda” 替换为 “mamba”。 - 打开 conda 提示符:要打开 Anaconda Prompt(Linux 或 macOS 上为 Terminal),请执行以下操作:
- Windows:打开 Anaconda Prompt(开始 | Anaconda Prompt)
- macOS:打开 Launchpad,然后打开 Terminal。输入
conda activate。 - Linux:打开 Terminal。输入
conda activate。
- 创建新环境:使用以下命令创建所需的新环境。例如,要创建一个名为
modern_ts_2E的环境(Python 3.10,建议使用 3.10 或更高版本),请使用以下命令:conda create -n modern_ts_2E python=3.10 - 激活环境:使用以下命令激活环境:
conda activate modern_ts_2E - 从官方网站安装
PyTorch:PyTorch最好从官方网站安装。前往 https://pytorch.org/get-started/locally/ 并为你的系统选择合适的选项。如果你希望使用 Mamba 安装,可以将conda替换为mamba。 - 导航到下载的代码:使用操作系统特定的命令导航到你下载代码的文件夹。例如,在 Windows 中,使用
cd。 - 安装所需的库:使用提供的
anaconda_env.yml文件安装所有必需的库。使用以下命令:conda env update --file anaconda_env.yml
这将在环境中安装所有必需的库。此过程可能需要一些时间。
- 检查安装:我们可以通过执行下载代码文件夹中的脚本
python test_installation.py来检查本书所需的所有库是否已正确安装。如果 GPU 未显示,请再次在环境中安装 PyTorch。 - 激活环境并运行笔记本:每次要运行笔记本时,首先使用
conda activate modern_ts_2E命令激活环境,然后根据个人偏好使用 Jupyter Notebook(jupyter notebook)或 Jupyter Lab(jupyter lab)。
使用Python虚拟环境和pip
如果你更倾向于使用原生Python进行环境管理,我们也提供了一个备选的 requirements.txt 文件来帮助你:
- 安装Python:你可以从 https://www.python.org/downloads/ 下载Python。 建议使用3.10及以上版本。
- 创建虚拟环境:使用以下命令创建一个名为
modern_ts_2E的虚拟环境:python -m venv modern_ts_2E - 激活环境:使用以下命令激活环境:
- Windows:
modern_ts_2E\Scripts\activate - macOS/Linux:
source modern_ts_2E/bin/activate
- Windows:
- 安装PyTorch:PyTorch最好从官方网站安装。请访问 https://pytorch.org/get-started/locally/ 并为你的系统选择合适的选项。
- 导航到下载的代码目录:使用特定于操作系统的命令导航到你下载代码的文件夹。例如,在Windows中,使用
cd。 - 安装所需的库:使用提供的
requirements.txt文件安装所有必需的库。使用以下命令:pip install -r requirements.txt
这将在环境中安装所有必需的库。此过程可能需要一些时间。
- 检查安装:我们可以通过执行下载代码文件夹中的脚本来检查本书所需的所有库是否正确安装:
python test_installation.py - 激活环境并运行笔记本:每次你想运行笔记本时,首先使用命令
modern_ts_2E\Scripts\activate(Windows)或source modern_ts_2E/bin/activate(macOS/Linux)激活环境,然后根据你的偏好使用Jupyter Notebook(jupyter notebook)或Jupyter Lab(jupyter lab)。
创建环境时出错怎么办?
考虑到全球计算机种类繁多且库依赖关系不断变化,本书提供的环境设置(截至2024年9月已测试并正常工作)很可能无法经受时间的考验。在这种情况下,我们建议你打开requirements.txt,查看我们安装的是哪些库,并尝试判断降级或升级版本是否有助于解决问题。
另一种解决方法是,在使用某个笔记本时,只安装你需要的包。冲突通常发生在我们尝试将不同库安装到同一环境时。例如,某个库需要PyTorch < 1.0.0,但另一个库需要PyTorch > 1.0.0。在这种情况下,将这两个库分离到两个环境中,或者寻找与其他库兼容的另一个版本,是合理的做法。
在这种情况下,你最好的伙伴是谷歌搜索,随后查看抱怨相同问题的GitHub评论。作为最后的手段,你也可以在本书的仓库中提出问题,我们会尽力帮助你。
下载数据
你将在全书中使用同一个数据集。本书使用Kaggle的London Smart Meters数据集。早期章节的许多笔记本是后续某些章节的依赖。因此,为了在你想按顺序运行笔记本时消除这种依赖,我们包含了一个包含所有所需数据集的data.zip文件。
要设置环境,请执行以下步骤:
- 从AWS下载数据:https://packt-modern-time-series-py.s3.eu-west-1.amazonaws.com/data.zip。
- 解压内容。
- 将
data文件夹复制到你从GitHub拉取的Modern-Time-Series-Forecasting-with-Python-2E文件夹中。
就是这样!你现在可以开始运行代码了。
如果你使用的是本书的电子版,我们建议你自行输入代码,或从本书的GitHub仓库获取代码。这样做有助于避免因复制粘贴代码而可能产生的任何错误。
随书附带的代码绝非库,而更像是一个引导你开始实验的指南。你能从本书和代码中学到多少,直接取决于你如何在代码上实验以及如何走出舒适区。所以,继续前进,开始实验,并将你在书中学到的技能付诸实践吧。
下载示例代码文件
您可以从GitHub的https://github.com/PacktPublishing/Modern-Time-Series-Forecasting-with-Python-2E下载本书的示例代码文件。如果代码有更新,将会在GitHub仓库中更新。
我们还有来自丰富书籍和视频目录的其他代码包,可在https://github.com/PacktPublishing/获取。快去看看吧!
下载彩色图片
我们还提供了一个PDF文件,其中包含本书使用的屏幕截图和图示的彩色图片。您可以在此处下载:https://packt.link/gbp/9781835883181。
使用约定
本书中使用了许多文本约定。
Code in text:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。这里有一个例子:“statsmodels.tsa.seasonal有一个名为seasonal_decompose的函数。”
代码块设置如下:
#Does not support missing values, so using imputed ts instead
res = seasonal_decompose(ts, period=7*48, model="additive", extrapolate_trend="freq")
任何命令行输入或输出编写如下:
conda env create -f anaconda_env.yml
加粗:表示新术语、重要单词或屏幕上显示的单词。例如,菜单或对话框中的单词以加粗显示。这里有一个例子:“但是如果你查看已用时间列,它很突出。”
重要说明 显示如下。
提示显示如下。
联系我们
我们始终欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请发送邮件至 customercare@packtpub.com,并在邮件主题中提及本书标题。
勘误:尽管我们已尽最大努力确保内容的准确性,但错误仍可能发生。如果您在本书中发现错误,我们将不胜感激。请访问 www.packtpub.com/support/errata 并填写表单。
如果您有兴趣成为作者:如果您在某个领域有专长,并且有兴趣撰写或合著一本书,请访问 authors.packtpub.com。
留下评论!
感谢您从Packt Publishing购买本书——希望您喜欢!您的反馈非常宝贵,有助于我们改进和成长。阅读完毕后,请花一点时间在 Amazon评论 上留下评论;只需一分钟,但对像您这样的读者来说意义重大。
扫描下方二维码即可免费获得一本您选择的电子书。
下载本书的免费PDF副本
感谢您购买本书!
您是否喜欢随时随地阅读,却又无法随身携带纸质书?
您购买的电子书是否与您选择的设备不兼容?
别担心,现在每本Packt图书都附赠无DRM保护的PDF版本,无需额外费用。
随时随地,在任何设备上阅读。从您喜爱的技术书籍中搜索、复制代码,并直接粘贴到您的应用程序中。
福利不止于此,您还可以独家获得折扣、新闻通讯以及每日发送到收件箱的精彩免费内容。
按照以下简单步骤获取福利:
- 扫描二维码或访问下方链接:
https://packt.link/free-ebook/9781835883181
- 提交您的购买凭证。
- 就这样!我们会将免费的PDF及其他福利直接发送到您的邮箱。
第1部分
熟悉时间序列
在这一部分中,我们将通过理解什么是时间序列、如何处理和操控时间序列数据以及如何分析和可视化时间序列数据,来初步涉足时间序列预测。本部分还涵盖了经典的时间序列预测方法,如ARIMA,以作为强有力的基线。
本部分包含以下章节:
- 第1章,时间序列简介
- 第2章,获取与处理时间序列数据
- 第3章,分析与可视化时间序列数据
- 第4章,设定强基线预测