相关文章推荐
空虚的梨子  ·  Sazenka in ...·  1 年前    · 
讲道义的闹钟  ·  爱奇艺《亚洲新声》首发阵容官宣,张靓颖&Je ...·  1 年前    · 
大力的眼镜  ·  这个女孩真漂亮 - 下拉式漫画 - 腾讯动漫·  1 年前    · 
成熟的花卷  ·  云南住房和城乡建设这十年_云南省住房和城乡建设厅·  1 年前    · 
寂寞的松树  ·  36岁张俪旧照被扒疑似整容,皮肤黝黑单眼皮, ...·  2 年前    · 
Code  ›  使用 LSTM 进行多变量时间序列预测的保姆级教程开发者社区
lstm 时间序列
https://cloud.tencent.com/developer/article/1950446
傲视众生的熊猫
3 年前
作者头像
数据派THU
0 篇文章

使用 LSTM 进行多变量时间序列预测的保姆级教程

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 数据派THU > 使用 LSTM 进行多变量时间序列预测的保姆级教程

使用 LSTM 进行多变量时间序列预测的保姆级教程

作者头像
数据派THU
发布 于 2022-03-04 11:04:57
1K 0
发布 于 2022-03-04 11:04:57
举报
来源:DeepHub IMBA本文约3800字,建议阅读10分钟本文中我们将使用深度学习方法 (LSTM) 执行多元时间序列预测。

使用 LSTM 进行端到端时间序列预测的完整代码和详细解释。

我们先来了解两个主题:

  • 什么是时间序列分析?
  • 什么是 LSTM?

时间序列分析: 时间序列表示基于时间顺序的一系列数据。它可以是秒、分钟、小时、天、周、月、年。未来的数据将取决于它以前的值。

在现实世界的案例中,我们主要有两种类型的时间序列分析:

  • 单变量时间序列
  • 多元时间序列

对于单变量时间序列数据,我们将使用单列进行预测。

正如我们所见,只有一列,因此即将到来的未来值将仅取决于它之前的值。

但是在多元时间序列数据的情况下,将有不同类型的特征值并且目标数据将依赖于这些特征。

正如在图片中看到的,在多元变量中将有多个列来对目标值进行预测。(上图中“count”为目标值)

在上面的数据中,count不仅取决于它以前的值,还取决于其他特征。因此,要预测即将到来的count值,我们必须考虑包括目标列在内的所有列来对目标值进行预测。

在执行多元时间序列分析时必须记住一件事,我们需要使用多个特征预测当前的目标,让我们通过一个例子来理解:

在训练时,如果我们使用 5 列 [feature1, feature2, feature3, feature4, target] 来训练模型,我们需要为即将到来的预测日提供 4 列 [feature1, feature2, feature3, feature4]。

LSTM

本文中不打算详细讨论LSTM。所以只提供一些简单的描述,如果你对LSTM没有太多的了解,可以参考我们以前发布的文章。

LSTM基本上是一个循环神经网络,能够处理长期依赖关系。

假设你在看一部电影。所以当电影中发生任何情况时,你都已经知道之前发生了什么,并且可以理解因为过去发生的事情所以才会有新的情况发生。RNN也是以同样的方式工作,它们记住过去的信息并使用它来处理当前的输入。RNN的问题是,由于渐变消失,它们不能记住长期依赖关系。因此为了避免长期依赖问题设计了lstm。

现在我们讨论了时间序列预测和LSTM理论部分。让我们开始编码。

让我们首先导入进行预测所需的库:

import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import LSTMfrom tensorflow.keras.layers import Dense, Dropoutfrom sklearn.preprocessing import MinMaxScalerfrom keras.wrappers.scikit_learn import KerasRegressorfrom sklearn.model_selection import GridSearchCV

加载数据,并检查输出:

df=pd.read_csv("train.csv",parse_dates=["Date"],index_col=[0])df.head()
df.tail()

现在让我们花点时间看看数据:csv文件中包含了谷歌从2001-01-25到2021-09-29的股票数据,数据是按照天数频率的。

[如果您愿意,您可以将频率转换为“B”[工作日]或“D”,因为我们不会使用日期,我只是保持它的现状。]

这里我们试图预测“Open”列的未来值,因此“Open”是这里的目标列。

