Python现代时间序列预测——时间序列预测作为回归问题

171 阅读25分钟

在本书的前一部分,我们对时间序列有了基本的理解,并且掌握了分析和可视化时间序列的工具和技术,甚至生成了我们的第一个基线预测。到目前为止,我们主要讨论了经典和统计技术。现在,让我们稍微接触一下现代机器学习,了解如何利用这个相对较新的领域来进行时间序列预测。机器学习是近年来飞速发展的一个领域,能够利用这些新技术进行时间序列预测,在当今世界将是一项非常宝贵的技能。

在本章中,我们将涵盖以下主题:

  • 理解机器学习的基础
  • 将时间序列预测视为回归问题
  • 局部模型与全局模型

理解机器学习的基础

我们希望将机器学习应用于时间序列预测。但在开始之前,让我们花些时间来建立机器学习的概念,并设立一个框架来展示它的工作原理(如果你已经非常熟悉机器学习,可以跳过到下一节“将时间序列预测视为回归问题”,或者继续跟着我们复习这些概念)。1959年,Arthur Samuel 将机器学习定义为“让计算机在没有被明确编程的情况下获得学习能力的研究领域。”传统上,编程是一种我们知道一组规则/逻辑来执行某个操作的范式,并且这些操作在给定的数据上执行,得到我们想要的输出。但是,机器学习则颠倒了这一点。

在机器学习中,我们从数据和输出开始,然后让计算机告诉我们,如何通过某些规则从数据中获得我们想要的输出。

image.png

机器学习中有许多种问题设置,例如监督学习、无监督学习、自监督学习等,但我们将专注于监督学习,这是最常见的一种,也最适用于本书的内容。监督学习是我们在范式转变示例中已经提到过的,涉及程序、数据和输出。我们使用一个包含输入和预期输出配对示例的数据集,并要求模型学习它们之间的关系。

让我们从小处开始讨论,并逐步建立整个框架,这个框架包含了监督机器学习问题的关键组成部分。

image.png

正如我们已经讨论过的,机器学习的目标是从数据中学习,并得出一套规则/逻辑。数学中最接近逻辑/规则的类比是函数,它接受输入(这里是数据),并输出结果。用数学公式表示如下:

y=g(X)y = g(X)

其中,X 是特征集,g 是理想目标函数(在图5.2中标记为1),它将输入X(在示意图中标记为2)映射到目标(理想)输出y(在示意图中标记为3)。理想目标函数在很大程度上是一个未知函数,类似于我们在第1章《引入时间序列》中看到的数据生成过程(DGP),它不在我们的控制之下。

image.png

但是我们希望计算机学习这个理想的目标函数。这个理想目标函数的近似值由另一个函数表示,记作 h(在示意图中标记为4),它接受相同的特征集 X,并输出一个预测的目标(在示意图中标记为5)。 是 h 函数的参数(或模型参数):

image.png

现在,我们如何找到这个近似的 h 函数及其参数?通过一组示例数据集(示意图中的6)。监督学习问题的前提是我们能够收集一组展示特征 X 和对应目标 y(在文献中也称为标签)的示例。计算机正是通过这组示例数据集来学习近似函数 h 和最优模型参数 。在前面的示意图中,唯一真正未知的实体是理想目标函数 g。因此,我们可以使用训练数据集 D 来为数据集中的每个样本获取预测目标。我们已经知道所有示例的理想目标。我们需要一种方法来比较理想目标和预测目标,这就是损失函数(示意图中的7)发挥作用的地方。损失函数告诉我们,使用近似函数 h 与实际真值的差距有多远。

尽管 h 可以是任何函数,但它通常从一类著名的函数集合 H 中选择。H 是可以拟合数据的有限函数集合。这类函数就是我们口头上所称的模型。例如,h 可以从所有线性函数或所有基于树的函数中选择,等等。从 H 中选择 h 是通过一组超参数(由模型设计者指定)和模型参数(从数据中学习)来完成的。

现在,剩下的就是运行不同的函数,以找到最佳的近似函数 h,它给我们带来最低的损失。这是一个优化过程,我们称之为训练。

接下来,我们还需要了解一些关键概念,这些概念将在我们接下来的讨论中非常重要。

监督学习任务

机器学习可以用来解决多种任务,例如回归、分类和推荐等。但由于分类和回归是最常见的问题类别,我们将简要回顾一下它们的区别。

