拓端tecdat|R語言用RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長短期記憶網(wǎng)絡(luò)實現(xiàn)時間序列長期利率預測
原文鏈接:http://tecdat.cn/?p=25133
原文出處:拓端數(shù)據(jù)部落公眾號
2017 年年中,R 推出了?Keras?包?,這是一個在 Tensorflow 之上運行的綜合庫,具有 CPU 和 GPU 功能。本文將演示如何在 R 中使用?LSTM?實現(xiàn)時間序列預測。
簡單的介紹
時間序列涉及按時間順序收集的數(shù)據(jù)。我用 xt∈R 表示單變量數(shù)據(jù),其中 t∈T 是觀察數(shù)據(jù)時的時間索引。時間 t 在 T=Z 的情況下可以是離散的,或者在 T=R 的情況下是連續(xù)的。為簡化分析,我們將僅考慮離散時間序列。
長短期記憶 (LSTM) 網(wǎng)絡(luò)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)?(RNN),能夠?qū)W習長期依賴關(guān)系。在常規(guī)的 RNN 中,小權(quán)重通過幾個時間步一遍又一遍地相乘,并且梯度逐漸減小到零——這種情況稱為梯度消失問題。
LSTM 網(wǎng)絡(luò)通常由通過層連接的內(nèi)存塊(稱為單元)組成。單元中的信息同時包含在單元狀態(tài) Ct 和隱藏狀態(tài) ht 中,并由稱為門的機制通過?sigmoid?和?tanh?激活函數(shù)進行調(diào)節(jié)。
sigmoid 函數(shù)/層輸出 0 到 1 之間的數(shù)字,其中 0 表示?沒有通過?, 1 表示?全部通過。因此,LSTM 能夠有條件地從單元狀態(tài)中添加或刪除信息。
一般來說,門將前一時間步 ht-1 和當前輸入 xt 的隱藏狀態(tài)作為輸入,并將它們逐點乘以權(quán)重矩陣 W,并將偏差 b 添加到乘積中。
三個主要門:
遺忘門:
這決定了哪些信息將從單元狀態(tài)中刪除。
輸出是一個介于 0 和 1 之間的數(shù)字,0 表示?全部刪除?,1 表示?全部記住

更新門:
在這一步中,??tahn?激活層創(chuàng)建一個潛在候選向量,如下所示:

sigmoid 層創(chuàng)建一個更新過濾器,如下所示:

接下來,舊單元狀態(tài) Ct-1 更新如下:

輸出門:
在這一步中,sigmoid 層過濾將要輸出的單元狀態(tài)。

然后將單元狀態(tài) Ct 通過?tanh?函數(shù)將值標準化到范圍 [-1, 1]。
最后,標準化后的單元格狀態(tài)乘以過濾后的輸出,得到隱藏狀態(tài) ht 并傳遞給下一個單元格:
加載必要的庫和數(shù)據(jù)集
# 加載必要的包
library(keras)
或者安裝如下:
# 然后按如下方式安裝 TensorFlow :
install_keras()
我們將使用可用的長期利率數(shù)據(jù)?,這是從 2007 年 1 月到 2018 年 3 月的月度數(shù)據(jù)。

前五個觀察樣本

數(shù)據(jù)準備
將數(shù)據(jù)轉(zhuǎn)換為平穩(wěn)數(shù)據(jù)
這是通過獲取系列中兩個連續(xù)值之間的差異來完成的。這種轉(zhuǎn)換(通常稱為差分)會刪除數(shù)據(jù)中與時間相關(guān)的成分。此外,使用差分而不是原始值更容易建模,并且生成的模型具有更高的預測能力。
#將數(shù)據(jù)轉(zhuǎn)換為平穩(wěn)性
did = diff
head
滯后數(shù)據(jù)集
LSTM 期望數(shù)據(jù)處于監(jiān)督學習模式。也就是說,有一個目標變量 Y 和預測變量 X。為了實現(xiàn)這一點,我們通過滯后序列來變換序列,并將時間 (t?k)的值作為輸入,將時間 t?的值作為輸出,用于 k 步滯后數(shù)據(jù)集。
sps= laorm
head(sps)

