查看来源:https://medium.com/@daniel820710/%E5%88%A9%E7%94%A8keras%E5%BB%BA%E6%A7%8Blstm%E6%A8%A1%E5%9E%8B-%E4%BB%A5stock-prediction-%E7%82%BA%E4%BE%8B-1-67456e0a0b

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 匯入

讀取資料

train.head()

Augment Features

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

Normalization

將所有資料做正規化,而由於Date 是字串非數字,因此先將它drop
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的資料樣本數

資料亂序

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

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) 。 將過去的天數pastDay設為1,預測的天數futureDay也設為1 由下圖可見變數的使用量
model.summary()
最後val_loss: 2.2902e-05 停在第164個Epoch
training output

多對一模型

LSTM參數return_sequences=False ,未設定時default也為False,而且不可使用TimeDistribution 需要設定的有pastDay=30future=1 ,且注意Y_train 的維度需為二維 由下圖可見變數的使用量
model.summary()
最後val_loss: 3.9465e-05 停在第113個Epoch
training output

一對多模型

因為是一對多模型Timesteps只有1,因此return_sequences=False 才可執行 pastDay 設為1, futureDay 設為5 由下圖可見變數的使用量
model.summary()
最後val_loss: 5.6081e-05 停在第163個Epoch
training output

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

return_sequences 設為True ,再用TimeDistributed(Dense(1)) 將輸出調整為(5,1) pastDay 以及futureDay 設為相同長度5 由下圖可見變數的使用量
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 — 長短期記憶

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 × 4 =

Protected with IP Blacklist CloudIP Blacklist Cloud