分类和回归任务的区别非常简单。在机器学习示意图(图 5.2)中,我们讨论了 y,即目标。这个目标可以是一个实值数字,也可以是一个类别。例如,我们可能在预测下周的股价,或者仅仅预测股市是上涨还是下跌。在第一个情况下,我们预测的是一个实值数字,这叫做回归。而在另一个情况下,我们预测的是两种类别中的一个(上涨或下跌),这叫做分类。

过拟合与欠拟合

机器学习系统中的最大挑战是我们训练的模型必须能够在新的、未见过的数据集上表现良好。机器学习模型能够做到这一点的能力被称为模型的泛化能力。在机器学习设置中,训练过程类似于数学优化,但有一个微妙的不同。数学优化的目标是找到提供数据集中的全局最大值。而在机器学习中,目标是通过使用训练误差作为代理来实现低的测试误差。模型在训练误差和测试误差上的表现好坏与过拟合和欠拟合的概念密切相关。让我们通过一个例子来理解这些术语。

机器学习模型的学习过程与人类的学习方式有很多相似之处。假设有三个学生 A、B 和 C,他们正在为考试做准备。A 是个懒学生,前一天晚上去俱乐部玩了;B 决定下定决心,把教科书从头到尾背一遍;C 在课堂上专心听讲,理解了考试的相关内容。

如预期的那样,A 没有通过考试,C 得了最高分,而 B 还不错。

A 没有通过考试是因为他们没有学够内容。这种情况在机器学习模型中也会发生,当模型没有学习足够的模式时,称为欠拟合。这通常表现为高训练误差和高测试误差。

B 的成绩没有预期的那么高,毕竟,他们背了整本教科书的内容。但考试中的许多问题并不是直接来自教科书,B 没能正确回答这些问题。换句话说,考试中的问题是新的,未见过的。由于 B 背诵了所有的内容,但没有努力理解背后的概念,因此没有能够将所学知识推广到新的问题中。在机器学习中,这种情况叫做过拟合。通常,这表现为训练误差非常低,而测试误差很高。

第三个学生 C 学得比较好,理解了背后的概念,因此能够对新的、未见过的问题进行推广。这也是机器学习模型的理想状态。通常表现为测试误差合理低,并且训练误差和测试误差之间的差距较小。

我们刚刚看到了机器学习中的两个最大挑战。现在,让我们也看一下几种可以用来应对这些挑战的方法。

模型的容量与欠拟合或过拟合之间有密切关系。模型的容量是指它足够灵活,能够拟合多种函数的能力。容量较低的模型可能难以拟合训练数据,从而导致欠拟合。容量过高的模型可能通过过度记忆训练数据而发生过拟合。为了帮助理解这个容量的概念,让我们看一个例子。当我们从线性回归转到多项式回归时,我们实际上是在为模型增加容量。与仅拟合直线不同,我们允许模型拟合曲线。

一般来说,机器学习模型在其容量适应学习问题时表现良好。

image.png

图 5.5 显示了一个非常流行的例子,用来说明过拟合和欠拟合。我们通过已知的函数生成一些随机点,并尝试使用这些数据样本来学习该函数。我们可以看到,线性回归,作为最简单的模型之一,通过在这些点之间画一条直线,导致了欠拟合。多项式回归是在线性回归的基础上加入了一些更高阶的特征。现在,你可以将从线性回归到多项式回归的过程看作是增加模型的容量。因此,当我们使用 4 次多项式时,我们看到学习到的函数很好地拟合了数据,并且与理想函数匹配。但如果我们继续增加模型的容量,并将次数增加到 15,我们看到学习到的函数依然通过了训练样本,但它学习到了一个非常不同的函数,过拟合了训练数据。找到学习一个具有泛化能力的函数的最佳容量,是机器学习的核心挑战之一。

容量是模型的一个方面,另一个方面是正则化。即使在相同容量的情况下,模型也可以从所有函数的假设空间中选择多个函数。通过正则化,我们试图优先选择假设空间中的一组函数,而不是其他函数。

虽然所有这些函数都是有效的函数,但我们通过优化过程将其引导到一个我们偏好的函数方向。尽管正则化是一个通用术语,用来指代我们在学习过程中施加的任何约束,以减少学习函数的复杂性,但更常见的形式是权重衰减。让我们以线性回归为例,当我们通过学习与每个特征相关的权重来拟合输入特征的直线时,正是这样一个过程。

线性回归模型可以用数学公式表示为:

image.png

在这里,N 是特征的数量,c 是截距,xi 是第 i 个特征,wi 是与第 i 个特征相关的权重。我们通过将这个问题视为一个优化问题来估计正确的权重(L),该优化问题最小化预测值与实际输出 y 之间的误差。