將數(shù)據(jù)集拆分為訓練集和測試集
與大多數(shù)分析中訓練和測試數(shù)據(jù)集是隨機抽樣的不同,對于時間序列數(shù)據(jù),觀察的順序確實很重要。以下代碼將系列的?前?70% 作為訓練集,其余 30% 作為測試集。
## 分成訓練集和測試集
N = nrow
n = round
tran = sud[1:n, ]
tt ?= sud[(n+1):N, ?]
標準化數(shù)據(jù)
就像在任何其他神經(jīng)網(wǎng)絡(luò)模型中一樣,我們將輸入數(shù)據(jù) X 重新標準化到激活函數(shù)的范圍。如前所述,LSTM 的默認激活函數(shù)是 sigmoid 函數(shù),其范圍為 [-1, 1]。下面的代碼將有助于這種轉(zhuǎn)換。請注意,訓練數(shù)據(jù)集的最小值和最大值是用于標準化訓練和測試數(shù)據(jù)集以及預測值的標準化系數(shù)。這確保了測試數(shù)據(jù)的最小值和最大值不會影響模型。
## 標準化數(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]
將需要以下代碼將預測值恢復為原始比例。
## 逆變換
invtg = function(sle, slr, fue = c(0, 1))
定義
定義模型
我們設(shè)置參數(shù)?stateful?= TRUE 以便在處理一批樣本后獲得的內(nèi)部狀態(tài)被重新用作下一批樣本的初始狀態(tài)。由于網(wǎng)絡(luò)是有狀態(tài)的,我們必須從當前 [?samples?,??features ] 中以 [?samples?,??timesteps?,??features?]形式的 3 維數(shù)組提供輸入批次,其中:
樣本:每批中的觀察數(shù),也稱為批大小。
時間步長:給定觀察的單獨時間步長。在此示例中,時間步長 = 1
特征:對于單變量情況,如本例所示,特征 = 1

批量大小必須是訓練樣本和測試樣本大小的共同因素??梢哉业?LSTM 輸入的一個很好的解釋?
# 將輸入重塑為 3-維
# 指定所需的參數(shù)
bahse = 1 # 必須是訓練樣本和測試樣本的公因子
ni = 1 # 可以調(diào)整這個,在模型調(diào)整階段
#====================
keras_model_sequential
layer_lstm%>%
layer_dense
編譯模型
在這里,我將?mean_squared_error指定?為損失函數(shù),將自適應(yīng)矩估計?Adam指定為優(yōu)化算法,并在每次更新時指定學習率和學習率衰減。最后,我使用?準確性?作為評估模型性能的指標。
compile(
optimizer = optimizer_adam
)
模型匯總
summary

擬合模型
我們設(shè)置參數(shù)?shuffle??= FALSE 以避免打亂訓練集并保持 xixi 和 xi+txi+t 之間的依賴關(guān)系。LSTM 還需要在每個 epoch 之后重置網(wǎng)絡(luò)狀態(tài)。為了實現(xiàn)這一點,我們在 epoch 上運行一個循環(huán),在每個 epoch 中我們擬合模型并通過參數(shù)?reset_states()重置狀態(tài)。
for(i in 1:phs ){
model %>% fit
model %>% reset_states
}
作出預測
for(i in 1:L){
# 反轉(zhuǎn)縮放
yhat = invert_scaling
# 逆差分
yhat = yhat + Sis[(n+i)]
}
繪制值



最受歡迎的見解
1.用于NLP的Python:使用Keras的多標簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類
2.Python中利用長短期記憶模型LSTM進行時間序列預測分析 – 預測電力消耗數(shù)據(jù)
3.python在Keras中使用LSTM解決序列問題
4.Python中用PyTorch機器學習分類預測銀行客戶流失模型
5.R語言多元Copula GARCH 模型時間序列預測
6.在r語言中使用GAM(廣義相加模型)進行電力負荷時間序列分析
7.R語言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于預測時間序列數(shù)
8.R語言估計時變VAR模型時間序列的實證研究分析案例
9.用廣義加性模型GAM進行時間序列分析