适合多输入变量的神经网络模型一直让开发人员很头痛,但基于(LSTM)的循环神经网络能够几乎可以完美的解决多个输入变量的问题。基于(LSTM)的循环神经网络可以很好的利用在时间序列预测上,
长短期记忆循环神经网络等几乎可以完美地模拟多个输入变量的问题,这为时间序列预测带来极大益处。本文介绍了如何l x t ^ C 在 Keras 深度学习库中搭建用于多变量时间序列预测的 LSTM 模型。
因为市场总是会出现黑天鹅事件,比如股, a 7 c 6灾,这种~ T ! $ Q c ] 9 9不符合规律的事件是很难预测的,本文仅适用学习人工智能技术练习,“当你进入股市后,趋势就变化了”。
Keras是一个高度封装的神经网络框架,提供参数化的API,Keras由纯Python编写而成并基Tens$ Y @ _ ~ b 5 , vorflow、Theano以g j ] f ?及CNTK后端。Keras 为支持快速实验而生,能够把你的idea& . C E U 9 | m迅速转换为结果。
关于LSTM
LSTM算法的全称是长短期记忆J i y $网络(long sh_ ^ nort-term memory),由于LSTM算法基于RNN算法改进而来的,) N t f }一种特殊的RNN网络,规H H F避了标准9 M O ; JRNN中梯度爆炸和梯度消失的问题,而且该网络设计出来是为了解决长依赖问题。该网络由 Hochreiter &am# h S K / Bp; Schmidhuber (1997)引入,并有许多人对其进行了改进和普及。他们的工作被用来解决了各种各样的问题,直到目前还被广泛a X i / 8 { _ D应用。
多层LSTM只是将单个cell进行堆叠。LSTM模型为7 ; d x s ; $ = `什么比CNN难理解呢?因为它把神经元的数量都藏到cell里面Y y 6 r S。通过对比CNN,看上面的图是不是有点感觉呢?一个cell其实就是一层神经元,只8 v T是LSTM和CNN不同的是,它的. U X - ; h ^ $ x每一层t时刻的输出和t-1时刻的7 Y # T U _ % F y状态有关。也就是说当前cell的输出ht不仅仅影响到下一cell(图中右边的那列),还影响本cell下一时刻的状态和输出(图中按时间顺序堆叠的三个绿色的cell)。
理解到这一点了,我们也自然地理解到,xt可以是多维的。然后每个cell的hidden_size都可以进行设置。
数据源来自 这里 。
LSTM多变量时间序列股票预测
\'\'\'
CrA [ 1 s ) ^eated on 2020年4月5日
@autho8 Y 2 l t j g Fr: xiaoyw
\'\'\'
import numpy as np
import matplotlib.pyplot as? H y , # j C plt
import pang b 7 Udas as pd
from sklearn.preprocessing import MinMaxScaler
from kera5 Z Es.models import Sequential #Sequential 用于初始化神经网1 V &络
from keras.layers import Dense #Dense 用于添加全连接的神经网络层
from keras- F Y 3 z n.layers import LSTM #% O X k ^ K SLSTM 用于添加长短期内存层
from keras.layers import Dropout #Dropd X * B 3 nout_ 2 K 9 用于添加防止过拟合的dropout层
#构建训练数据
def train_data():
dI h 6 : $ Cataset_train = pd.reO a g # .ad_csv(\'NW N r p hSE-TATAGLOBAL.csv\')
training_set = dat1 C | Jaset_train.iloc[:, 1:7].values
dataset_train.head()
sc = MinMaxScalerI x @ t B(featur- 9 J me_range = (0, 1)o o J v 4)
training_set_scaled = sc.fit_transform(training_set)
X_train = []
y_train = []
for i in r$ O m b Q I fangS ; z s ie(60, 2035)= ) & c l / C:
X_train.append(training_set_E F ; a I Yscaled[i-60:i, :])
y_train.a6 E T P ! 0ppend(training_set_scaled[i, :])
X( 3 x T F ) , a !_train, y_train = np.array(X_train), np.array(y_train)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 6))
return X_train,y_trainL ] 2 @ e ] . $,dataset_train,sa A x & / D ^c
#构建测试数据
def test_data(dataset_& ! $train,sc):
dataset_test = pd.read_csv(\'tatatest.csv\')
real_stock_price = dataset_test.i7 4 / O u ( nloc[:, 1:2].values
#合并训练集和测试集
dataset_total =@ l C # } u R N pd.concat((dataset_train, dataset_test), axis = 0)
db_all = dataset_total.iloc[:, 1:7].values
inputs = db_all[len(dataset_total) - len(dataset_test) - 60:]
inputs = inputs.reshape(-1,6)
input` 4 C z Ss = sc.transform(inputs)
X_test = []
for i in range= f -(60, 76):
X_test.append(inputs[i` W v N z Z 0-60:i, :])
#X_test.append(inputs[i-60:i, 0])
X_test = np, ` e 7 *.array(X_test)
X_test = np.reshape(X* y |_test, (X_test.shape[0], X_test.shape[1], 6))
return X_test,real) / a 8 U 3 7_stock_price
#创建股票预测模型
def stock_model(X_train, y_train):
regressor = Sequential()
#LSTM的输入为 [samples, timesteps, features],这里的timesteps为步N + k 6 A I G _ O数,features为维度 这里我们的数据是6维的
regressor.add(LSTM(units = 50, return7 f @ d J C 0 9 V_sequences =% { ; y h V 5 h Trueq N Z X, i= _ ^nput_sI 8 C - - b r R 2hape = (X_train.shape[1], 6)))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequenceC 9 b # T *s = True))
regressor.add(Dc S f Aropout(0.2))} N F b q I
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
#y T c N & 7 %全连接,输出6个
regressor.add(Dense(s X b W / f Cunits = 6))
regressor.compil- J 6 . M Le(optimizer = \'adam\', loss = \'mean_squared_{ C I G Berror\')
regressor.fit(X_train, y_train, epoa n 4 ` |chs = 100, batch_size = 32)
return regressor
def main():
X_train, y_train,dataset_train,sc = train_data()
regressor = stock_model(X_train, y_train)
X_test,real_stock_prix V 4 uce =G 2 } C j g 4 test_data(dataset_train,sc)
predicted_stock_price = regressor.predict(X_test)
predictO _ g 1 + u , { ged_stock_price = sc.inverse_transform(predicted_stoM u g ; k u U 6ck_price); Q $ Z x 6 1
plt.plot8 % F b } v h Y(real_stock_price, color = h f Q Z R H\'black\', label = \'TATA Stock Price\')
#显示开盘价
plt.plot(predicted_stock_pric4 X # me[:,0], color = \'green\', label = \'Predicted TATA Stock Price\')
plt.title(\'TATA Stock Price Prediction\')
plt.xlabel(\'Time\')
plt.ylabel(\'TATA Stock Price\')
plt.legy w Z f } :end()
plt.show()
if __name__ == \'_I w J c f T D __main__\':
main()
参考源代码为单变量(开盘价)预测,效果如下左侧图所示,改造成本文代码,为多变量输入并且多维* { g h P 5度输出,预测效果(取开盘价)如下右侧图所示。