现在,通过正则化,我们在 L 中添加一个额外的项,强制使权重变得更小。通常,这通过 L1 或 L2 正则化来实现。L1 正则化是指将权重的平方和添加到 L 中:

image.png

其中,λ\lambdaλ 是正则化系数,决定了我们对权重的惩罚强度。L2 正则化是指将权重的绝对值之和添加到 L 中:

image.png

在这两种情况下,我们都强制要求权重更小的值优于更大的值,因为这可以防止模型过度依赖任何一个特征。正则化本身就是一个独立的话题;如果你想了解更多,参考进一步阅读部分会提供一些关于正则化的资源。

另一种有效的减少过拟合的方法是简单地用更多的数据来训练模型。随着数据集的增大,由于可以捕获的数据种类更多,模型发生过拟合的可能性就会减小。

那么,我们如何调节这些参数,以在欠拟合和过拟合之间找到平衡呢?我们将在下一部分进行讨论。

超参数和验证集

几乎所有的机器学习模型都有一些与之相关的超参数。超参数是模型的参数,它们不是从数据中学习得来的,而是在训练开始之前就设定好的。例如,正则化的权重就是一个超参数。大多数超参数要么帮助我们控制模型的容量,要么应用正则化。通过控制模型的容量、正则化或两者的结合,我们可以在欠拟合和过拟合模型之间找到平衡,最终得到一个“恰到好处”的模型。

但是,由于这些超参数必须在算法之外设定,我们如何估计最佳的超参数呢?虽然它不是核心学习过程的一部分,但我们也可以从数据中学习超参数。然而,如果我们只用训练数据来学习超参数,它只会选择最大的可能模型容量,这将导致过拟合。这时,我们就需要一个验证集——即训练过程无法访问的数据部分。沿用我们之前提到的类比,验证集就像学生参加的模拟考试,检查他们是否已经学得足够好。但是,当数据集较小时(不是成千上万的样本),单一验证集上的表现并不能保证公平评估。在这种情况下,我们依赖交叉验证。一般的方法是对原始数据集的不同子集重复训练和评估过程。常见的做法叫做k折交叉验证,将原始数据集划分为k个大小相等、不重叠、随机的子集,每个子集在训练其他子集之后进行评估。如果你想深入了解交叉验证技术,我们在进一步阅读部分提供了相关链接。稍后我们将在书中讲解从时间序列的角度来看交叉验证,这与标准交叉验证方法有所不同。

建议阅读:

虽然我们在本书中仅仅涉及了机器学习的皮毛,但它远不止于此。为了更好地理解本书的后续内容,我们建议你深入了解机器学习。我们建议从斯坦福大学的《机器学习》课程开始(Andrew Ng)——www.coursera.org/learn/machi…。如果你比较着急,谷歌的《机器学习速成课程》也是一个很好的起点——developers.google.com/machine-lea…

近年来,机器学习取得了巨大的进展,随之而来的是能够从数据中学习复杂模式的强大模型。当我们将这些模型与经典的时间序列预测模型进行比较时,我们会发现这些新型模型具有巨大的潜力。但是,机器学习和时间序列预测之间有一些根本的区别。在下一部分,我们将了解如何克服这些差异,并利用机器学习进行时间序列预测。

时间序列预测作为回归问题

正如我们在第一章《介绍时间序列》中所看到的,时间序列是按照时间顺序依次观察得到的一组数据。通常,时间序列预测是试图预测这些观测值在未来的变化情况。给定一个任意长度的历史观察序列,我们预测未来的值,预测的时间跨度可以是任意的。

我们看到,回归,或者说通过机器学习预测连续变量,是在一个示例数据集上进行的,每个示例由一组输入特征和目标值组成。回归的任务是预测给定一组输入值后的单一输出,而时间序列预测则是给定一组历史值后预测未来值。这两者的基本不兼容性是为什么我们不能直接将回归用于时间序列预测的原因。

此外,时间序列预测,从定义上来说,是一个外推问题,而回归通常是一个插值问题。外推问题通常更难通过数据驱动的方法解决。回归问题的另一个关键假设是,训练样本是独立且同分布的(iid)。但是时间序列破坏了这一假设,因为时间序列中的后续观测值彼此之间有显著的依赖性。

然而,为了使用机器学习中广泛的技术,我们需要将时间序列预测转化为回归问题。幸运的是,有一些方法可以将时间序列转换为回归问题,并通过引入一些特征为机器学习模型提供“记忆”来克服独立同分布(IID)的假设。接下来我们将看看如何做到这一点。

