时间序列预测问题可以作为一个有监督学习问题来解决。
通过对时间序列数据的重构,您可以套用标准线性和非线性机器学习算法来解决这个问题。
在这篇文章中,您将学习如何将一个时间序列问题重新组织为适合机器学习方法的有监督学习问题。通读全文之后,您会了解:
让我们开始吧。
大多数实际机器学习问题都是有监督学习。
有监督式学习是给定输入变量(X)和输出变量(y)之后,使用算法学习从输入到输出的映射函数的过程。
Y = f(X)
问题的目标是使所得到的映射接近真实的数据关系,这样在有新的输入数据(X)时,我们可以预测该数据的输出变量(y)。
下面是一个有监督学习的数据样例,其中每行是由一个输入变量(X)和一个要被预测的输出变量(y)组成的样本。
X, y
5, 0.9
4, 0.8
5, 1.0
3, 0.7
4, 0.9
它被称为监督学习,因为从训练数据集中进行算法学习的过程可以看作是老师在监督学生的学习过程。
我们知道真实的预测值; 该算法不停地对训练数据进行迭代预测,并通过更新参数进行校正。当算法性能达到可以接受的水平时,学习就会停止。
有监督学习问题可以进一步归类为回归问题和分类问题。
免费参加我的7天e-mail课程,学习数据预处理,模型建立和更多相关知识(含示例代码)。
点击注册,并获得本课程免费的PDF教程。
时间序列数据可以重新组织来适用于有监督学习。
给定一个数字序列作为时间序列数据集,我们可以将其重构使之看起来像有监督学习问题。我们可以将以前时间的数据作为输入变量,并使用下一个时间的数据作为输出变量。
我们来举个具体的例子。想象我们有一个时间如下的序列:
time, measure
1, 100
2, 110
3, 108
4, 115
5, 120
我们可以重构这个时间序列数据集作为一个监督学习问题,通过使用上一个时间节点的值来预测下一个时间节点的值。以这种方式重新组织时间序列数据集,结果如下所示:
X, y
?, 100
100, 110
110, 108
108, 115
115, 120
120, ?
观察转换后的数据集,并将其与原始时间序列进行比较。我们可以有以下发现:
这种利用先前的时间节点来预测下一个时间节点的方法被称为滑动窗口法。在某些文献中它可能被简称为窗口法。在统计和时间序列分析中,这被称为滞后或滞后方法。
预测时所利用的先前时间节点数被称为窗口宽度或滞后时长。
滑动窗口是我们将任何时间序列数据集变成有监督学习问题的基础。从这个简单的例子,我们可以注意到以下一些事情:
我们将探索滑动窗口的一些用法,使用它来处理每个时间步骤有多个观察值的时间序列,即多元时间序列。
在时间序列数据集中某一个时间节点的变量数是十分重要的。
一般来说,时间序列分为以下两种:
大多数时间序列分析方法,甚至是关于这个话题的书籍,都把重点放在在单变量数据上,因为这种问题便于理解和应用。相比较而言,多变量数据通常更难以处理。不光是模型较难建立,而且许多经典算法往往在这类问题上表现不佳。
多元时间序列分析同时考虑多个时间序列……一般来说,这比一元时间序列分析复杂得多。
——《多元时间序列分析:R语言与金融应用》第1页
当经典方法不再适用于使用时间序列问题时,便是机器学习的最佳使用场合。可能是复杂的一元时间序列,或者是具有额外复杂度的多元时间序列。
下面是将滑动窗口方法应用于多元时间序列的另一个实例。
假设在下面的多元时间序列数据集中每个时间节点有两个变量。与此同时,我们只关心如何预测变量measure2。
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个输入和1个输出值。
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应该怎么做?
滑动窗口方法同样适用于这个情况。
对相同的时间序列数据,我们可以将其重构为另外一个有监督学习问题。如下图所示,我们可以用相同的窗口宽度1同时预测两个变量measure1和measure2。
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, ?, ?
没有多少有监督学习方法可以在不修改问题的情况下预测多个输出变量,但是一些方法,如人工神经网络,就可以轻松地做到这一点。
我们可以将预测多个变量当作预测一个序列。我们已经预测了两个不同的输出变量,但是我们也许还想要预测一个输出变量之后多个时间节点的输出。
这就是所谓的多步预测,将会在下一节进行介绍。
所需要预测的时间节点数也是一个重要的参数。
同样,根据要预测的时间步数不同,我们可以用不同的名字区分开来:
到目前为止,我们所看到的所有例子都是一步式的预测。
有很多方法可以将多步预测问题建模成一个有监督学习问题,我们将在未来的文章中介绍其中一些方法。
现在,我们仅关注使用滑动窗口方法解决多步预测问题。
考虑和第一个样例一样的一元时间序列数据集:
time, measure
1, 100
2, 110
3, 108
4, 115
5, 120
我们可以将这个时间序列重构为一个窗口宽度为1的两步预测有监督学习数据集,如下所示:
X1, y1, y2
? 100, 110
100, 110, 108
110, 108, 115
108, 115, 120
115, 120, ?
120, ?, ?
可以看出,第一行和最后两行不能用来训练模型。
显示输入变量的负担也是一个很好的例子。具体而言,监督模型只用了一个变量X1预测y1和y2。
只有经过仔细思考和多次实验之后,你才能找到一个合适窗口宽度并使你的模型具有可接受的性能。
如果您正在寻找更多关于如何将时间序列数据作为机器学习问题的资源,请参阅以下两篇论文:
相关Python代码,请参阅文章:
在这篇文章中,您了解了如何将时间序列预测问题重新组织为有监督学习问题,从而利用机器学习方法来解决。
具体来说,您学习了:
依然对滑动窗口方法或这篇文章存在任何问题? 在下面的评论中提出您的问题,我会尽我所能来回答。