RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)時(shí)間序列長(zhǎng)期利率預(yù)測(cè)|附代碼數(shù)據(jù)
全文鏈接:http://tecdat.cn/?p=25133
最近我們被客戶要求撰寫關(guān)于神經(jīng)網(wǎng)絡(luò)的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
2017 年年中,R 推出了 Keras 包?_,_這是一個(gè)在 Tensorflow 之上運(yùn)行的綜合庫,具有 CPU 和 GPU 功能
本文將演示如何在 R 中使用 LSTM 實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)。
簡(jiǎn)單的介紹
時(shí)間序列涉及按時(shí)間順序收集的數(shù)據(jù)。我用 xt∈R 表示單變量數(shù)據(jù),其中 t∈T 是觀察數(shù)據(jù)時(shí)的時(shí)間索引。時(shí)間 t 在 T=Z 的情況下可以是離散的,或者在 T=R 的情況下是連續(xù)的。為簡(jiǎn)化分析,我們將僅考慮離散時(shí)間序列。
長(zhǎng)短期記憶 (LSTM) 網(wǎng)絡(luò)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò) (RNN),能夠?qū)W習(xí)長(zhǎng)期依賴關(guān)系。在常規(guī)的 RNN 中,小權(quán)重通過幾個(gè)時(shí)間步一遍又一遍地相乘,并且梯度逐漸減小到零——這種情況稱為梯度消失問題。
LSTM 網(wǎng)絡(luò)通常由通過層連接的內(nèi)存塊(稱為單元)組成。單元中的信息同時(shí)包含在單元狀態(tài) Ct 和隱藏狀態(tài) ht 中,并由稱為門的機(jī)制通過?sigmoid?和?tanh?激活函數(shù)進(jìn)行調(diào)節(jié)。
sigmoid 函數(shù)/層輸出 0 到 1 之間的數(shù)字,其中 0 表示?沒有通過?, 1 表示?全部通過。因此,LSTM 能夠有條件地從單元狀態(tài)中添加或刪除信息。
一般來說,門將前一時(shí)間步 ht-1 和當(dāng)前輸入 xt 的隱藏狀態(tài)作為輸入,并將它們逐點(diǎn)乘以權(quán)重矩陣 W,并將偏差 b 添加到乘積中。
三個(gè)主要門:
遺忘門:
這決定了哪些信息將從單元狀態(tài)中刪除。
輸出是一個(gè)介于 0 和 1 之間的數(shù)字,0 表示?全部刪除?,1 表示?全部記住
更新門:
在這一步中,??tahn?激活層創(chuàng)建一個(gè)潛在候選向量,如下所示:
sigmoid 層創(chuàng)建一個(gè)更新過濾器,如下所示:
接下來,舊單元狀態(tài) Ct-1 更新如下:
輸出門:
在這一步中,sigmoid 層過濾將要輸出的單元狀態(tài)。
然后將單元狀態(tài) Ct 通過?tanh?函數(shù)將值標(biāo)準(zhǔn)化到范圍 [-1, 1]。
最后,標(biāo)準(zhǔn)化后的單元格狀態(tài)乘以過濾后的輸出,得到隱藏狀態(tài) ht 并傳遞給下一個(gè)單元格:
加載必要的庫和數(shù)據(jù)集
#?加載必要的包library(keras)
或者安裝如下:
#?然后按如下方式安裝 TensorFlow :install_keras()
我們將使用可用的長(zhǎng)期利率數(shù)據(jù)?,這是從 2007 年 1 月到 2018 年 3 月的月度數(shù)據(jù)。
前五個(gè)觀察樣本
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
R語言KERAS用RNN、雙向RNNS遞歸神經(jīng)網(wǎng)絡(luò)、LSTM分析預(yù)測(cè)溫度時(shí)間序列、 IMDB電影評(píng)分情感
左右滑動(dòng)查看更多
01
02
03
04
數(shù)據(jù)準(zhǔn)備
將數(shù)據(jù)轉(zhuǎn)換為平穩(wěn)數(shù)據(jù)
這是通過獲取系列中兩個(gè)連續(xù)值之間的差異來完成的。這種轉(zhuǎn)換(通常稱為差分)會(huì)刪除數(shù)據(jù)中與時(shí)間相關(guān)的成分。此外,使用差分而不是原始值更容易建模,并且生成的模型具有更高的預(yù)測(cè)能力。
#將數(shù)據(jù)轉(zhuǎn)換為平穩(wěn)性did?=?diff
head
滯后數(shù)據(jù)集
LSTM 期望數(shù)據(jù)處于監(jiān)督學(xué)習(xí)模式。也就是說,有一個(gè)目標(biāo)變量 Y 和預(yù)測(cè)變量 X。為了實(shí)現(xiàn)這一點(diǎn),我們通過滯后序列來變換序列,并將時(shí)間 (t?k)的值作為輸入,將時(shí)間 t 的值作為輸出,用于 k 步滯后數(shù)據(jù)集。
sps=?laorm
head(sps)
將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集
與大多數(shù)分析中訓(xùn)練和測(cè)試數(shù)據(jù)集是隨機(jī)抽樣的不同,對(duì)于時(shí)間序列數(shù)據(jù),觀察的順序確實(shí)很重要。以下代碼將系列的?前?70% 作為訓(xùn)練集,其余 30% 作為測(cè)試集。
##?分成訓(xùn)練集和測(cè)試集N?=?nrown?=?roundtran?=?sud[1:n,?]tt??=?sud[(n+1):N,??]
標(biāo)準(zhǔn)化數(shù)據(jù)
就像在任何其他神經(jīng)網(wǎng)絡(luò)模型中一樣,我們將輸入數(shù)據(jù) X 重新標(biāo)準(zhǔn)化到激活函數(shù)的范圍。如前所述,LSTM 的默認(rèn)激活函數(shù)是 sigmoid 函數(shù),其范圍為 [-1, 1]。下面的代碼將有助于這種轉(zhuǎn)換。請(qǐng)注意,訓(xùn)練數(shù)據(jù)集的最小值和最大值是用于標(biāo)準(zhǔn)化訓(xùn)練和測(cè)試數(shù)據(jù)集以及預(yù)測(cè)值的標(biāo)準(zhǔn)化系數(shù)。這確保了測(cè)試數(shù)據(jù)的最小值和最大值不會(huì)影響模型。
##?標(biāo)準(zhǔn)化數(shù)據(jù)Sad?=?scaa(trin,?et,?c(-1,?1))y_in?=?Sed$slrn[,?2]x_tn?=?Scd$sldin[,?1]y_st?=?Sald$sleet[,?2]x_st?=?Saed$sett[,?1]
將需要以下代碼將預(yù)測(cè)值恢復(fù)為原始比例。
##?逆變換invtg?=?function(sle,?slr,?fue?=?c(0,?1))
定義
定義模型
我們?cè)O(shè)置參數(shù)?stateful?= TRUE 以便在處理一批樣本后獲得的內(nèi)部狀態(tài)被重新用作下一批樣本的初始狀態(tài)。由于網(wǎng)絡(luò)是有狀態(tài)的,我們必須從當(dāng)前 [?samples?,??features ] 中以 [?samples?,??timesteps?,??features?]形式的 3 維數(shù)組提供輸入批次,其中:
樣本:每批中的觀察數(shù),也稱為批大小。
時(shí)間步長(zhǎng):給定觀察的單獨(dú)時(shí)間步長(zhǎng)。在此示例中,時(shí)間步長(zhǎng) = 1
特征:對(duì)于單變量情況,如本例所示,特征 = 1
批量大小必須是訓(xùn)練樣本和測(cè)試樣本大小的共同因素??梢哉业?LSTM 輸入的一個(gè)很好的解釋
#?將輸入重塑為?3-維#?指定所需的參數(shù)bahse?=?1?#?必須是訓(xùn)練樣本和測(cè)試樣本的公因子ni?=?1?#?可以調(diào)整這個(gè),在模型調(diào)整階段#====================keras_model_sequential
layer_lstm%>%
???layer_dense
編譯模型
在這里,我將?mean_squared_error_指定?為損失函數(shù),將_自適應(yīng)_矩_估計(jì)?_Adam_指定為優(yōu)化算法,并在每次更新時(shí)指定學(xué)習(xí)率和學(xué)習(xí)率衰減。最后,我使用?準(zhǔn)確性?作為評(píng)估模型性能的指標(biāo)。
compile(
??optimizer?=?optimizer_adam
)
模型匯總
summary
擬合模型
我們?cè)O(shè)置參數(shù)?shuffle??= FALSE 以避免打亂訓(xùn)練集并保持 xi 和 xi+t 之間的依賴關(guān)系。LSTM 還需要在每個(gè) epoch 之后重置網(wǎng)絡(luò)狀態(tài)。為了實(shí)現(xiàn)這一點(diǎn),我們?cè)?epoch 上運(yùn)行一個(gè)循環(huán),在每個(gè) epoch 中我們擬合模型并通過參數(shù)?_reset_states()_重置狀態(tài)。
for(i?in?1:phs?){
??model?%>%?fit
??model?%>%?reset_states
}
作出預(yù)測(cè)
for(i?in?1:L){
??????#?逆標(biāo)準(zhǔn)化??????yhat?=?invert_scaling
??????#?逆差分??????yhat?=?yhat?+?Sis[(n+i)]
?????
}
繪制值
本文摘選?《?R 語言用RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)時(shí)間序列長(zhǎng)期利率預(yù)測(cè)?》?,點(diǎn)擊“閱讀原文”獲取全文完整資料。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
結(jié)合新冠疫情COVID-19股票價(jià)格預(yù)測(cè):ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時(shí)間序列分析
深度學(xué)習(xí):Keras使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類分析新聞組數(shù)據(jù)
用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測(cè)銀行客戶流失模型
PYTHON用LSTM長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)的參數(shù)優(yōu)化方法預(yù)測(cè)時(shí)間序列洗發(fā)水銷售數(shù)據(jù)
Python用Keras神經(jīng)網(wǎng)絡(luò)序列模型回歸擬合預(yù)測(cè)、準(zhǔn)確度檢查和結(jié)果可視化
Python用LSTM長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)對(duì)不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測(cè)分析
R語言中的神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)時(shí)間序列:多層感知器(MLP)和極限學(xué)習(xí)機(jī)(ELM)數(shù)據(jù)分析報(bào)告
R語言深度學(xué)習(xí):用keras神經(jīng)網(wǎng)絡(luò)回歸模型預(yù)測(cè)時(shí)間序列數(shù)據(jù)
Matlab用深度學(xué)習(xí)長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對(duì)文本數(shù)據(jù)進(jìn)行分類
R語言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識(shí)別手寫數(shù)字圖像數(shù)據(jù)(MNIST)
MATLAB中用BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)人體脂肪百分比數(shù)據(jù)
Python中用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測(cè)銀行客戶流失模型
R語言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
SAS使用鳶尾花(iris)數(shù)據(jù)集訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)(ANN)模型
【視頻】R語言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
Python使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類
R語言用神經(jīng)網(wǎng)絡(luò)改進(jìn)Nelson-Siegel模型擬合收益率曲線分析
R語言基于遞歸神經(jīng)網(wǎng)絡(luò)RNN的溫度時(shí)間序列預(yù)測(cè)
R語言神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)車輛數(shù)量時(shí)間序列
R語言中的BP神經(jīng)網(wǎng)絡(luò)模型分析學(xué)生成績(jī)
matlab使用長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對(duì)序列數(shù)據(jù)進(jìn)行分類
R語言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)和結(jié)果可視化
用R語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè)
python用于NLP的seq2seq模型實(shí)例:用Keras實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯
用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類