时间延迟嵌入

我们在第四章《建立强基线预测》中讨论了ARIMA模型,并了解了它是一个自回归模型。我们可以使用相同的概念将时间序列问题转换为回归问题。让我们使用以下图示来清晰地说明这个概念:

image.png

让我们假设我们有一个包含L个时间步的时间序列,就像图示中所示。我们有最新的观察值T,T-1、T-2,依此类推,向后推移,直到T-L。在理想的世界中,每个观察值在我们进行预测时应当基于所有之前的观察值。但这是不切实际的,因为L可能非常长。我们通常将预测函数限制为仅使用序列中最新的M个观察值,其中M < L。这些被称为有限记忆模型或马尔可夫模型,M被称为自回归的阶数、记忆大小或感受野。

因此,在时间延迟嵌入中,我们假设一个任意长度的窗口M < L,并通过在时间序列上滑动窗口,从时间序列中提取固定长度的子序列。

在图示中,我们使用了一个记忆大小为3的滑动窗口。所以,首先我们可以提取的子序列(如果从最新的时间点开始并向后推移)是T-3,T-2,T-1。T是紧接着子序列之后的观察值。这就成为我们数据集中的第一个例子(图中的第一行)。

接下来,我们将窗口向左滑动一个时间步(即向过去推移),提取新的子序列T-4,T-3,T-2。相应的目标将变为T-1。我们重复这个过程,向回移动直到时间序列的起始点,在每次滑动窗口时,我们向数据集中添加一个新的例子。

最终,我们得到一个对齐的数据集,具有固定的特征向量大小(即窗口大小),以及一个单一的目标,这就是典型的机器学习数据集的样子。

现在我们有了一个包含三个特征的表格,让我们为这三个特征赋予语义意义。如果我们观察图示中表格的最右列,可以看到该列中的时间步总是比目标时间步落后一时间步。我们称之为滞后1。第二列从右数总是比目标时间步落后两个时间步,我们称之为滞后2。将这一概念推广开来,具有比目标时间步滞后n个时间步的观察值的特征,我们称之为滞后n。

这种通过时间延迟嵌入将时间序列转换为回归的问题的方式,以一种可以被标准回归框架利用的方式,编码了时间序列的自回归结构。我们也可以将回归用于时间序列预测的另一种方式是对时间进行回归。

时间嵌入

如果我们在自回归模型中依赖于之前的观察值,那么在时间序列嵌入模型中,我们则依赖于时间的概念。核心思想是,我们忘记时间序列的自回归特性,假设时间序列中的任何值只依赖于时间。我们从与时间序列相关的时间戳中提取特征,这些特征捕捉了时间的流逝、时间的周期性等,然后使用这些特征通过回归模型来预测目标。实现这一目标的方式有很多,从简单地对齐一个单调且均匀增加的数字列来捕捉时间的流逝,到使用复杂的傅里叶项来捕捉时间中的周期成分。我们将在第六章《时间序列预测特征工程》中详细讨论这些技术。

在本章结束之前,我们还需要讨论一个在时间序列预测领域稳步发展的关键概念。本书的大部分内容也都涵盖了这一新的预测范式。

全球预测模型——范式转变

传统上,每个时间序列都被孤立地处理。因此,传统的预测方法总是仅通过单一时间序列的历史数据来拟合预测函数。但最近,由于今天以数字为主的世界中数据采集变得更加便捷,许多公司开始收集来自类似来源的大量时间序列数据,或者是相关的时间序列。

例如,像沃尔玛这样的零售商收集来自成千上万家商店的数百万种商品的销售数据。像Uber和Lyft这样的公司收集来自城市所有区域的打车需求数据。在能源领域,能源消费数据则是针对所有消费者进行收集的。所有这些时间序列数据集具有相似的行为,因此称为相关时间序列。

我们可以认为,所有相关时间序列的数据来自不同的数据生成过程(DGP),因此可以单独建模这些时间序列。我们称这些为局部预测模型。与这种方法的替代方案是,假设所有时间序列都来自单一的数据生成过程。我们不再为每个时间序列单独拟合预测函数,而是为所有相关时间序列拟合一个统一的预测函数。这种方法在文献中被称为全球模型或跨学习。大多数现代深度学习模型和机器学习方法都采用了全球模型范式。在接下来的章节中,我们将详细讨论这些模型。

参考文献: “全球模型”这一术语由David Salinas等人在DeepAR论文(参考文献1)中提出,“跨学习”由Slawek Smyl(参考文献2)提出。

