时间序列预测09:如何开发LSTM实现时间序列预测详解03Multi-stepLSTM

时间序列预测09:如何开发LSTM实现时间序列预测详解03Multi-stepLSTM 【时间序列预测/分类】全系列45篇由浅⼊深的博⽂汇总:
接,本⽂继续讲解如何开发LSTM时间序列预测模型–多步LSTM模型。
之前的⽂章:
【Part1】
【Part2】
⽂章⽬录
3. 多步 LSTM 模型
多步时间序列预测:通过历史数据对未来多个时间步进⾏预测的时间序列预测问题。两种主要的LSTM模型可⽤于多步预测:Vector Output Model
轻钢结构雨棚
Encoder-Decoder Model
3.1 准备数据
与⼀个时间步预测任务⼀样,⽤于多步时间序列预测的序列数据也必须分成具有输⼊和输出分量的样本。输⼊和输出由多个时间步的采样值组成,并且输⼊和预测输出可能具有不同的时间步数。例如,给定单变量时间序列:
[10,20,30,40,50,60,70,80,90]
假设我们通过以往三个时间步的数据来预测接下来两个时间步的数据,那么就可以把单变量时间序列划分为如下的样本:
[102030][4050]
[203040][5060]
[304050][6070]
pam加药
[405060][7080]
[506070][8090]
以上样本⽣成的过程中,滑动窗⼝的窗⼝宽度为3,滑动步长为1,特征数为1,⽣成的样本数为5。
数据准备好之后,接下来重塑样本形状;定义模型,进⾏训练、测试。
3.2 Vector Output Model
与其他类型的神经⽹络模型⼀样,LSTM可以直接输出⼀个可以解释为多步预测的向量。在上⼀篇⽂章中,这种⽅法是将每个输出时间序列的⼀个时间步长作为向量进⾏预测。与单变量LSTM⼀样,再进⾏训练之前,必须重塑样本。顺序模型(Sequential)中,LSTM的第⼀层输⼊要求数据的形状为:[样本、时间步、特征]([samples, timesteps, features]),这⾥的时间步(timesteps)其实就是窗⼝宽度,在我们的⽰例中,特征数为1,使⽤ reshape ⽅法进⾏重塑数据:
n_features =1
X = X.reshape((X.shape[0], X.shape[1], n_features))
训练样本和样本标签的shape分别为:
(5,3,1),(5,2)
中的任何⼀种LSTM都可以使⽤,例如Vanilla、Stacked、Bidirectional、CNN或Conv LSTM模型。此处使⽤Stacked LSTM进⾏演⽰。注意:此处的 n_features = 1 ,因为只有⼀个时间序列并且是根据序
列的之前三个值预测后两个值,这与多输⼊序列的特征数是不同的。⼀定要搞清楚样本、时间步、特征数的定义和相互关系,要不在开发过程中很容易感到困惑。
训练完成之后,在进⾏预测时,单个样本的形状也需要重塑为跟训练数据中单个训练样本相同的shape,在本⽂的⽰例中,尺⼨应该为:[1、3、1]。其中“1”表⽰单个样本,“3”表⽰⼀个样本包含多少个采样点,最后⼀个“1” 表⽰样本中的特征数,因为是单变量预测,所以为1。通过代码实现:
test_seq = array([70,80,90])
test_seq = shape((1, sw_width, n_features))
yhat = model.predict(test_seq, verbose=0)
3.3 Encoder-Decoder Model
专门为预测可变长度输出序列⽽开发的模型称为 编码器-解码器LSTM(Encoder-Decoder LSTM)。该模型是为序列到序列
(seq2seq)的预测问题(即同时有输⼊和输出序列)⽽设计的,seq2seq模型常⽤在⾃然语⾔处理领域,例如语⾔翻译。该模型也可⽤于多步时间序列预测。顾名思义,该模型由两个⼦模型组成:编码器(Encoder)和解码器(Decoder)。
编码器是负责读取和解释输⼊序列的模型。编码器的输出是固定长度的向量,代表模型对序列的解释。传统上,该编码器是Vanilla LSTM 模型,但也可以使⽤其他编码器模型,例如Stacked,Bidirectional和CNN模型。
model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
解码器使⽤编码器的输出作为输⼊。⾸先,编码器的固定长度输出被重复,对于输出序列中的每个所需时间步重复⼀次。
model.add(RepeatVector(n_steps_out))
我们可以使⽤⼀个或多个相同的输出层在输出序列中的每个时间步进⾏预测。这可以通过将模型的输出部分包装在 TimeDistributed() 包装器中来实现。
完整代码:
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
modelpile(optimizer='adam', loss='mse')
有⼏点关于以上API的说明:
1.keras.layers.RepeatVector(n)
n:整数,重复因⼦
输⼊shape:(num_samples, features)
输出shape:(num_samples, n, features)
2.LSTM()的 return_sequences 参数
套管挤压布尔值,设置为 True 返回完整序列;设置为 False 返回输出序列中的最后⼀个输出;
3.4 完整代码电子政务信息平台
在这段时间的学习过程中,遇到了很多疑惑的地⽅,发现很多教程都没有对关键的地⽅做解释,可能是⼤神写的吧…咱也不知道,咱也不敢问,反正对我这样的⼩⽩不友好。
随着理解的加深,也算是对LSTM处理时间序列预测问题有些许领悟和体会了,于是参考Jason的博客,⾃⼰重新梳理总结了⼀遍,将代码中⽐较难理解的地⽅做了注释,⼩⽩应该也能看懂,算是保姆级教程了吧… 数据处理、转化过程、尺⼨变化等信息也打印出来了,结合⽂章内容应该不难理解。
3.4.1 数据处理与模型定义
import numpy as np
from dels import Sequential, Model
from tensorflow.keras.layers import Dense, LSTM, Flatten, Bidirectional
from tensorflow.keras.layers import TimeDistributed,RepeatVector
class MultiStepModels:
'''
多时间步预测时间序列LSTM模型
'''
def__init__(self, train_seq, test_seq, sw_width, pred_length, features, epochs_num, verbose_set, flag=0):
'''
初始化变量和参数
'''
self.sw_width = sw_width
self.pred_length = pred_length
self.features = features
self.epochs_num = epochs_num
self.verbose_set = verbose_set
self.flag = flag
self.X, self.y =[],[]
def split_sequence(self):
'''
该函数实现多输⼊序列数据的样本划分
'''
for i in range(ain_seq)):
# 到最后⼀个元素的索引,因为for循环中i从1开始,切⽚索引从0开始,切⽚区间前闭后开,所以不⽤减去1;
end_index = i + self.sw_width
# 到需要预测指定时间步长的最后⼀个元素的索引;
out_end_index = end_index + self.pred_length
# 如果最后⼀个期望输出最后⼀个元素的索引⼤于序列中最后⼀个元素的索引则丢弃该样本;
# 这⾥len(self.sequence)没有减去1的原因是:保证最后⼀个元素的索引恰好等于序列数据索引时,能够截取到样本;
if out_end_index >ain_seq):
break
# 实现以滑动步长为1(因为是for循环),窗⼝宽度为self.sw_width的滑动步长取值;
seq_x, seq_y = ain_seq[i:end_index], ain_seq[end_index:out_end_index]
self.X.append(seq_x)
self.X, self.y = np.array(self.X), np.array(self.y)
self.X = shape((self.X.shape[0], self.X.shape[1], self.features))
if self.flag ==1:
self.y = shape((shape[0], shape[1], self.features))
else:
pass
for i in range(len(self.X)):
print(self.X[i], self.y[i])
vagooprint('X:\n{}\ny:\n{}\ntest_seq:\n{}\n'.format(self.X, self.y, st_seq))
print('X.shape:{}, y.shape:{}, test_seq.shape:{}\n'.format(self.X.shape, shape, st_seq.shape))
return self.X, self.y, st_seq
def stacked_lstm(self):
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True,
input_shape=(self.sw_width, self.features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(units=self.pred_length))
modelpile(optimizer='adam', loss='mse', metrics=['accuracy'])
print(model.summary())
history = model.fit(self.X, self.y, epochs=self.epochs_num, verbose=self.verbose_set)
print('\ntrain_acc:%s'%np.mean(history.history['accuracy']),'\ntrain_loss:%s'%np.mean(history.history['loss'])) print('yhat:%s'%(model.st_seq)),'\n-----------------------------')
def encoder_decoder_lstm(self):
model = Sequential()
农家乐model.add(LSTM(100, activation='relu',
input_shape=(self.sw_width, self.features)))
model.add(RepeatVector(self.pred_length))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
modelpile(optimizer='adam', loss='mse', metrics=['accuracy'])
print(model.summary())
history = model.fit(self.X, self.y, epochs=self.epochs_num, verbose=self.verbose_set)
print('\ntrain_acc:%s'%np.mean(history.history['accuracy']),'\ntrain_loss:%s'%np.mean(history.history['loss'])) print('yhat:%s'%(model.st_seq)),'\n-----------------------------')
3.4.2 实例化代码
if __name__ =='__main__':
train_seq =[10,20,30,40,50,60,70,80,90]
test_seq = np.array([70,80,90])
sliding_window_width =3
predict_length =2
n_features =1
epochs_num =100
verbose_set =0
print('-------以下为【向量输出 LSTM 模型】相关信息------')
MultiStepLSTM = MultiStepModels(train_seq, test_seq, sliding_window_width, predict_length, n_features,                                      epochs_num, verbose_set)
MultiStepLSTM.split_sequence()
MultiStepLSTM.stacked_lstm()
print('-------以下为【编码器-解码器 LSTM 模型】相关信息------')
MultiStepLSTM = MultiStepModels(train_seq, test_seq, sliding_window_width, predict_length, n_features,                                      epochs_num, verbose_set, flag=1)
MultiStepLSTM.split_sequence()
3.4.3 数据处理过程、训练、测试信息详情
-------以下为【向量输出 LSTM 模型】相关信息------
[[10]
[20]
[30]][4050]
[[20]
[30]
[40]][5060]
[[30]
[40]
[50]][6070]
[[40]
[50]
[60]][7080]
[[50]
[60]
[70]][8090]
X:
[[[10]
[20]
[30]]
[[20]
[30]
[40]]
[[30]
[40]
[50]]
[[40]
[50]
[60]]
[[50]
[60]
[70]]]
y:
[[4050]

本文发布于:2024-09-22 03:30:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/216573.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:序列   时间   预测   模型   输出   样本
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议