机器学习可以被用于时间序列预测。

在机器学习能使用之前,时间序列预测需要被重新转化成有监督学习。将一个序列组合成成对的输入输出序列。

在这篇教程中,你会发现如何通过使用机器学习算法将单变量和多变量的时间预测序列转化成有监督学习。

在看完这篇教程之后,你会知道:

1、如何写一个将时间序列的数据集转化成有监督学习的数据集的函数。

2、如何将机器学习用于一个单变量的时间序列。

3、如何将机器学习用于一个多变量的时间序列。

开始吧~

  • 时间序列vs有监督学习

开始之前,我们先来看看时间序列和有监督学习的数据。

一个时间预测序列是一串通过时间索引排序的数字序列,这可以被认为是一列排好序的数值。

比如:

0
1
2
3
4
5

  一个有监督学习将输入(X)和输出(Y)进行组合,以便于算法可以学习如何预测从输入预测输出。

比如:

X,    Y
1, 2
2, 3
3, 4
4, 5
5, 6
  • Pandas的shift()函数

一个帮助将时间序列转化成有监督学习任务的关键函数是Pandas shift() 函数。

给定一个DataFrame,shift()函数可以被用来创造一列数据的副本,然后将数据向前推进或者向后回退。

这个行为要求在监督学习的形式内创造一列滞后的观察值作为时间序列的预测值。

让我们看一下例子吧~

我们定义一个模拟的含有十个数据的时间序列,在DateFrame这样创造:

from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
print(df)

  运行这个小例子,会打印时间序列数据以及它们的列索引

     t
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9

  我们可以通过在顶上插入一个新行使得这一列的时间序列数据滞后原来一个时间步长。因为新的行没有数据,我们可以使用NaN来表示没有数据。

shift()函数可以自动帮我们做这个事:

from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
df['t-1'] = df['t].shift(1)
print(df)

  运行这个小例子会得到两行数据,第一列是原来的,第二列是转化后的。

可以看出来将序列向前推进一个时间步可以给我们一个原始的有监督学习数据集,尽管X和Y是错误的顺序。忽略列中的行标记。第一行被抛弃因为有NaN数值。第二行表示输入为0.0时,输出为1。

   t  t-1
0 0 NaN
1 1 0.0
2 2 1.0
3 3 2.0
4 4 3.0
5 5 4.0
6 6 5.0
7 7 6.0
8 8 7.0
9 9 8.0

  可以看到,如果我们重复上述过程给shift()函数2,3...等参数,就可以创造一个可以被用来预测输出Y的长的输入序列X。

shift()函数也可以接收负整数为参数,负整数会将数据提前并且在序列最后加NaN。

from pandas import DataFrame
df = DataFrame()
df['t'] = [x for x in range(10)]
df['t+1'] = df['t'].shift(-1)
print(df)

  运行这个小例子,会得到:

   t  t+1
0 0 1.0
1 1 2.0
2 2 3.0
3 3 4.0
4 4 5.0
5 5 6.0
6 6 7.0
7 7 8.0
8 8 9.0
9 9 NaN

  在时间序列预测中,(t)表示当前时间,未来将要被预测的时间是(t+1, t+2,...,t+n),过去被已经被观察的时间是(t-1, t-2,..., t-n)。

  我们已经看到对时间序列如何进行正向或者逆向的转化组成输入和输出形式的DateFrame,并将此作为有监督学习的数据集。这种方法不仅可以组成X->y的预测,还可以组成输入和输出都是序列的X->Y的预测。

  • The series_to_supervised() Function

在这部分,我们会定义一个新的python函数叫做 series_to_supervised() ,它可以完成将单变量或者多变量的时间序列数据转化成有监督学习的数据。

这个函数有四个参数:

  • data:2D的numpy数组或者列表存储序列。
  • n_in:将时间序列滞后n_in个时间步,取值范围为[1...len(data)],默认值为1。
  • n_out:输出y的个数,取值范围为[1...len(data)-1]。默认值为1。
  • dropnan:布尔值,表示是否丢弃NaN值。默认值为True,表示丢弃。
  • return:panda DataFrame
from pandas import DataFrame
from pandas import concat def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
"""
Frame a time series as a supervised learning dataset.
Arguments:
data: Sequence of observations as a list or NumPy array.
n_in: Number of lag observations as input (X).
n_out: Number of observations as output (y).
dropnan: Boolean whether or not to drop rows with NaN values.
Returns:
Pandas DataFrame of series framed for supervised learning.
"""
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg

  

参考博客:https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/

如何用python将一个时间序列转化成有监督学习的更多相关文章

  1. 用Python将一个列表分割成小列表

    用Python将一个列表分割成小列表 2018年01月15日 11:09:25 幸福丶如此 阅读数:16842   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  2. python将文本转化成语音并播放

    一.问题 在学习的过程中,我们会涉及到将文本信息,转化成语音的过程,比如:我爬取了一个小说的网站,我要将里面的内容进行语音处理.目前能够进行语音的方法还是很多,比如win32com,百度ai. 二.解 ...

  3. Python matplotlib图片转化成矢量图并裁剪

    Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...

  4. 怎样将一个整数转化成字符串数,并且不用函数itoa

    #include<iostream> using namespace std; int main() { , j = , i = ; ], str[]; while (num) { tem ...

  5. Python中将列表转化成矩阵表示

    list1 = [] a = [1,3,4] b = [2,5,6] list1.append(a) list1.append(b) arr = np.array(list1) # 打印arr pri ...

  6. java将一个javabean转化为另一个javabean

    公司的项目是用webservice来进行前后台对接,启动后台后需要刷服务才能在前台生成对应的代码,但是有一个很恶心的地方,它给每个service都生成了一个model,于是出现后台只有一个javabe ...

  7. Python如何将整数转化成二进制字符串

    Python 如何将整数转化成二进制字符串 1.你可以自己写函数采用 %2 的方式来算. >>> binary = lambda n: '' if n==0 else binary( ...

  8. 如何将一个Maven项目转化成一个Eclipse项目

    有时候我们需要将一个Maven项目导入到Eclipse中,直接作为一个普通的eclipse项目来导入是不行的,我们可以通过一个命令来实现:mvn eclipse:eclipse 1. 进入该Maven ...

  9. Python代码阅读(第2篇):数字转化成列表

    本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项. 本篇阅读的代码片段来自于30-seconds-of-python. digitize def d ...

随机推荐

  1. MariaDB导入XXX.sql文件

    使用的 MariaDB5.5.52 开启数据库服务: systemctl start mariadb 要使用该脚本,登录数据, mysql -u root -p 根据提示输入你安装数据库时需设置密码, ...

  2. python学习之爬虫初体验

    作业来源: "https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2851" ** 1.简述爬虫原理 通用爬虫 即(搜索 ...

  3. ELK学习笔记之ELK搜集OpenStack节点日志

    模板来自网络,模板请不要直接复制,先放到notepad++内调整好格式,注意缩进 部署架构 控制节点作为日志服务器,存储所有 OpenStack 及其相关日志.Logstash 部署于所有节点,收集本 ...

  4. Developing Vert.x Modules using the Standard Project

    The module The tests Unit tests Integration tests Java integration tests JavaScript integration test ...

  5. kube-liveboard: kubernetes集群可视化工具

    kube-liveboard 随着kubernetes 集群的增大,对于集群数据选取恰当的形式进行展示有助于直观反映集群的状态,方便发现集群的短板,了解集群的瓶颈.因此,笔者做了kube-livebo ...

  6. 移动namenode、secondarynamenode和jobTracker的节点(使其成为独立节点)

    https://blog.csdn.net/zwx19921215/article/details/22528097

  7. Unity 2018.2.8 旧版本安装包和破解软件

    声明:本文所提供的所有软件均来自于互联网,仅供个人研究和学习使用,请勿用于商业用途,下载后请于24小时内删除,请支持正版! 最近Unity官网下载的旧版本,都无法正常破解.此链接有之前下载的离线安装包 ...

  8. python链接mysql获得某列最大值

    import pymysqlconn = pymysql.connect(host='10.1.2.198', port= 3306 ,user='root',passwd='123456',db=' ...

  9. Sitecore8.2 Tracker.Current is not initialized错误

    这是在访问前端的时候出现的错误...Tracker.Current 未初始化..并没更新修改什么,好端端的这样 而Siatecore后台可以正常访问进入 先查看日志--> 由此我判断可能是Mon ...

  10. WindowsService(Windows服务)开发步骤

    https://www.cnblogs.com/moretry/p/4149489.html