时间序列预测如何变成有监督学习问题?
时间序列预测问题可以作为一个有监督学习问题来解决。
通过对时间序列数据的重构,您可以套用标准线性和非线性机器学习算法来解决这个问题。
在这篇文章中,您将学习如何将一个时间序列问题重新组织为适合机器学习方法的有监督学习问题。通读全文之后,您会了解:
- 什么是监督式学习,以及为何它是所有预测建模机器学习算法的基础。
- 用于构造时间序列数据集的滑动窗口方法以及它的使用操作。
- 如何使用滑动窗口进行多元数据和多步骤预测。
让我们开始吧。
有监督机器学习
大多数实际机器学习问题都是有监督学习。
有监督式学习是给定输入变量(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, ?
观察转换后的数据集,并将其与原始时间序列进行比较。我们可以有以下发现:
- 我们可以看到,在该监督学习问题中,前一个时间点的值为输入(X),下一个时间点的值是输出(y)。
- 我们可以看到,观察值的时间顺序被保留了下来,并且这在使用数据集来训练监督模型时是必须保留的。
- 我们可以看到,我们没有值可以用来预测序列中的第一个值,因此我们将该无用数据行删除。
- 我们还可以看到,我们无法得知序列中最后一个值的下一个值,这个值也应该在训练时将其删除。
这种利用先前的时间节点来预测下一个时间节点的方法被称为滑动窗口法。在某些文献中它可能被简称为窗口法。在统计和时间序列分析中,这被称为滞后或滞后方法。
预测时所利用的先前时间节点数被称为窗口宽度或滞后时长。
滑动窗口是我们将任何时间序列数据集变成有监督学习问题的基础。从这个简单的例子,我们可以注意到以下一些事情:
- 我们可以看到,如何将时间序列预测问题转化为回归(数值型变量)或分类(标签型变量)有监督学习问题。
- 我们可以看到,一旦时间序列数据经过如此处理,只要其顺序被保留,任何标准的线性或非线性机器学习算法都可以被使用。
- 我们可以了解如何通过增加滑动窗口宽度来包括更多的先前时间节点。
- 我们可以看到滑动窗口方法如何用于具有多个变量的时间序列,或所谓的多元时间序列。
我们将探索滑动窗口的一些用法,使用它来处理每个时间步骤有多个观察值的时间序列,即多元时间序列。
对多元时间序列数据应用滑动窗口方法
在时间序列数据集中某一个时间节点的变量数是十分重要的。
一般来说,时间序列分为以下两种:
- 一元时间序列:这些数据集在每个时间节点只包含一个变量,例如每小时的温度。上一节中的示例就是一个一元时间序列数据集。
- 多元时间序列:每个时间节点包含两个或更多变量的数据集。
大多数时间序列分析方法,甚至是关于这个话题的书籍,都把重点放在在单变量数据上,因为这种问题便于理解和应用。相比较而言,多变量数据通常更难以处理。不光是模型较难建立,而且许多经典算法往往在这类问题上表现不佳。
多元时间序列分析同时考虑多个时间序列……一般来说,这比一元时间序列分析复杂得多。
——《多元时间序列分析: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, ?, ?
没有多少有监督学习方法可以在不修改问题的情况下预测多个输出变量,但是一些方法,如人工神经网络,就可以轻松地做到这一点。
我们可以将预测多个变量当作预测一个序列。我们已经预测了两个不同的输出变量,但是我们也许还想要预测一个输出变量之后多个时间节点的输出。
这就是所谓的多步预测,将会在下一节进行介绍。
利用滑动窗口进行多步预测
所需要预测的时间节点数也是一个重要的参数。
同样,根据要预测的时间步数不同,我们可以用不同的名字区分开来:
- 一步预测:只预测下一个时间节点(t + 1)的值。
- 多步预测:预测两个或更多未来时间节点。
到目前为止,我们所看到的所有例子都是一步式的预测。
有很多方法可以将多步预测问题建模成一个有监督学习问题,我们将在未来的文章中介绍其中一些方法。
现在,我们仅关注使用滑动窗口方法解决多步预测问题。
考虑和第一个样例一样的一元时间序列数据集:
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。
只有经过仔细思考和多次实验之后,你才能找到一个合适窗口宽度并使你的模型具有可接受的性能。
了解更多?
如果您正在寻找更多关于如何将时间序列数据作为机器学习问题的资源,请参阅以下两篇论文:
- 关于利用机器学习处理序列数据的综述(2002)[PDF]
- 时间序列预测的机器学习策略(2013)(含演示文稿PDF)
相关Python代码,请参阅文章:
总结
在这篇文章中,您了解了如何将时间序列预测问题重新组织为有监督学习问题,从而利用机器学习方法来解决。
具体来说,您学习了:
- 对于有输入输出数据结构的机器学习问题框架,有监督学习是一种十分常用的方式。
- 滑动窗口法是将时间序列数据集重组为有监督学习问题的一种有效方法。
- 时间序列的多元或多步预测问题也可以用滑动窗口方法重组为有监督学习问题。
依然对滑动窗口方法或这篇文章存在任何问题? 在下面的评论中提出您的问题,我会尽我所能来回答。
- uva---(11549)CALCULATOR CONUNDRUM
- CF---(452)A. Eevee
- MySQL排序内部原理探秘
- Uva----------(11078)Open Credit System
- 学习HTML5之塔克大战(详细记录)
- 学习HTML5之新特性标签一览(详细)
- poj----(1251)Jungle Roads(最小生成树)
- poj-------(2240)Arbitrage(最短路)
- MySQL在线DDL修改表结构的简单经验分享
- HDUOJ-----(1162)Eddy's picture(最小生成树)
- hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)
- java设计之简单的JAVA计算器
- Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
- la----3695 City Game(最大子矩阵)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于友情链接或者其他外部链接的建议
- 总结Js方法工具类库,总有你需要的方法
- [docker]安装Mysql
- [Centos7]linux运行django项目报错no module named _ssl
- [Centos7]在非标准端口上运行SSH
- [Centos7]安装及配置bind(DNS服务)
- [Centos7.2]关于crontab报错
- [Centos7.2]关于升级python后防火墙无法启动
- [Centos7]关于限制IP通过ssh登陆
- Apache安装SSL证证书
- 打卡群刷题总结0717——不同路径 II
- [Centos7.2]Django挂载后台运行
- [Centos7+python3]IPy模块安装
- KVM实现分布式部署lamp并安装WordPress
- NumPy学的还不错?来试试这20题!