# 作为监督学习的时间序列预测

> 原文： [https://machinelearningmastery.com/time-series-forecasting-supervised-learning/](https://machinelearningmastery.com/time-series-forecasting-supervised-learning/)

时间序列预测可以被视为监督学习问题。

通过重新构建时间序列数据，您可以访问针对问题的标准线性和非线性机器学习算法套件。

在这篇文章中，您将了解如何重新构建时间序列问题，作为机器学习的监督学习问题。阅读这篇文章后，你会知道：

*   什么是监督学习，以及它是如何成为所有预测性建模机器学习算法的基础。
*   用于构建时间序列数据集的滑动窗口方法以及如何使用它。
*   如何使用滑动窗口进行多变量数据和多步预测。

让我们开始吧。

![Time Series Forecasting as Supervised Learning](img/1beb487ebd014c9d42f47d048e12c662.jpg)

时间序列预测作为监督学习
照片由[JeroenLooyé](https://www.flickr.com/photos/looye/6780166094/)，保留一些权利。

## 监督机器学习

大多数实际机器学习使用监督学习。

监督学习是输入变量（ **X** ）和输出变量（ **y** ）的地方，您可以使用算法来学习从输入到输出的映射函数。

```py
Y = f(X)
```

目标是近似真实的底层映射，以便当您有新的输入数据（ **X** ）时，您可以预测该数据的输出变量（ **y** ）。

下面是监督学习数据集的设计示例，其中每行是由一个输入变量（ **X** ）和一个要预测的输出变量（ **y** ）组成的观察。

```py
X, y
5, 0.9
4, 0.8
5, 1.0
3, 0.7
4, 0.9
```

它被称为监督学习，因为从训练数据集学习算法的过程可以被认为是监督学习过程的教师。

我们知道正确的答案;该算法迭代地对训练数据做出预测，并通过进行更新来纠正。当算法达到可接受的表现水平时，学习停止。

监督学习问题可以进一步分为回归和分类问题。

*   **分类**：分类问题是输出变量是一个类别，例如“`red`”和“`blue`”或“_ 疾病 _ “和”_ 没有疾病 _。“
*   **回归**：回归问题是当输出变量是实际值时，例如“_ 美元 _”或“_ 权重 _。”上面的人为举例是回归问题。

## 时间序列数据的滑动窗口

时间序列数据可以表达为监督学习。

给定时间序列数据集的数字序列，我们可以将数据重组为看起来像监督学习问题。我们可以使用前面的时间步长作为输入变量，并使用下一个时间步作为输出变量。

让我们以一个例子来具体化。想象一下，我们有一个时间序列如下：

```py
time, measure
1, 100
2, 110
3, 108
4, 115
5, 120
```

我们可以通过使用前一时间步的值来预测下一个时间步的值，将此时间序列数据集重组为监督学习问题。以这种方式重新组织时间序列数据集，数据看起来如下：

```py
X, y
?, 100
100, 110
110, 108
108, 115
115, 120
120, ?
```

查看上面转换的数据集并将其与原始时间序列进行比较。以下是一些观察结果：

*   我们可以看到前一个时间步长是输入（ **X** ），下一个时间步长是我们监督学习问题中的输出（ **y** ）。
*   我们可以看到观察之间的顺序被保留，并且在使用该数据集训练监督模型时必须继续保留。
*   我们可以看到，我们没有先前的值可以用来预测序列中的第一个值。我们将删除此行，因为我们无法使用它。
*   我们还可以看到，我们没有已知的下一个值来预测序列中的最后一个值。我们可能还希望在训练我们的监督模型时删除此值。

使用先前时间步骤来预测下一个时间步骤称为滑动窗口方法。简而言之，在一些文献中它可以被称为窗口方法。在统计和时间序列分析中，这称为滞后或滞后方法。

先前时间步数称为窗口宽度或滞后大小。

这个滑动窗口是我们如何将任何时间序列数据集转换为监督学习问题的基础。从这个简单的例子中，我们可以注意到一些事情：

*   我们可以看到这可以如何将时间序列转换为回归或分类监督学习问题，用于实值或标记的时间序列值。
*   我们可以看到，一旦按照这种方式准备时间序列数据集，可以应用任何标准线性和非线性机器学习算法，只要保留行的顺序即可。
*   我们可以看到如何增加宽度滑动窗口以包括更多的先前时间步长。
*   我们可以看到滑动窗口方法如何用于具有多个值的时间序列，或所谓的多变量时间序列。

我们将探讨滑动窗口的一些使用，接下来开始使用它来处理时间序列，在每个时间步骤有多个观察点，称为多变量时间序列。

## 具有多变量时间序列数据的滑动窗口

在时间序列数据集中记录的给定时间的观测数量很重要。

传统上，使用不同的名称：

*   **单变量时间序列**：这些数据集中每次只观察到一个变量，例如每小时的温度。上一节中的示例是单变量时间序列数据集。
*   **多变量时间序列**：这些是每次观察到两个或多个变量的数据集。

大多数时间序列分析方法，甚至关于该主题的书籍，都集中在单变量数据上。这是因为它是最容易理解和使用的。多变量数据通常更难以使用。模型更难，而且许多经典方法往往表现不佳。

> 多变量时间序列分析同时考虑多个时间序列。 ......总的来说，它比单变量时间序列分析复杂得多

- 第 1 页，[多变量时间序列分析：R 和金融应用](http://www.amazon.com/dp/1118617908?tag=inspiredalgor-20)。

使用机器学习时间序列的最佳位置是经典方法的落后。这可能是复杂的单变量时间序列，并且考虑到额外的复杂性，更可能是多变量时间序列。

下面是另一个工作示例，使滑动窗口方法具体为多变量时间序列。

假设我们有下面设想的多变量时间序列数据集，每个时间步都有两个观察结果。我们还假设我们只关注预测 **measure2** 。

```py
time, measure1, measure2
1, 0.2, 88
2, 0.5, 89
3, 0.7, 87
4, 0.4, 88
5, 1.0, 90
```

我们可以将此时间序列数据集重新构建为窗口宽度为 1 的监督学习问题。

这意味着我们将使用 **measure1** 和 **measure2** 的先前时间步长值。我们还将为 **measure1** 提供下一个时间步长值。然后我们将预测 **measure2** 的下一个时间步长值。

这将为我们提供 3 个输入要素和一个输出值，以预测每种训练模式。

```py
X1, X2, X3, y
?, ?, 0.2 , 88
0.2, 88, 0.5, 89
0.5, 89, 0.7, 87
0.7, 87, 0.4, 88
0.4, 88, 1.0, 90
1.0, 90, ?, ?
```

我们可以看到，就像上面的单变量时间序列示例一样，我们可能需要删除第一行和最后一行以训练我们的监督学习模型。

这个例子提出了一个问题，如果我们想要预测下一个时间步的 **measure1** 和 **measure2** 怎么办？

在这种情况下也可以使用滑动窗口方法。

使用上面相同的时间序列数据集，我们可以将其称为监督学习问题，其中我们预测 **measure1** 和 **measure2** 具有相同的窗口宽度 1，如下所示。

```py
X1, X2, y1, y2
?, ?, 0.2, 88
0.2, 88, 0.5, 89
0.5, 89, 0.7, 87
0.7, 87, 0.4, 88
0.4, 88, 1.0, 90
1.0, 90, ?, ?
```

没有多少监督学习方法可以处理多个输出值的预测而无需修改，但是一些方法，如人工神经网络，几乎没有什么问题。

我们可以考虑预测多个值作为预测序列。在这种情况下，我们预测了两个不同的输出变量，但我们可能想要预测一个输出变量之前的多个时间步长。

这称为多步预测，将在下一节中介绍。

## 具有多步预测的滑动窗口

预测的时间步数很重要。

同样，根据预测的时间步数，传统的问题是使用不同的名称：

*   **一步预测**：这是预测下一个时间步（t + 1）的地方。
*   **多步预测**：这是预测两个或更多未来时间步长的地方。

到目前为止，我们所看到的所有例子都是一步预测。

有许多方法可以将多步预测性建模为监督学习问题。我们将在以后的文章中介绍其中一些替代方法。

目前，我们正专注于使用滑动窗口方法构建多步预测。

考虑来自上面第一个滑动窗口示例的相同的单变量时间序列数据集：

```py
time, measure
1, 100
2, 110
3, 108
4, 115
5, 120
```

我们可以将这个时间序列构建为一个两步预测数据集，用于监督学习，窗口宽度为 1，如下所示：

```py
X1, y1, y2
? 100, 110
100, 110, 108
110, 108, 115
108, 115, 120
115, 120, ?
120, ?, ?
```

我们可以看到第一行和最后两行不能用于训练监督模型。

这也是显示输入变量负担的一个很好的例子。具体而言，监督模型仅使用 **X1** 来预测 **y1** 和 **y2** 。

您的问题需要仔细考虑和实验才能找到导致模型表现可接受的窗口宽度。

## 进一步阅读

如果您正在寻找有关如何使用时间序列数据作为机器学习问题的更多资源，请参阅以下两篇论文：

*   [顺序数据机器学习：回顾](http://web.engr.oregonstate.edu/~tgd/publications/mlsd-ssspr.pdf)（2002）[PDF]
*   [时间序列预测的机器学习策略](http://link.springer.com/chapter/10.1007%2F978-3-642-36318-4_3)（2013）（[也幻灯片](http://www.ulb.ac.be/di/map/gbonte/ftp/time_ser.pdf) PDF）

有关如何执行此操作的 Python 代码，请参阅帖子：

*   [如何将时间序列转换为 Python 中的监督学习问题](http://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/)

## 摘要

在这篇文章中，您了解了如何将时间序列预测问题重新构建为用于机器学习方法的监督学习问题。

具体来说，你学到了：

*   监督学习是将机器学习问题框定为输入和输出观察的最流行方式。
*   滑动窗口是将时间序列数据集重组为监督学习问题的方法。
*   多变量和多步预测时间序列也可以使用滑动窗口方法构建为监督学习。

您对滑动窗口方法或此帖子有任何疑问吗？
在下面的评论中提出您的问题，我会尽力回答。