[Keras] 利用Keras建構LSTM模型,以Stock Prediction 為例 1

PJ Wang
7 min readApr 13, 2018

--

LSTM介紹

機器學習當中最常利用多層感知器(Multi-Layer Perceptron, MLP)來訓練模型,如下圖所示

Multi-layer Perceptron

而利用MLP的方式並非能處理所有問題,因為他沒辦法處理時序性的問題,例如:當輸入為[1, 2, 3] 希望輸出4 ,而當輸入[3, 2, 1] 時希望輸出0 ,對於MLP來說,[1, 2, 3][3, 2, 1] 是相同的,因此無法得到預期的結果。

因此有了遞歸神經網絡(Recurrent Neural Network, RNN)的出現設計如下圖所示。

Recurrent Neural Network

主要概念是將前面輸入得到的權重(Weight)加入下一層,這樣就可以完成時序性的概念。

長短期記憶(Long Short-Term Memory, LSTM)是RNN的一種,而其不相同之處在於有了更多的控制單元input gateoutput gateforget gate 示意圖如下。

瞭解更多:李弘毅 — ML Lecture 21–1: Recurrent Neural Network (Part I)

Stock Prediction為例

SPY dataset: Yahoo SPDR S&P 500 ETF (SPY)

SPY.csv

目標:利用過去的資料預測未來幾天的Adj Close

資料建置

匯入套件

pandasnumpykerasmatplotlib 匯入

讀取資料

read “SPY.csv”
train.head()

Augment Features

除了基本資料提供的Features(Open, High, Low, Close, Adj Close, Volume)以外,還可自己增加Features,例如星期幾、幾月、幾號等等。

Augment Features
After Augment Features

Normalization

將所有資料做正規化,而由於Date 是字串非數字,因此先將它drop

normalization
After Normalization

Build Training Data

輸入X_train: 利用前30天的Open, High, Low, Close, Adj Close, Volume, month, year, date, day作為Features,shape為(30, 10)

輸出Y_train: 利用未來5天的Adj Close作為Features,shape為(5,1)

我們須將資料做位移的展開作為Training Data,如圖(1)所示。

將資料做位移展開,其中N為整份SPY.csv的資料樣本數
Build Training Data

資料亂序

將資料打散,而非照日期排序

shuffle function

Training data & Validation data

將Training Data取一部份當作Validation Data

因此最後將輸出合併為

模型建置

Multiple models

比較many to one以及many to many

Compare with two models

一對一模型

由於是一對一模型,因此return_sequences 也可設為False ,但Y_train 以及Y_val的維度需改為二維(5710,1)以及(634,1)

build one to on model

將過去的天數pastDay設為1,預測的天數futureDay也設為1

training

由下圖可見變數的使用量

model.summary()

最後val_loss: 2.2902e-05 停在第164個Epoch

training output

多對一模型

LSTM參數return_sequences=False ,未設定時default也為False,而且不可使用TimeDistribution

Many to one model

需要設定的有pastDay=30future=1 ,且注意Y_train 的維度需為二維

training

由下圖可見變數的使用量

model.summary()

最後val_loss: 3.9465e-05 停在第113個Epoch

training output

一對多模型

因為是一對多模型Timesteps只有1,因此return_sequences=False 才可執行

build one to many model

pastDay 設為1, futureDay 設為5

training

由下圖可見變數的使用量

model.summary()

最後val_loss: 5.6081e-05 停在第163個Epoch

training output

多對多模型 (輸入與輸出相同長度)

return_sequences 設為True ,再用TimeDistributed(Dense(1)) 將輸出調整為(5,1)

build many to many model

pastDay 以及futureDay 設為相同長度5

training

由下圖可見變數的使用量

model.summary()

最後val_loss: 9.3788e-05 停在第169個Epoch

多對多模型(輸入與輸出不同長度)

參考下一篇文:利用Keras建構LSTM模型,以Stock Prediction 為例2(Sequence to Sequence)

Reference

[1] 李弘毅 — 機器學習 RNN

[2] Keras關於LSTM的units參數,還是不理解?

[3] Many to one and many to many LSTM examples in Keras

[4] Yahoo — SPDR S&P 500 ETF (SPY)

[5] Wiki — 長短期記憶

--

--

PJ Wang

台大資工所碩畢 / 設計思考教練 / 系統思考顧問 / 資料科學家 / 新創 / 科技 + 商業 + 使用者