如何将时间序列预测转换为监督学习问题 您所在的位置:网站首页 cols函数是什么意思 如何将时间序列预测转换为监督学习问题

如何将时间序列预测转换为监督学习问题

2024-06-19 11:57| 来源: 网络整理| 查看: 265

时间序列转化为监督学习 1、时间序列与监督学习2、利用Pandas的shift()函数3、series_to_supervised() 功能4、单变量时间序列5、多变量时间序列6、总结

时间序列预测可以被认为是监督学习问题。只需要对数据进行转换,重新构建时间序列数据,使其转变为监督学习即可。

1、时间序列与监督学习

时间序列是按时间索引排序的数字序列,可视为有序值的列表或列。比如下面这个例子:

0 1 2 3 4 5 6 7 8 9 #时间序列

监督学习是具有输入变量(X)和输出变量(Y)的的问题,并且可以使用算法来学习x到y的映射函数y = f(x)。算法的目标是很好地近似真实的映射关系,以便有新的输入数据 (X) 时,可以预测该数据的输出变量 (y)。

X 1 2 3 4 5 6 7 8 #监督学习 y 2 3 4 5 6 7 8 9 2、利用Pandas的shift()函数

Pandas中的shift()函数可以有效的将一个时间序列问题转换为监督学习问题。

我们可以将模拟时间序列数据集定义为 10 个数字序列,在这种情况下,DataFrame 中的单个列如下所示:

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

输出结果: ``在这里插入图片描述 将序列向前移动一个时间步,便可以得到一个监督学习问题。如下所示:

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),即输入值 0可用于预测输出值1,输入1可以预测2,以此类推(由于 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)

在这里插入图片描述

3、series_to_supervised() 功能

定义一个名为series_to_supervised()的函数,该函数采用单变量或多变量时间序列。这个函数的参数解释如下: data: 列表或 2D NumPy 数组的观测值序列,也就是需要转换为监督学习的时间序列数据。必填。 n_in: 作为输入的滞后观测值数 (X)。值可能介于 1到len(data)之间。默认值为 1。 n_out: 作为输出的观测值数 (y)。值可能介于0到len(data) 之间。默认值为 1。 dropnan: 布尔型,是否删除具有 NaN 值的行,默认值为 True。 函数返回单个值: return: 转换后的监督学习数据。 其中data和return很好理解。对于n_in和n_out通俗点说,n_in表示用过去几个时间步的数据来进行预测,拿最开始的例子,我们对一个简单的0,1,2,3,4,5,6,7,8,9时间序列,可以用0预测1,这时n_in就是1,也可以用[0,1]来预测2,这时n_in就是2,同理[0,1,2]来预测3,这时n_in就是3。 对于n_out如果用0预测1,那么n_out就是1,如果用0预测1以及第二步的2,那么n_out就是2。如果还不明白的话可以看下面的代码的运行结果,自行体会。

def series_to_supervised(data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] df = pd.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 = pd.concat(cols, axis=1) agg.columns = names # drop rows with NaN values if dropnan: agg.dropna(inplace=True) return agg 4、单变量时间序列

调用这个函数看看结果

values = [x for x in range(10)] data = series_to_supervised(values) print(data)

在这里插入图片描述 我们可以看到观测值名为"var1",输入观测值被命名为 var1(t-1), 输出时间步子名为var1(t)。并且具有 NaN 值的行已从 DataFrame 中自动删除。我们可以用任意数字长度输入序列()重复此示例。这可以通过指定输入序列的长度作为参数来完成;例如:

values = [x for x in range(10)] data = series_to_supervised(values,3) print(data)

在这里插入图片描述

5、多变量时间序列

当然也可以多变量预测,即多变量时间序列。在多变量时间序列中,我们可能对多种不同的度量值有观察,并且有兴趣预测其中一种或多种。例如在一个PM2.5预测问题中,我们的时间序列不仅包括PM2.5浓度,还包括温度,风速等时间序列,我们希望通过PM2.5浓度、温度、风速等的时间序列数据来预测未来一段时间的PM2.5浓度。这就是一个多变量时间序列。

raw = DataFrame() raw['PM2.5'] = [x for x in range(10)] raw['TEM'] = [x for x in range(50, 60)] raw['SO2'] = [x for x in range(60, 70)] values = raw.values data = series_to_supervised(values) print(data)

在这里插入图片描述

6、总结

通过本教程可以学到: 如何开发将时间序列数据集转换为监督学习数据集的函数。 如何转换机器学习的单变量时间序列数据。 如何转换机器学习的多变量时间序列数据。 多练习多体会,眼睛会不等于手会。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有