用Python进行时间序列预测-了解时间序列预测

很少有现象不受时间的影响,这本身就足以证明理解什么是时间序列的重要性。 在本书的第一部分,我们将定义时间序列并探索使用它们的特殊性。 我们还将使用简单的方法开发我们的第一个预测模型。 这些将作为基线模型,我们将在本书中重复使用这些技术。 最后,我们将研究无法进行预测的情况,以便我们识别并避免陷入该陷阱。

1 了解时间预测序列

本章内容

  • 时间序列简介
  • 了解时间序列三个主要组成部分
  • 成功的预测项目所必需的步骤
  • 预测时间序列与其他回归任务有何不同

时间序列存在于从气象学到金融、计量经济学和市场营销的各个领域。 通过记录和分析数据,我们可以研究时间序列来分析工业流程或跟踪业务指标,例如销售额或参与度。 此外,借助大量可用数据,数据科学家可以将他们的专业知识应用于时间序列预测技术。

您可能遇到过其他关于时间序列的课程、书籍或文章,它们在 R 中实现了他们的解决方案,R 是一种专门用于统计计算的编程语言。 许多预测技术都使用统计模型,您将在第 3 章及以后的章节中学习。因此,我们做了大量工作来开发软件包,以使用 R 无缝进行时间序列分析和预测。然而,大多数数据科学家都需要精通 Python,因为它是机器学习领域中使用最广泛的语言。近年来,社区和大公司开发了强大的库,利用 Python 执行统计计算和机器学习任务、开发网站等等。虽然 Python 远不是一种完美的编程语言,但它的多功能性对其用户来说是一个巨大的好处,因为我们可以开发模型、执行统计测试,并可能通过 API 或开发 Web 界面为我们的模型提供服务,同时使用相同的编程语言。本书将向您展示如何仅使用 Python 实现时间序列预测的统计学习技术和机器学习技术。

本书将完全专注于时间序列预测。您将首先学习如何进行简单的预测,这些预测将作为更复杂模型的基准。然后我们将使用移动平均模型和自回归模型这两种统计学习技术来进行预测。这些将作为我们将要介绍的更复杂的建模技术的基础,这将使我们能够考虑非平稳性、季节性影响和外生变量的影响。之后,我们将从统计学习技术切换到深度学习方法,以预测具有高维的非常大的时间序列,在这种情况下,统计学习的性能通常不如深度学习。

现在,本章将探讨时间序列预测的基本概念。我将从定义时间序列开始,以便您可以识别一个。然后,我们将继续讨论时间序列预测的目的。 最后,您将了解为什么预测时间序列与其他回归问题不同,以及为什么该主题值得拥有一本书。

1.1 时间序列简介

理解和执行时间序列预测的第一步是了解什么是时间序列。简而言之,时间序列就是按时间排序的一组数据点。 此外,数据通常在时间上等间隔,这意味着相等的间隔将每个数据点分开。

简单来说,数据可以每小时或每分钟记录一次,也可以每月或每年平均记录。 一些典型的时间序列示例包括特定股票的收盘价、家庭用电量或室外温度。

时间序列
时间序列是按时间排序的一组数据点。
数据在时间上是等间隔的,这意味着它是在每小时、每分钟、每月或每季度记录的。 时间序列的典型例子包括股票收盘价、家庭用电量或室外温度。

让我们考虑一个数据集,该数据集表示 1960 年至 1980 年强生公司股票的季度每股收益(以美元计),如图 1.1 所示。 我们将在本书中经常使用这个数据集,因为它有许多有趣的特性,可以帮助你学习更复杂的预测问题的高级技术。

如您所见,图 1.1 清楚地表示了一个时间序列。 数据按时间索引,如横轴所示。 此外,数据在时间上是等间隔的,因为它是在每年每个季度末记录的。 我们可以看到数据有一个趋势,因为值随着时间的推移而增加。 我们还看到收益在每年的过程中上下波动,并且这种模式每年都在重复。

图 1.1 强生公司 1960 年至 1980 年的季度收益(以美元计)呈现积极趋势和周期性行为

1.1.1 时间序列的组成部分

我们可以通过查看它们的三个组成部分来进一步理解时间序列:趋势、季节性组成部分和残差。 事实上,所有时间序列都可以分解为这三个元素。

可视化时间序列的组成部分称为分解。 分解被定义为一项统计任务,它将时间序列分成不同的组成部分。 我们可以可视化每个单独的组件,这将帮助我们识别数据中的趋势和季节性模式,仅仅通过查看数据集并不总是那么简单。 

让我们仔细看看强生公司季度每股收益的分解,如图 1.2 所示。您可以看到观察到的数据是如何分成趋势、季节性和残差的。让我们更详细地研究图表的每一部分。

图 1.2 强生公司 1960 年至 1980 年季度收益分解

首先,顶部的图表,标记为 Observed,简单地显示了记录时的时间序列(图 1.3)。y 轴以美元显示强生公司季度每股收益的价值,而 x 轴代表时间。它基本上是图 1.1 的再现,它显示了结合图 1.2 中的趋势图(Trend)、季节性图(Seasonal)和残差图(Residuals)的结果。

图 1.3 关注观察图(Observed)

然后是趋势组件,如图 1.4 所示。同样,请记住,y 轴代表值,而 x 轴仍然指的是时间。趋势定义为时间序列中缓慢变化的变化。我们可以看到它一开始是平的,然后急剧上升,这意味着我们的数据有一个增加或积极的趋势。

图 1.4 关注趋势部分。 我们的时间序列有一个明显的趋势,随着时间的推移,价值在不断增加。

趋势部分有时被称为水平。我们可以将趋势组件视为试图通过大多数数据点绘制一条线,以显示时间序列的大致方向。

接下来我们在图 1.5 中看到季节性成分。季节性组件捕获季节性变化,这是一个在固定时间段内发生的循环。 我们可以看到,在一年或四个季度的过程中,每股收益从低位开始,然后在年底再次增加和减少。

图 1.5 关注季节性成分。 在这里,我们的时间序列存在周期性波动,这表明收益每年都会上升和下降。

请注意 y 轴如何显示负值。这是否意味着每股收益为负数?显然这不可能,因为我们的数据集严格具有正值。因此,我们可以说季节性成分显示了我们如何偏离趋势。有时是正偏差,中会得到一个峰值。其他时候,我们会是负偏差,在观察图(Observed)中看到的是一个低谷。

最后,图 1.2 中的最后一张图显示了残差,这是趋势或季节性成分都无法解释的。我们可以将残差视为将趋势图和季节性图相加,并将每个时间点的值与观察到的图进行比较。对于某些点,我们可能会得到与 Observed 完全相同的值,在这种情况下,残差将为零。在其他情况下,该值与 Observed 中的值不同,因此 Residuals 图显示了必须将什么值添加到 Trend 和 Seasonal 才能调整结果并获得与 Observed 中相同的值。残差通常对应于随机误差,也称为白噪声,我们将在第 3 章讨论。它们代表了我们无法建模或预测的信息,因为它完全是随机的,如图 1.6 所示。

图 1.6 关注残差。 残差无法用趋势和季节性成分来解释。

时间序列分解
时间序列分解是我们将时间序列分成其组成部分的过程:趋势、季节性和残差。
趋势表示时间序列中缓慢移动的变化。 它负责使系列随时间逐渐增加或减少。
季节性成分表示系列中的季节性模式。 这些循环在固定的时间段内重复发生。
残差代表趋势和季节性成分无法解释的行为。 它们对应于随机误差,也称为白噪声。

我们已经可以直观地看到每个组件在预测时如何影响我们的工作。如果时间序列揭示了某种趋势,那么我们预计它会在未来继续下去。同样的,如果我们观察到强烈的季节性效应,这种情况很可能会持续下去,我们的预测必须反映这一点。在本书的后面,您将看到如何考虑这些组件并将它们包含在您的模型中以预测更复杂的时间序列。

1.2 时间序列预测的鸟瞰图

预测是使用历史数据和可能影响我们预测的未来事件的知识来预测未来。这个定义充满了希望,作为数据科学家,我们通常非常渴望通过使用我们的科学知识来展示一个具有近乎完美预测准确性的令人难以置信的模型来开始预测。但是,在达到预测点之前必须完成一些重要步骤。

图 1.7 是一个完整的预测项目在专业环境中的简化图。请注意,这些步骤不是通用的,可能会也可能不会遵循,具体取决于组织及其成熟度。尽管如此,这些步骤对于确保数据团队和业务团队之间的良好凝聚力至关重要,从而提供业务价值并避免团队之间的摩擦和挫折。

让我们深入探讨一个场景,该场景详细涵盖了预测项目路线图的每个步骤。想象一下,您计划从现在开始一个月后进行为期一周的露营旅行,并且您想知道随身携带哪种睡袋,以便晚上睡得舒服。

  • 设定一个目标
  • 确定必须预测什么才能实现我们的目标
  • 设定预测范围
  • 收集数据
  • 开发预测模型
  • 部署到生产环境
  • 监视其运行情况
  • 收集新数据(重复5、6、7、8)

图 1.7 预测项目路线图

第一步自然是设定一个目标,证明预测的必要性。然后,您必须确定需要预测什么才能实现该目标。然后你设定预测的范围。完成后,您可以收集数据并开发预测模型。然后将模型部署到生产中,监控其性能,并收集新数据以重新训练预测模型并确保它仍然相关。

1.2.1 设定目标

任何项目路线图的第一步都是设定目标。这里在场景中很明确:您想知道晚上带哪个睡袋舒适地入睡。如果晚上会很冷,温暖的睡袋是最好的选择。 当然,如果预计夜晚会很温暖,那么轻便的睡袋将是更好的选择。

1.2.2 确定实现目标必须预测的内容

然后你开始确定必须预测什么,以便你决定带哪个睡袋。在这种情况下,您需要预测夜间的温度。为简化起见,让我们考虑预测最低温度足以做出决定,并且最低温度发生在晚上。

1.2.3 设定预测范围

现在您可以设置预测范围。 在这种情况下,您的露营之旅是从现在开始的一个月,并且将持续一周。因此,我们有了一周的时间范围,因为您只对预测露营旅行期间的最低温度感兴趣。

1.2.4 收集数据

您现在可以开始收集数据了。例如,您可以收集历史每日最低温度数据。您还可以收集有关可能影响温度的可能因素的数据,例如湿度和风速。

这就到了具体多少数据才算够用的问题了。理想情况下,您应该收集超过1年的数据。这样,你就可以确定是否存在年度季节性模式或趋势。就温度而言,你当然可以期待一年四季的一些季节模式,因为不同的季节会带来不同的最低温度。

然而,1年的数据并不是多少数据就足够的最终答案。这在很大程度上取决于预报的频率。在这种情况下,您将创建每日预测,因此1年的数据应该足够了。

如果您想创建每小时的预报,几个月的训练数据就足够了,因为它将包含大量的数据点。如果要创建月度或年度预测,则需要更长的历史时期,以获得足够的数据点进行训练。

最后,对于训练模型所需的数据量没有明确的答案。确定这一点是构建模型、评估其性能并测试更多数据是否能提高模型性能的实验过程的一部分。

1.2.5 开发预测模型

有了您的历史数据,您就可以开发预测模型了。项目路线图的这一部分是整本书的重点。这是您研究数据并确定是否存在趋势或季节性模式的时候。

如果您观察季节性,那么 SARIMA 模型将是相关的,因为该模型使用季节性影响来产生预测。如果您有关于风速和湿度的信息,您可以使用 SARIMAX 模型将其考虑在内,因为您可以使用来自外生变量的信息(例如风速和湿度)为其提供信息。我们将在第 8 章和第 9 章详细探讨这些模型。

如果您设法收集了大量数据,例如过去 20 年的每日最低温度,您可以使用神经网络来利用这些非常大量的训练数据。 与统计学习方法不同,深度学习往往会产生更好的模型,因为更多的数据用于训练。

无论您开发哪种模型,您都将使用部分训练数据作为测试集来评估模型的性能。 测试集将始终是最新的数据点,并且必须代表预测范围。

在这种情况下,由于您的时间范围是一周,您可以从训练集中移除最后七个数据点,将它们放入测试集中。然后,当每个模型都经过训练后,您可以生成一周的预测并将结果与测试集进行比较。 可以通过计算误差度量来评估模型的性能,例如均方误差 (MSE)。 这是一种评估您的预测与实际值相差多远的方法。MSE 最低的模型将是您表现最好的模型,它将进入下一步。

1.2.6 部署到生产环境

拥有冠军模型后,您必须将其部署到生产环境中。这意味着您的模型可以接收数据并返回对未来 7 天的最低每日温度的预测。将模型部署到生产环境有很多方法,这可能是整本书的主题。您的模型可以用作 API 或集成到 Web 应用程序中,或者您可以定义自己的 Excel 函数来运行模型。最终,当您可以输入数据并返回预测而无需对数据进行任何手动操作时,您的模型就会被视为已部署。此时,您的模型可以被监控。

1.2.7 监控

由于露营之旅是从现在开始的 1 个月,您可以看到您的模型的表现如何。 每天您都可以将模型的预测与当天记录的实际最低温度进行比较。从而确定模型预测的质量。

您还可以通过查找意外事件。 例如,可能因为出现的热浪,降低了模型预测的质量。 密切监视您的模型和当前事件可以让您确定意外事件是否由临时情况引起,或者是否会持续接下来的 2 个月,在这种情况下,它可能会影响您对露营旅行的决定。

1.2.8 收集新数据

通过监控您的模型,您必须在将模型的预测与当天观察到的最低温度进行比较时收集新数据。然后可以使用这些新的、更新的数据来重新训练您的模型。 这样,您就可以使用最新数据来预测未来 7 天的最低温度。

这个循环在接下来的一个月里不断重复,直到到达露营的那一天,如图 1.8 所示。到那时,您将做出许多预测,根据新观察到的数据评估它们的质量,并在您记录它们时使用新的每日最低温度重新训练您的模型。 这样,您可以确保您的模型仍然有效,并使用相关数据来预测您的野营旅行的温度。

最后,根据模型的预测,您可以决定随身携带哪个睡袋。

  • 开发预测模型
  • 部署到生产环境
  • 监视其运行情况
  • 收集新数据

图 1.8 可视化生产循环。 模型投入生产后,您将进入一个监控模型、收集新数据并使用该数据调整预测模型的周期,然后再次部署它。

1.3 时间序列预测与其他回归任务有何不同

您可能遇到过回归任务,您必须在给定一组特征的情况下预测一些连续目标。乍一看,时间序列预测似乎是一个典型的回归问题:我们有一些历史数据,希望建立一个数学表达式,将未来值表示为过去值的函数。然而,时间序列预测和时间无关情景的回归之间存在一些关键差异,在我们研究第一个预测技术之前,应该解决这个问题。

1.3.1 时间序列有顺序

要记住的第一个概念是时间序列有一个顺序,我们不能在建模时改变这个顺序。 在时间序列预测中,我们将未来值表示为过去值的函数。 因此,我们必须保持数据有序,以免破坏这种关系。

此外,保持数据有序是有意义的,因为您的模型只能使用从过去到现在的信息——它不知道将来会观察到什么。 回想一下你的露营之旅。 如果你想预测周二的温度,你不可能使用周三的信息,因为从模型的角度来看,它是未来的。 您将只能使用周一及之前的数据。 这就是为什么数据的顺序在整个建模过程中必须保持不变。

机器学习中的其他回归任务通常没有顺序。 例如,如果您的任务是根据广告支出预测收入,那么何时在广告上花费了一定金额并不重要。 相反,您只想将广告支出金额与收入联系起来。 事实上,您甚至可以随机打乱数据以使您的模型更加健壮。 这里的回归任务是简单地导出一个函数,使得给定广告支出金额,返回收入的估计值。

另一方面,时间序列按时间索引,并且必须保持该顺序。 否则,您将使用预测时没有的未来信息来训练您的模型。这在更正式的术语中称为前瞻偏差。 由此生成的模型将不可靠,并且在您进行未来预测时很可能表现不佳。

1.3.2 时间序列有时没有特征

可以在不使用时间序列本身以外的特征的情况下预测时间序列。

作为数据科学家,我们习惯于拥有包含许多列的数据集,每个列代表我们目标的潜在预测因子。 例如,考虑基于广告支出预测收入的任务,其中收入是目标变量。 作为特征,我们可以得到花在 Google 广告、Facebook 广告和电视广告上的金额。 使用这三个特征,我们将建立一个回归模型来估计收入。

但是,对于时间序列,给定一个包含时间列和该时间点值的简单数据集是很常见的。 在没有任何其他特征的情况下,我们必须学习使用时间序列的过去值来预测未来值的方法。 这是移动平均模型(第 4 章)或自回归模型(第 5 章)发挥作用的时候,因为它们是将未来值表示为过去值的函数的方法。 这些模型是更复杂模型的基础,然后允许您考虑时间序列中的季节性模式和趋势。 从第 6 章开始,我们将逐步建立在这些基本模型的基础上来预测更复杂的时间序列。

1.4 后续步骤

本书将详细介绍不同的预测技术。 我们将从一些非常基本的方法开始,例如移动平均模型和自回归模型,我们将逐渐考虑更多因素,以便使用 ARIMA、SARIMA 和 SARIMAX 模型预测具有趋势和季节模式的时间序列。 我们还将使用高维时间序列,这将要求我们对序列数据使用深度学习技术。 因此,我们将不得不使用 CNN(卷积神经网络)和 LSTM(长短期记忆)来构建神经网络。 最后,您将学习如何自动化预测时间序列的工作。 如前所述,本书中的所有实现都将在 Python 中完成。

现在您已经了解了时间序列是什么以及预测与您之前可能见过的任何传统回归任务有何不同,我们准备继续并开始预测。 然而,我们在预测方面的第一次尝试将集中在用作基线模型的简单方法上。

本章要点

  • 时间序列是按时间排序的一组数据点。
  • 时间序列的示例是股票的收盘价或室外温度。
  • 时间序列可以分解为三个部分:趋势、季节性部分和残差。
  • 在预测时设定一个目标并在部署模型后对其进行监控非常重要。 这将确保项目的成功和长久。
  • 建模时切勿更改时间序列的顺序。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据