LSTM深度学习的Python预测例子
LSTM,是目前RNN(递归神经网络)中最常用的模型.RNN主要是要解决时间序列的问题,一般的DNN,在inpute资料通常是没有时间性的资料。而RNN透过将隐藏层的输出存在存储器里,当下次输入资料进去时,会同时考虑上一次存在存储器的值进行计算。本文实现利用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。
输入门:当将功能输入时,输入门会去控制是否将这次输入
Memory Cell:将计算出的值储存起来,以利下个阶段拿出来使用
输出门:控制是否将这次计算出来的输出
忘记门:是否将记忆清掉(格式),有点重新开始的概念。
其中,“是否”这件事情,是可以透过神经网路进行学习。
接下来我们可以更近一步去看数学表示方式:
当输入资料进去可表示为g(z),而输入闸门则使用f(Zi),一般来说激活函数f会使用sigmoid函数,因为要表示开启门的机率。因此会把两个值相乘g (z)f(Zi),就可以得出在输入门开启的机率下,输入的值。接着,Memory cell,就会纪录当下输入值加上前一次输入值并乘上忘门的机率,看是否要遗忘前一次纪录[c'= g(z)f(Zi)+ cf(Zf)]。
LSTM概述
所以在整个时间流程下Xt到Xt + 1,在上面流程可以清楚了解整个LSTM运作过程
LSTM模型类型
LSTM有许多种变化,如下图:
一对一,一对多,多对一或多对多
以下以较常使用的做说明
多对一
输入:序列向量(例:一周股价)
输出:只有一个向量(例如:下周一股价)
使用情境:
1.股价预测:用当周五天股价预测下周一股价
2。情感分析:利用一句话预测为正面请感还是负面情感
多对多
输入:序列向量(例如:一周股价)
输出:序列向量(例如:下周股价)
使用情境:
1.股价预测:用当周五天股价预测下周五天股价
2。翻译:给定一句话,进行翻译,并回覆另一句翻译完的文字
范例:LSTM使用0050股票资料进行预测
标的:0050
资料使用范围:2017/01〜2018/04
主要会使用收盘价以及交易量进行预测
接下来将介绍一些主要功能:
针对资料进行规范化
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
接下来我们可针对损失图,进行修正,看是否得到理想的培训结果
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)