时间序列存在于从气象学到金融、计量经济学和市场营销的各个领域。通过记录数据并对其进行分析,我们可以研究时间序列来分析工业流程或跟踪业务指标,例如销售或参与情况。此外,有了大量可用的数据,数据科学家可以将他们的专业知识应用于时间序列预测。
你可能看到过其他关于时间序列的课程、书籍或文章,这些都用R语言实现解决方案,R语言是一种专门为统计计算而设计的编程语言。正如你将在第3章及以后章节中学到的,许多预测技术都使用统计模型。因此,人们做了大量的工作来开发软件包,以便使用R语言无缝进行时间序列分析和预测。然而,大多数数据科学家都需要精通Python,因为它是机器学习领域最广泛使用的语言。近年来,社区和大公司开发了一些强大的库,利用Python来执行统计计算和机器学习任务、开发网站等。虽然Python远不是一种完美的编程语言,但它的多功能性对其用户来说非常有用,因为我们可以开发模型,执行统计测试,并可能通过API或开发Web界面为模型提供服务,而所有这些都使用相同的编程语言。本书将展示如何仅使用Python实现时间序列预测的统计学习技术和机器学习技术。
本书将完全聚焦时间序列预测。首先你将学习如何进行简单的预测,这些预测将作为更复杂模型的基准。然后,我们将使用两种统计学习技术(移动平均模型和自回归模型)来进行预测。这两种技术将作为我们要涵盖的更复杂建模技术的基础,使我们能够解释非平稳性、季节性效应和外生变量的影响。之后,我们将从统计学习技术转向深度学习方法,以预测高维的大型时间序列,在这种情况下,统计学习往往不如深度学习方法表现得好。
现在,我们将研究时间序列预测的基本概念。我将从时间序列的定义开始,以便你能够识别时间序列。然后,我们将逐步讨论时间序列预测的目的。最后,你将了解为什么时间序列预测不同于其他回归问题,以及为什么这个主题值得专门写一本书。
了解和进行时间序列预测的第一步是学习什么是时间序列。简而言之,时间序列只是一组按时间排序的数据点。此外,数据通常在时间上是等间隔的,这意味着每个数据点之间的间隔相等。简单地说,数据可以每小时或每分钟记录一次,也可以按月或按年取平均。时间序列的一些典型示例包括特定股票的收盘价、家庭用电量或室外温度。
时间序列
时间序列是一组按时间排序的数据点。
数据在时间上间隔相等,即每小时、每分钟、每月或每季度记录一次。时间序列的典型示例包括股票的收盘价、家庭用电量或室外温度。
让我们考虑一个数据集,它代表1960~1980年强生公司股票的季度每股收益(Earnings Per Share, EPS;单位为美元),如图1.1所示。我们将在本书中经常使用这个数据集,因为它有许多有趣的属性,可以帮助你学习用于解决更复杂的预测问题的高级技术。
图1.1 强生公司1960~1980年季度收益(美元)呈现出积极的趋势和周期性行为
正如你所看到的,图1.1清楚地表示了一个时间序列。数据按时间索引,如横轴所示。此外,数据在时间上是等间隔的,因为它是在每年的每个季度末记录的。我们可以看到数据有一个趋势,因为数值随着时间的推移而增加。我们还看到,每年的收益都在上下波动,而且这种模式每年都在重复。
我们可以通过观察时间序列的三个分量来进一步了解时间序列:趋势分量、季节性分量和残差分量。事实上,所有的时间序列都可以分解为这三个分量。
可视化时间序列的分量称为分解。分解被定义为将时间序列分离成其不同分量的统计任务。我们可以对每个单独分量进行可视化,这将帮助我们识别数据中的趋势和季节性模式,这并不能总是通过查看数据集直接获得。
让我们仔细看看强生公司季度每股收益的分解,如图1.2所示。你可以看到如何将观测到的数据拆分为趋势、季节性和残差。让我们更详细地研究这个图表的每一部分。
图1.2 1960~1980年强生公司季度收益的分解
首先,顶部的图表记为观测值,它简单地显示了记录的时间序列(如图1.3所示)。纵轴表示强生公司季度每股收益值(美元),而横轴表示时间。它基本上是图1.1的再现,并且它显示了图1.2的趋势、季节性和残差图合并后的结果。
图1.3 关注观测图
然后我们有了趋势分量,如图1.4所示。同样,请记住,纵轴表示数值,而横轴仍然表示时间。在时间序列中,趋势被定义为缓慢移动的变化。我们可以看到,它开始是平缓的,然后急剧上升,这意味着我们的数据呈上升趋势。趋势分量有时被称为水平。我们可以将这个趋势分量视为试图通过大量数据点画一条线来显示时间序列的大致方向。
接下来,我们看到季节性分量,如图1.5所示。季节性分量捕捉季节性变化,这是在固定时间段内发生的循环。我们可以看到,在一年或四个季度的过程中,每股收益开始缓慢增加,然后在年底再次减少。
图1.4 关注趋势分量。在我们的序列中有一个趋势,因为分量不平坦。它表明随着时间的推移,数值不断增加
图1.5 关注季节性分量,我们的时间序列有周期性的波动,这表明收益每年都在上下波动
请注意纵轴显示负值会怎样,这是否意味着每股收益为负?显然,这是不可能的,严格地讲,因为我们的数据集具有正值。因此,我们可以说,季节性分量显示了我们偏离趋势如何。有时我们有一个正偏差,我们在图中观测到一个峰值。有时,我们有一个负偏差,我们在图中会观测到一个波谷。
最后,图1.2中的最下面一张图展示了残差,这是趋势或季节性分量都无法解释的。我们可以认为残差是趋势和季节性图叠加在一起,并将每个时间点的值与观测图进行比较。对于某些点,我们可能会得到与观测值完全相同的值,在这种情况下,残差将为零。在其他情况下,该值不同于观测值,因此,残差图显示了那些必须添加到趋势和季节性分量中的数据,以便调整结果并获得与观测值相同的值。残差通常对应于随机误差,也称为白噪声,我们将在第3章中讨论。它们代表我们无法建模或预测的信息,因为它是完全随机的,如图1.6所示。
图1.6 关注残差分量,残差不能用趋势和季节性分量来解释
时间序列分解
时间序列分解是我们将时间序列分解为趋势、季节性和残差等分量的过程。
趋势代表了时间序列中的缓慢变化。它负责使该序列随着时间的推移逐渐增加或减少。
季节性分量代表了该序列中的季节性模式。这些循环在一个固定的时间段内反复发生。
残差代表了趋势和季节性分量无法解释的行为。它们对应于随机误差,也称为白噪声。
我们已经直观地看到每个分量如何影响预测工作。如果一个时间序列呈现出某种趋势,那么我们就会期待它在未来会继续呈现这种趋势。同样,如果我们观察到强烈的季节性效应,这种情况很可能会持续下去,预测必须反映这一点。在本书的后面,你将看到如何考虑这些分量,并将它们包含在模型中以预测更复杂的时间序列。
预测是使用历史数据和可能影响我们预测的未来事件的知识来预测未来。这个定义充满了希望,作为数据科学家,我们通常非常渴望通过使用科学知识来展示一个令人难以置信的具有近乎完美的预测准确性的模型,并用它来开始预测。然而,在达到预测点之前,必须涵盖一些重要的步骤。
图1.7是一个完整预测项目在专业设置下的简化示意图。但请注意,这些步骤并不是通用的,它们可能会也可能不会被遵循,这取决于组织及其成熟度。尽管如此,这些步骤对确保数据团队和业务团队之间的良好凝聚力是必不可少的,从而提供商业价值并避免团队之间的摩擦和挫折。
图1.7 项目预测路线图。第一步自然是设定目标,证明预测的必要性;然后,你必须确定需要预测什么才能实现这一目标;接着设置预测的范围,一旦完成,你就可以收集数据并开发预测模型;最后将模型部署到生产中,监控其性能,并再收集新数据,以便重新训练预测模型并确保其仍然相关
让我们深入研究一个场景,该场景详细涵盖了预测项目路线图的每个步骤。想象一下,你正计划一个月后进行一次为期一周的露营旅行,你想知道要随身携带哪个睡袋,以便晚上可以舒适地睡觉。
任何项目路线图的第一步都是设定目标。这里的场景很明确:你想知道晚上带哪个睡袋才能睡得舒服。如果晚上很冷,那么一个温暖的睡袋是最好的选择。当然,如果预计晚上会很暖和,那么一个轻便的睡袋会是更好的选择。
然后为决定带哪个睡袋你要确定什么是必须预测的。在这种情况下,你需要预测夜间的温度。为了简化问题,只要考虑预测最低温度就足以做出决定,因为最低温度出现在夜间。
现在,你可以设置预测的范围。在这种情况下,你的露营旅行是一个月后开始,并且将持续一周。因此,你预测的时间范围是一周,因为你只对预测露营旅行期间的最低温度感兴趣。
现在,你可以开始收集数据了。例如,你可以收集历史每日最低温度数据。你还可以收集可能影响温度的因素的数据,比如湿度和风速。
这时会产生一些问题,就是到底收集多少数据才算足够。理想情况下,你应该收集1年以上的数据。这样,你可以确定是否存在年度季节性模式或趋势。就温度而言,你当然可以期待一年中的一些季节性模式,因为不同的季节会带来不同的最低温度。
然而,一年的数据并不是确定数据多少的最终答案。这在很大程度上取决于预测的频率。在这种情况下,你将创建每日预测,因此,一年的数据应该足够了。
如果你想按每小时构建预测,几个月的训练数据就足够了,因为它将包含大量的数据点。如果你要按月度或年度构建预测,则需要更大的历史时段,以获得足够多的数据点进行训练。
最后,关于训练模型所需的数据量,这里没有明确的答案。确定这一点是构建模型、评估其性能,以及测试更多数据是否会提高模型性能的实验过程的一部分。
有了历史数据,你就可以开发预测模型了。项目路线图的这一部分是本书的重点。这是你研究数据并确定是否存在趋势或季节性模式的时候。
如果你观察季节性,那么SARIMA模型将是相关的,因为该模型使用季节性效应来产生预测。如果你有关于风速和湿度的信息,那么你可以使用SARIMAX模型将其考虑在内,因为你可以向它提供来自外部变量(如风速和湿度)的信息。我们将在第8章和第9章中详细探讨这些模型。
如果你设法收集了大量的数据,比如过去20年的日最低气温,那么你可以使用神经网络来训练这些大量的数据。与统计学习方法不同,深度学习倾向于产生更好的模型,因为更多的数据被用于训练。
无论开发哪个模型,你都将使用部分训练数据作为测试集来评估模型的性能。测试集将始终是最新的数据点,并且必须代表预测范围。
在这种情况下,由于你的预测范围是一周,因此你可以从训练集中删除最后7个数据点,将它们放在测试集中。然后,在训练每个模型时,你可以生成一周的预测,并将结果与测试集进行比较。模型的性能可以通过计算误差度量来评估,例如均方误差(Mean Squared Error,MSE)。这是一种评估你的预测与实际值差距的方法。MSE最小的模型将是性能最好的模型,它将进入下一步。
一旦你得到了最佳模型,就必须把它部署到生产环境中。这意味着你的模型可以接收数据,并返回未来7天的每日最低气温预测。有许多方法可以将模型部署到生产环境中,这可能是一整本书的主题。你的模型可以作为API或集成到Web应用程序中来运行,你也可以定义自己的Excel函数来运行该模型。最终,模型部署后,当你输入数据时,无须对其进行任何手动操作,就能返回预测。此时,还可以对你的模型进行监控。
由于露营旅行距离现在有1个月,因此你可以看到你的模型的表现。每天,你都可以将模型的预测与当天记录的实际最低气温进行比较,这使你可以确定模型预测的质量。
你还可以查找意外事件。例如,可能会出现热浪,从而降低模型预测的质量。密切监控你的模型和当前事件可以让你确定意外事件是暂时的,还是会持续2个月,在这种情况下,它可能会影响你的露营旅行决定。
在监控模型时,你需要将模型的预测与当天观测到的最低气温进行比较,这样就必须收集新的数据。这个新的、更新的数据可以用来重新训练模型,这样就可以用来预测未来7天的最低气温。
这个循环在接下来的一个月里重复,直到露营旅行开始的那一天,如图1.8所示。到那时,你将做出许多预测,根据新观测到的数据评估它们的质量,并在你记录它们时用新的日最低气温重新训练模型。这样,你就可以确保你的模型仍然有效,并使用相关数据来预测露营旅行的温度。
最后,根据模型的预测,你可以决定带哪个睡袋。
图1.8 生产循环可视化。一旦将模型部署到生产中,就将进入一个循环,对其进行监控,收集新的数据,并使用该数据调整预测模型,然后再次部署它
你可能遇到过这样的回归任务,在这些任务中,你必须在给定一组特征集的情况下预测一些连续目标。乍一看,时间序列预测似乎是一个典型的回归问题:我们有一些历史数据,并且希望建立一个数学表达式,将未来值表示为过去值的函数。然而,在一些与时间无关的场景中,时间序列预测和回归之间存在一些关键差异,因此我们需要在研究第一种预测技术之前了解这些差异。
第一个要记住的概念是,时间序列有一个顺序,我们在建模时不能改变这个顺序。在时间序列预测中,我们将未来值表示为过去值的函数。因此,我们必须保持数据有序,这样才不会违反这种关系。
此外,保持数据有序是有意义的,因为你的模型只能使用从过去到现在的信息——它不知道未来会观测到什么。回想一下你的露营之旅,如果你想预测星期二的气温,那么你不可能使用星期三的相关信息,因为从模型的角度来看,它是未来的。你只能使用星期一及其之前的数据。这就是在整个建模过程中数据的顺序必须保持不变的原因。
机器学习中的其他回归任务通常没有顺序。例如,如果你的任务是根据广告支出预测收入,那么何时进行特定金额的广告支出并不重要。相反,你只需将广告支出金额与收入相关联。事实上,你甚至可以随机打乱数据以使你的模型更加健壮。这里,回归任务是简单地推导出一个函数,给定广告花费的金额,该函数就会返回收入的估计。
另外,时间序列是按时间索引的,并且必须保持该顺序。否则,你将使用没有预测时间的未来信息来训练模型,这在很多正式的术语中被称为前瞻偏差。因此,所得到的模型是不可靠的,当你对未来进行预测时,该模型很可能会表现不佳。
在不使用除时间序列本身之外的特征的情况下,可以进行时间序列预测。
作为数据科学家,我们习惯于拥有包含许多列的数据集,每一列都代表我们目标的一个潜在预测因子。例如,考虑基于广告花费预测收入的任务,其中收入是目标变量。我们可以使用Google、Facebook和电视等广告上花费的金额作为特征。利用这三个特征,我们将建立一个回归模型来估计收入。
然而,对于时间序列,通常会给出一个简单的数据集,其中包含一个时间列和该时间点的值。在没有任何其他特征的情况下,我们必须学习使用时间序列的过去值来预测未来值的方法。这是移动平均模型(第4章)或自回归模型(第5章)开始发挥作用的时候,因为它们是将未来值表示为过去值的函数的方法。这些模型是更复杂模型的基础,这些模型允许你考虑时间序列中的季节性模式和趋势。从第6章开始,我们将逐步建立一些基准模型来预测更复杂的时间序列。
本书将详细介绍不同的预测技术。我们将从一些非常基本的方法开始,如移动平均模型和自回归模型,我们将逐步考虑更多的因素,以便使用ARIMA、SARIMA和SARIMAX模型预测具有趋势和季节性模式的时间序列。我们还将处理高维时间序列,这要求我们对顺序数据使用深度学习技术。因此,我们必须使用CNN(Convolutional Neural Network,卷积神经网络)和LSTM(Long Short-Term Memory,长短期记忆)来构建神经网络。最后,你将学习如何使用自动化预测时间序列的工作。如前所述,本书中的所有实现都将用Python完成。
现在你已经理解了什么是时间序列,以及这些预测与你以前可能见过的任何传统回归任务有何不同,我们已经准备好并开始进行预测。然而,我们在预测方面的第一次尝试将集中在作为基线模型的简单方法上。
❍时间序列是一组按时间排序的数据点。
❍时间序列的示例是股票的收盘价或室外温度。
❍时间序列可以分解为三个分量:趋势分量、季节性分量和残差分量。
❍设定预测目标以及在模型部署后进行监控是非常重要的。这将确保项目的成功和持久。
❍在建模时,切勿更改时间序列的顺序,不允许打乱数据。