我们之前看到,拥有更多的数据将减少过拟合的可能性,从而降低泛化误差(训练误差和测试误差之间的差异)。这是局部方法的一个短板。传统上,时间序列的数据量并不多,并且在许多情况下,收集更多数据既困难又耗时。将机器学习模型(具备强大表达能力)应用于小数据集时容易导致过拟合。因此,传统上使用强先验的时间序列模型来预测这些时间序列。但这些强先验在限制传统时间序列模型拟合的同时,也可能导致一种形式的欠拟合,限制了准确性。

像机器学习这样的强大且富有表现力的数据驱动模型需要更多的数据来构建一个能够泛化到新数据和未见数据的模型。根据时间序列的定义,它与时间紧密相关,有时收集更多数据意味着需要等待几个月甚至几年,这是不可取的。因此,如果我们无法增加时间序列数据集的长度,我们可以增加时间序列数据集的宽度。如果我们向数据集中添加多个时间序列,我们就增加了数据集的宽度,从而增加了模型训练时所使用的数据量。

图5.7展示了通过增加时间序列数据集宽度来扩展数据集的概念:

image.png

这对机器学习模型有利,因为通过提高拟合预测函数的灵活性,并增加可用数据,机器学习模型可以学习到比传统时间序列模型更复杂的预测函数,而传统时间序列模型通常是在相关时间序列之间共享的,并且完全依赖数据驱动的方式。

局部方法的另一个缺点是可扩展性问题。以我们之前提到的沃尔玛为例,需要预测的时间序列有数百万个,而无法对所有这些模型进行人工监督。如果从工程角度来思考,在生产系统中训练和维护数百万个模型会让任何工程师感到头痛。但在全球模型方法下,我们只需要为所有这些时间序列训练一个单一的模型,这大大减少了需要维护的模型数量,同时还可以生成所有所需的预测。

这种新的预测范式已经获得了广泛的关注,并且在多个时间序列竞赛中持续显示出比局部方法更好的表现,尤其是在相关时间序列数据集上。在Kaggle的多个竞赛中,例如2015年的Rossman Store Sales,2017年的Wikipedia WebTraffic Time Series Forecasting,2018年的Corporación Favorita Grocery Sales Forecasting和2020年的M5 Competition,获胜的参赛作品都是全球模型——无论是机器学习模型,深度学习模型,还是两者的结合。2021年的Intermarché Forecasting Competition的获胜提交也都是全球模型。有关这些竞赛的链接可以在进一步阅读部分找到。

尽管我们有许多经验结果表明,全球模型在相关时间序列数据集上优于局部模型,但全球模型仍然是一个相对较新的研究领域。Montero-Manson和Hyndman(2020)展示了一些非常有趣的结果,并证明了任何局部方法都可以通过具有所需复杂度的全球模型来逼近,而且他们提出的最有趣的发现是,即使在不相关的时间序列上,全球模型也会表现得更好。我们将在第10章《全球预测模型》中深入讨论全球模型及其策略。

参考文献: Montero-Manson 和 Hyndman(2020)研究论文已在参考文献部分引用为参考文献3。

总结

我们已经开始超越基线预测方法,进入了机器学习的世界。在简短回顾机器学习的基础概念后,我们讨论了过拟合、欠拟合、正则化等关键概念,并了解了如何将时间序列预测问题转化为机器学习中的回归问题。我们还从概念上理解了不同的嵌入方式,如时间延迟嵌入和时间嵌入,这些方式可以将时间序列问题转化为回归问题。最后,我们了解了时间序列预测中的一种新范式——全球模型,并从概念上将其与局部模型进行了对比。在接下来的几章中,我们将开始将这些概念付诸实践,看看特征工程的技术和全球模型的策略。

参考文献

以下是本章中使用的参考文献:
David Salinas, Valentin Flunkert, Jan Gasthaus, Tim Januschowski (2020). DeepAR: Probabilistic forecasting with autoregressive recurrent networks. International Journal of Forecasting. 36-3. 1181–1191: doi.org/10.1016/j.i…
Slawek Smyl (2020). A hybrid method of exponential smoothing and recurrent neural networks for time series forecasting. International Journal of Forecasting. 36-1: 75–85 doi.org/10.1016/j.i…
Pablo Montero-Manso, Rob J Hyndman (2020), Principles and Algorithms for Forecasting Groups of Time Series: Locality and Globality. arXiv:2008.00444[cs.LG]: arxiv.org/abs/2008.00…

进一步阅读

你可以查看以下资源以进一步阅读: