拓端tecdat|R語言中的神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)時(shí)間序列:多層感知器(MLP)和極限學(xué)習(xí)機(jī)(ELM)數(shù)
原文鏈接:http://tecdat.cn/?p=23485?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
用于R語言的多層感知器(MLP)和極限學(xué)習(xí)機(jī)(ELM)進(jìn)行時(shí)間序列預(yù)測(cè)。請(qǐng)注意,由于神經(jīng)網(wǎng)絡(luò)無法利用GPU處理,因此大型網(wǎng)絡(luò)的訓(xùn)練速度往往很慢。與現(xiàn)有神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的不同之處在于,R可以自動(dòng)設(shè)計(jì)具有合理預(yù)測(cè)性能的網(wǎng)絡(luò)。這增加了神經(jīng)網(wǎng)絡(luò)的魯棒性,但也有助于減少訓(xùn)練時(shí)間。
使用MLP進(jìn)行預(yù)測(cè)
使用R軟件包,您可以生成外推(單變量)預(yù)測(cè),也可以包含解釋變量。
單變量預(yù)測(cè)
最簡(jiǎn)單的形式,您只需輸入要建模的時(shí)間序列。
fit1 <- MLPfit(Air)
print(fit1)

輸出表明結(jié)果網(wǎng)絡(luò)具有5個(gè)隱藏節(jié)點(diǎn),對(duì)其進(jìn)行了20次訓(xùn)練,并使用中位數(shù)運(yùn)算組合了不同的預(yù)測(cè)。自動(dòng)生成網(wǎng)絡(luò)集合,其訓(xùn)練從不同的隨機(jī)初始權(quán)重開始。此外,它提供了網(wǎng)絡(luò)中包含的輸入。
可以使用plot()
?獲得直觀的摘要?。
plot(fit1)

灰色的輸入節(jié)點(diǎn)是自回歸,而洋紅色的則是確定性輸入(在這種情況下為季節(jié)性)。如果包括任何其他回歸變量,它們將以淺藍(lán)色顯示。
該?MLP()
?函數(shù)接受幾個(gè)參數(shù)來微調(diào)生成的網(wǎng)絡(luò)。該?hd
?參數(shù)定義了固定數(shù)量的隱藏節(jié)點(diǎn)。如果是單個(gè)數(shù)字,則神經(jīng)元排列在單個(gè)隱藏節(jié)點(diǎn)中。如果是矢量,則將它們排列成多層。
fit( hd = c(10,5))

稍后我們將介紹如何自動(dòng)選擇節(jié)點(diǎn)數(shù)。根據(jù)我的經(jīng)驗(yàn)(以及來自文獻(xiàn)的證據(jù)),預(yù)測(cè)單個(gè)時(shí)間序列的常規(guī)神經(jīng)網(wǎng)絡(luò)無法從多個(gè)隱藏層中獲得更好效果。預(yù)測(cè)問題通常并不那么復(fù)雜!
reps
?定義了使用多少次訓(xùn)練重復(fù)。如果您想訓(xùn)練一個(gè)單一的網(wǎng)絡(luò),則可以使用?reps=1
,有大量結(jié)果證據(jù)表明這樣效果一般。默認(rèn)值?reps=20
?是訓(xùn)練速度和性能之間的折衷,但是您可以承受的重復(fù)次數(shù)越多越好。當(dāng)重新訓(xùn)練網(wǎng)絡(luò)時(shí),它們不僅有助于模型的性能,而且還有助于結(jié)果的穩(wěn)定性。
lags
?允許您選擇網(wǎng)絡(luò)考慮的自回歸滯后。如果未提供此參數(shù),則網(wǎng)絡(luò)使用lag 1到lag??m
,即序列的季節(jié)。
lags=1:24

keep=c(rep(TRUE,12), rep(FALSE,12)))

lags=1:24, sel.lag=FALSE

在第一種情況下,滯后(1,2,4,7,8,9,10,11,12,13,18,21,23,24)被保留。在第二種情況下,保留所有1-12,其余13-24被測(cè)試是否保留。
神經(jīng)網(wǎng)絡(luò)在建模趨勢(shì)方面并不出色。因此,在對(duì)趨勢(shì)進(jìn)行建模之前將其消除是很有用的。這由參數(shù)處理?difforder
。如果?difforder=0
?不執(zhí)行任何差分。對(duì)于?diff=1
,執(zhí)行一階差分。同樣,如果?difforder=12
?執(zhí)行12階差分。如果時(shí)間序列是具有季節(jié)性周期12的季節(jié)性序列,則這是季節(jié)性差異。
您可以同時(shí)執(zhí)行?difforder=c(1,12)
?或執(zhí)行任何其他差分。如果?difforder=NULL
?然后代碼自動(dòng)決定。如果存在趨勢(shì),則使用一階差分。該序列還經(jīng)過季節(jié)性測(cè)試。如果存在,則使用Canova-Hansen檢驗(yàn)來確定這是確定性的還是隨機(jī)的。如果是后者,則還會(huì)添加季節(jié)性差分。
確定性季節(jié)性可以使用季節(jié)性虛擬變量更好地建模。
隱藏的節(jié)點(diǎn)數(shù)可以使用參數(shù)預(yù)設(shè)。默認(rèn)情況下,這使用驗(yàn)證樣本(時(shí)間序列的20%)進(jìn)行測(cè)試,或?type="cv"
?使用5倍交叉驗(yàn)證。
auto.type="valid",hd.max=8

鑒于訓(xùn)練神經(jīng)網(wǎng)絡(luò)非常耗時(shí),因此你可以重用已經(jīng)指定/經(jīng)過訓(xùn)練的網(wǎng)絡(luò)。在以下示例中,我們將重用?fit1
?到新的時(shí)間序列。
fit(x, model=fit1)

保留了的模型參數(shù)?fit1
。如果您只想使用參數(shù),但要對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,則可以使用參數(shù)?retrain=TRUE
。

觀察兩個(gè)設(shè)置之間的樣本內(nèi)MSE的差異。
最后,您可以使用省略號(hào)將參數(shù)直接傳遞給用于訓(xùn)練網(wǎng)絡(luò)的?函數(shù)?...
。
要生成預(yù)測(cè),我們使用函數(shù)forecast()
,該函數(shù)?需要訓(xùn)練的網(wǎng)絡(luò)對(duì)象和預(yù)測(cè)范圍?h
。
print(frc)

plot(frc)

預(yù)測(cè)圖以灰色提供了所有集合的預(yù)測(cè)。
使用回歸預(yù)測(cè)
讓我們假設(shè)我們要使用確定性趨勢(shì)來預(yù)測(cè)時(shí)間序列。首先,我們構(gòu)造輸入,然后對(duì)序列建模。
z <- 1:(length()+24) # 我為預(yù)測(cè)增加了24個(gè)額外的觀測(cè)值
z <- cbind(z) # 把它轉(zhuǎn)換成一個(gè)列數(shù)
# 添加一個(gè)滯后0的回歸因子,并強(qiáng)制它留在模型中
difforder=0) # 不要讓mlp()來刪除隨機(jī)趨勢(shì)

輸出反映了包含回歸變量。這在帶有淺藍(lán)色輸入的網(wǎng)絡(luò)圖中反映出來。
plot(fit4)

為了包括更多的滯后,我們擴(kuò)展了?xreg.lags
:
difforder=0,xreg=z,xreg.lags=list(1:12)

觀察到網(wǎng)絡(luò)中未包含任何變量。我們使用?xreg.keep
?來強(qiáng)制包含這些變量。
difforder=0,xreg=z,xreg.lags=list(1:12),xreg.keep=list(c(rep(TRUE,3),rep(FALSE,9)

顯然,神經(jīng)網(wǎng)絡(luò)不喜歡確定性趨勢(shì)!如果我們強(qiáng)制執(zhí)行,它只會(huì)保留它。為此,我將嘗試tsutils?包。
zz <- cbind(z, 0)
zz[loc,2] <- 1
fitxreg.lags=list(c(0:6),0),xreg.keep=list(rep(FALSE,7),TRUE)

顯然,您可以包含任意數(shù)量的回歸變量。
為了產(chǎn)生預(yù)測(cè),我們使用?forecast()
?函數(shù),但現(xiàn)在使用?xreg
?輸入。方法是從網(wǎng)絡(luò)訓(xùn)練期間使用的相同觀察值開始輸入回歸變量,并根據(jù)需要擴(kuò)展預(yù)測(cè)范圍。您
frc.reg <- forecast(fit5,xreg=zz)
ELM的預(yù)測(cè)
使用極限學(xué)習(xí)機(jī)(EML)。默認(rèn)情況下,ELM從一個(gè)非常大的隱藏層(100個(gè)節(jié)點(diǎn))開始,并根據(jù)需要對(duì)其進(jìn)行修剪。
print(fit6)

plot(fit6)

網(wǎng)絡(luò)圖有一些黑線和一些灰線。后者被修剪。裝有20個(gè)網(wǎng)絡(luò)(由參數(shù)控制?reps
)。每個(gè)網(wǎng)絡(luò)可能具有不同的最終連接。
par(mfrow=c(2,2))
for (i in 1:4){plot(fit6,i)}
par(mfrow=c(1,1))

修剪的方式由參數(shù)控制。默認(rèn)選項(xiàng)是使用LASSO回歸(類型=“套索LASSO”)?;蛘撸梢允褂谩?ridge”進(jìn)行嶺回歸,使用“ step”進(jìn)行逐步OLS,使用“ lm”獲得OLS解決方案而不進(jìn)行修剪。
要進(jìn)行預(yù)測(cè),使用forecast()
?。
forecast(fit6,h=12)
時(shí)間層次結(jié)構(gòu)
實(shí)現(xiàn)時(shí)間層次結(jié)構(gòu)mlp和
elm。
par(mfrow=c(1,2))
plot(thiMLP)
plot(thiELM)
par(mfrow=c(1,1))

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