LSTM深度学习的Python预测例子

LSTM,是目前RNN(递归神经网络)中最常用的模型.RNN主要是要解决时间序列的问题,一般的DNN,在inpute资料通常是没有时间性的资料。而RNN透过将隐藏层的输出存在存储器里,当下次输入资料进去时,会同时考虑上一次存在存储器的值进行计算。本文实现利用python进行股票预测的用例。

RNN

LSTM深度学习的Python预测例子

简单的RNN

从一个简单的RNN在学习股价上,我们可以将Pt-1的资料输入,并对Pt股价进行学习,而M1即是将隐藏输出存起来,并且当我们要训练Pt,并且针对Pt + 1进行修正时,会将M1拿出来作考虑,并相加成为Pt + 1的输出。

LSTM

LSTM(Long short-term memory),主要由四个Component组成:Input Gate,Output Gate,Memory Cell以及Forget Gate。

LSTM深度学习的Python预测例子

  • 输入门:当将功能输入时,输入门会去控制是否将这次输入

  • Memory Cell:将计算出的值储存起来,以利下个阶段拿出来使用

  • 输出门:控制是否将这次计算出来的输出

  • 忘记门:是否将记忆清掉(格式),有点重新开始的概念。

其中,“是否”这件事情,是可以透过神经网路进行学习。

接下来我们可以更近一步去看数学表示方式:

LSTM深度学习的Python预测例子

LSTM数学

当输入资料进去可表示为g(z),而输入闸门则使用f(Zi),一般来说激活函数f会使用sigmoid函数,因为要表示开启门的机率。因此会把两个值相乘g (z)f(Zi),就可以得出在输入门开启的机率下,输入的值。接着,Memory cell,就会纪录当下输入值加上前一次输入值并乘上忘门的机率,看是否要遗忘前一次纪录[c'= g(z)f(Zi)+ cf(Zf)]。

LSTM概述

LSTM深度学习的Python预测例子

LSTM流量

所以在整个时间流程下Xt到Xt + 1,在上面流程可以清楚了解整个LSTM运作过程

LSTM模型类型

LSTM有许多种变化,如下图:

一对一,一对多,多对一或多对多

LSTM深度学习的Python预测例子

LSTM不同类型

以下以较常使用的做说明

多对一

输入:序列向量(例:一周股价)

输出:只有一个向量(例如:下周一股价)

使用情境:

1.股价预测:用当周五天股价预测下周一股价

2。情感分析:利用一句话预测为正面请感还是负面情感

多对多

输入:序列向量(例如:一周股价)

输出:序列向量(例如:下周股价)

使用情境:

1.股价预测:用当周五天股价预测下周五天股价

2。翻译:给定一句话,进行翻译,并回覆另一句翻译完的文字

范例:LSTM使用0050股票资料进行预测

标的:0050

资料使用范围:2017/01〜2018/04

LSTM深度学习的Python预测例子

主要会使用收盘价以及交易量进行预测

接下来将介绍一些主要功能:

  • 针对资料进行规范化

def normalize(df):

norm = df.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))

return norm

  • 将资料整理成参考前五天资料,并预测下一天股价(多对一)

def train_windows(df, ref_day=5, predict_day=1):

X_train, Y_train = [], []

for i in range(df.shape[0]-predict_day-ref_day):

X_train.append(np.array(df.iloc[i:i+ref_day,:-1]))

Y_train.append(np.array(df.iloc[i+ref_day:i+ref_day+predict_day]["y"]))

return np.array(X_train), np.array(Y_train)

  • Model参数 主要使用两层LSTM以及两层密集进行预测

def lstm_stock_model(shape):

model = Sequential()

model.add(LSTM(256, input_shape=(shape[1], shape[2]), return_sequences=True))

model.add(LSTM(256, return_sequences=True))

model.add(TimeDistributed(Dense(1)))

model.add(Flatten())

model.add(Dense(5,activation='linear'))

model.add(Dense(1))

model.compile(loss="mean_absolute_error", optimizer="adam",metrics=['mean_absolute_error'])

model.summary()

return model

LSTM深度学习的Python预测例子

Model summary

接下来我们可针对损失图,进行修正,看是否得到理想的培训结果

LSTM深度学习的Python预测例子

loss plot

Training Tips:

  • 在训练RNN时很容易loss会一直跳动,是因为RNN的Error surface问题,因此若自己刻RNN的话,可加入clipping。

  • train RNN时,可以使用sigmoid函数做为激活函数,会比Relu结果更好。

  • 若lstm有overfit的状态下,可尝试使用GRU.GRU为简化版的lstm,并只保留两个gate并两个gate会连动(input gate and forget gate)

相关推荐