让我们看一下数据的形状:

df.shape(5203,5)

现在让我们进行训练测试拆分。这里我们不能打乱数据,因为在时间序列中必须是顺序的。

test_split=round(len(df)*0.20)df_for_training=df[:-1041]df_for_testing=df[-1041:]print(df_for_training.shape)print(df_for_testing.shape)
(4162, 5)(1041, 5)

可以注意到数据范围非常大,并且它们没有在相同的范围内缩放,因此为了避免预测错误,让我们先使用MinMaxScaler缩放数据。(也可以使用StandardScaler)

scaler = MinMaxScaler(feature_range=(0,1))df_for_training_scaled = scaler.fit_transform(df_for_training)df_for_testing_scaled=scaler.transform(df_for_testing)df_for_training_scaled

将数据拆分为X和Y,这是最重要的部分,正确阅读每一个步骤。

def createXY(dataset,n_past):  dataX = []  dataY = []  for i in range(n_past, len(dataset)):          dataX.append(dataset[i - n_past:i, 0:dataset.shape[1]])          dataY.append(dataset[i,0])  return np.array(dataX),np.array(dataY)
trainX,trainY=createXY(df_for_training_scaled,30)testX,testY=createXY(df_for_testing_scaled,30)

让我们看看上面的代码中做了什么:

N_past是我们在预测下一个目标值时将在过去查看的步骤数。

这里使用30,意味着将使用过去的30个值(包括目标列在内的所有特性)来预测第31个目标值。

因此,在trainX中我们会有所有的特征值,而在trainY中我们只有目标值。

让我们分解for循环的每一部分:

对于训练,dataset = df_for_training_scaled, n_past=30当i= 30:

data_X.addend (df_for_training_scaled[i - n_past:i, 0:df_for_training.shape[1]])

从n_past开始的范围是30,所以第一次数据范围将是-[30 - 30,30,0:5] 相当于 [0:30,0:5]

因此在dataX列表中,df_for_training_scaled[0:30,0:5]数组将第一次出现。

现在, dataY.append(df_for_training_scaled[i,0])

i = 30,所以它将只取第30行开始的open(因为在预测中,我们只需要open列,所以列范围仅为0,表示open列)。

第一次在dataY列表中存储df_for_training_scaled[30,0]值。

所以包含5列的前30行存储在dataX中,只有open列的第31行存储在dataY中。然后我们将dataX和dataY列表转换为数组,它们以数组格式在LSTM中进行训练。

我们来看看形状。

print("trainX Shape-- ",trainX.shape)print("trainY Shape-- ",trainY.shape)
(4132, 30, 5)(4132,)
print("testX Shape-- ",testX.shape)print("testY Shape-- ",testY.shape)
(1011, 30, 5)(1011,)

4132 是 trainX 中可用的数组总数,每个数组共有 30 行和 5 列, 在每个数组的 trainY 中,我们都有下一个目标值来训练模型。

让我们看一下包含来自 trainX 的 (30,5) 数据的数组之一 和 trainX 数组的 trainY 值:

print("trainX[0]-- \n",trainX[0])print("trainY[0]-- ",trainY[0])

如果查看 trainX[1] 值,会发现到它与 trainX[0] 中的数据相同(第一列除外),因为我们将看到前 30 个来预测第 31 列,在第一次预测之后它会自动移动 到第 2 列并取下一个 30 值来预测下一个目标值。

让我们用一种简单的格式来解释这一切:

trainX — — →trainY
[0 : 30,0:5] → [30,0]
 
推荐文章
空虚的梨子  ·  Sazenka in Azabujuban, Tokyo - Chinese | JPNEAZY - Reservation
1 年前
讲道义的闹钟  ·  爱奇艺《亚洲新声》首发阵容官宣,张靓颖&Jessie J携音浪出海席卷亚洲_腾讯新闻
1 年前
大力的眼镜  ·  这个女孩真漂亮 - 下拉式漫画 - 腾讯动漫
1 年前
成熟的花卷  ·  云南住房和城乡建设这十年_云南省住房和城乡建设厅
1 年前
寂寞的松树  ·  36岁张俪旧照被扒疑似整容,皮肤黝黑单眼皮,和现在判若两人_腾讯新闻
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号