拓端tecdat:PYTHON用LSTM長短期記憶神經網絡的參數優(yōu)化方法預測時間序列洗發(fā)水銷售
原文鏈接:http://tecdat.cn/?p=24431
原文出處:拓端數據部落公眾號
配置神經網絡很困難,因為沒有關于如何去做的好的理論。
您必須系統地從動態(tài)和客觀結果的角度探索不同的參數配置,以嘗試了解給定預測建模問題的情況。
在本教程中,您將了解如何探索如何針對時間序列預測問題配置 LSTM 網絡參數。
完成本教程后,您將了解:
如何調整和解釋訓練時期數的結果。
如何調整和解釋訓練批次大小的結果。
如何調整和解釋神經元數量的結果。
如何使用?Keras?調整 LSTM 超參數以進行時間序列預測
?
教程概述
本教程分為 6 個部分;他們是:
洗發(fā)水銷售數據集
實驗測試
調整時期數
調整批次大小
調整神經元的數量
結果總結
環(huán)境
本教程假設您已安裝?Python?SciPy 環(huán)境。您可以在此示例中使用 Python 2 或 3。
本教程假設您已經安裝了?Keras?v2.0 或更高版本以及 TensorFlow 。
本教程還假設您已安裝 scikit-learn、Pandas、NumPy 和 Matplotlib。
洗發(fā)水銷售數據集
該數據集描述了 3 年期間每月洗發(fā)水的銷售量。
單位是銷售計數,有 36 個觀察值。
下面的示例加載并創(chuàng)建已加載數據集的圖。
#加載并繪制數據集
# 加載數據集
def paser(x):
return dattme.strptme('190'+x, '%Y-%m')
seres = read_csv('sale.csv', header=0, pare_dats=[0])
# 總結前幾行
print(seres.head())
# 繪制線圖
seres.plot()
運行示例將數據集加載為 Pandas 序列并輸出前 5 行。
然后創(chuàng)建該序列的線圖,顯示出明顯的增加趨勢。
洗發(fā)水銷售數據集的線圖
接下來,我們將看看實驗中使用的 LSTM 配置和測試工具。
實驗測試
本節(jié)介紹本教程中使用的測試工具。
數據拆分
我們將把洗發(fā)水銷售數據集分成兩部分:訓練集和測試集。
前兩年的數據將用于訓練數據集,剩余的一年數據將用于測試集。
將使用訓練數據集開發(fā)模型并對測試數據集進行預測。
測試數據集上的持久性預測實現了每月洗發(fā)水銷量 136.761 的誤差。這在測試集上提供了可接受的較低性能界限。
模型評估
使用滾動預測場景。
測試數據集的每個時間步將一次走一個。模型將用于對時間步長進行預測,然后將采用測試集中的實際預期值,并將其提供給模型用于下一個時間步長的預測。
這模擬了一個真實世界的場景,其中每個月都會有新的洗發(fā)水銷售觀察結果,并用于下個月的預測。
這將通過訓練和測試數據集的結構進行模擬。我們將以一次性方法進行所有預測。
將收集對測試數據集的所有預測,并計算誤差以總結模型的技能。將使用均方根誤差 (RMSE),因為它會懲罰大誤差并產生與預測數據(即每月洗發(fā)水銷售量)相同單位的分數。
數據準備
在我們將 LSTM 模型擬合到數據集之前,我們必須轉換數據。
在擬合模型和進行預測之前,對數據集執(zhí)行以下三個數據轉換。
轉換時間序列數據,使其平穩(wěn)。具體來說,滯后=1 差分以消除數據中的增加趨勢。
將時間序列轉換為監(jiān)督學習問題。具體來說,將數據組織成輸入和輸出模式,其中前一個時間步的觀察被用作預測當前時間步的觀察的輸入
將觀測值轉換為特定的量綱。具體來說,將數據重新縮放到 -1 和 1 之間的值以滿足 LSTM 模型的默認雙曲正切激活函數。
在計算和誤差之前,這些變換在預測中被返回到原始比例。
實驗運行
每個實驗方案將被運行10次。
這樣做的原因是,LSTM網絡的隨機初始條件在每次訓練一個給定的配置時,會導致非常不同的結果。
一個診斷方法將被用來研究模型配置。這就是將創(chuàng)建模型技能隨時間變化的線圖(訓練迭代稱為epochs),并對其進行研究,以深入了解一個給定的配置是如何執(zhí)行的,以及如何調整它以獲得更好的性能。
在每個歷時結束時,模型將在訓練和測試數據集上進行評估,并保存RMSE分數。
每個場景結束時的訓練和測試RMSE分數將被打印出來,以顯示進度。
訓練和測試的RMSE分數系列在運行結束后被繪制成線圖。訓練得分用藍色表示,測試得分用橙色表示。
讓我們深入了解一下結果。
?
調整時期
我們將查看調整的第一個 LSTM 參數是訓練時期的數量。
該模型將使用一個批次?4 和單個神經元。我們將探索針對不同訓練時期數訓練此配置的效果。
500 時期epoch 的診斷
代碼注釋得相當好,應該很容易理解。
#能夠在服務器上保存圖像
matplotlib.use('Agg')
# 用于加載數據集的日期時間解析函數
def paser(x):
return dateime.strptme('190'+x, '%Y-%m')
# 將一個序列設定為一個監(jiān)督學習問題
colmns.appnd(df)
df = concat(colns, axis=1)
# 創(chuàng)建一個差分序列
diffene(dtaset, ieral=1):
# 將訓練和測試數據擴展到[-1, 1]。
scae(train, test):
scler = salr.fit(train)
# 轉換訓練集
train = trin.rhape(tain.hpe[0], tran.shpe[1])
# 變換測試
tst_caed = scler.trnfom(test)
# 預測值的逆向縮放
inve_scle(saer, X, yhat):
# 在數據集上評估模型,以轉換后的單位返回RMSE
evaluate(mdel, rw_data, scald_dataet, caler)
# 分開
X, y = scald_daaset[:,0:-1], saleddaaset[:,-1)
# 重塑
reshaed = X.reshpe(len(X), 1, 1)
# 預測數據集
predict(rshped, bth_ize=tchsize)
# 在預測中反轉數據變換
for i in rage(len(outut)):
yat = output[i,0]
# 反轉比例
yhat = inrtscle(saer, X[i], yhat)
# 反轉差分
yhat = yhat + raaa[i]。
# 存儲預測
pdiis.ppd(yhat)
# 報告性能
rmse = srt(mensuederror pricions) )
# 對訓練數據進行LSTM網絡擬合
fitlstm(tran, tet, raw, caler bath_sie, n_eoch, erns):
# 準備模型
model = Sequential()
moel.ad(LSTM(neons, bh_phpe, stateful)
# 擬合模型
for i in range(nb_epoch):
fit(X, y, epocs=1, bathsze, verose=0, shufle=False)
# 在訓練數據上評估模型
mse.apend(evalaion(mdel, rawtain, trai, scler, 0, bcize))
# 在測試數據上評估模型
rmse.append(evalh_size))
# 運行診斷性實驗
run():
# 載入數據集
read_csv('sale.csv'
# 將數據轉化為平穩(wěn)的
diffe(raues, 1)
# 將數據轉化為有監(jiān)督的學習
supd = timespevied(diues, 1)
suplues = supd.vales
# 將數據分成訓練集和測試集
train, test = supues[0:-12], suplues[-12:] 。
# 改變數據的尺度
scar, traaled, tescaled = scale(tain, tst)
# 擬合和評估模型
traed = trainld[2:, :]
# 配置
reas = 10
nbch = 4
nphs = 500
nnens = 1
# 運行診斷性測試
for i in range(ret):
fit(train, tes, rawues, scler, nbth, necs, neons)
注意:考慮到算法或評估程序的隨機性,或數值精度的差異??紤]多次運行該示例并比較平均結果。
運行實驗會在 10 次實驗運行結束時輸出訓練和測試集的 RMSE。
還創(chuàng)建了每個訓練時期之后訓練集和測試集上的一系列 RMSE 分數的線圖。
500 個時期的診斷結果
結果清楚地表明,幾乎所有實驗運行的 RMSE 在訓練時期都有下降趨勢。
它表明模型正在學習問題并且具有一定的預測能力。事實上,所有最終測試分數都低于在這個問題上實現 136.761 的 RMSE 的簡單持久性模型(樸素預測)的誤差。
結果表明,更多的訓練時期將產生更熟練的模型。
讓我們嘗試將 epoch 數從 500 加倍到 1000。
1000個時期的診斷
在本節(jié)中,我們使用相同的實驗設置并擬合模型超過 1000 個訓練時期。
具體來說,?在?run()?函數中將?n_epochs?參數設置為?1000。
nepohs?=?1000
注意:?考慮到算法或評估程序的隨機性,或數值精度的差異??紤]多次運行該示例并比較平均結果。
運行該示例會輸出最后一個 epoch 中訓練集和測試集的 RMSE。
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
1000 個時期的診斷結果
我們可以看到,模型誤差的下降趨勢確實在繼續(xù),而且似乎在放緩。
訓練和測試用例的線條變得更加水平,但仍普遍呈現下降趨勢,盡管變化率較低。一些測試錯誤的例子顯示了大約 600 個時期可能出現的拐點,并且可能顯示出上升趨勢。
我們對測試集上持續(xù)改進的平均性能感興趣,而且這種情況可能會持續(xù)下去。
讓我們嘗試將 epoch 數從 1000 增加一倍到 2000。
2000 時期Epoch 的診斷
在本節(jié)中,我們使用相同的實驗設置并擬合模型超過 2000 個訓練時期。
具體來說,?在run()?函數中將?npoch參數設置為 2000? 。
nepoch?=?2000
注意:考慮到算法或評估程序的隨機性,或數值精度的差異??紤]多次運行該示例并比較平均結果。
運行該示例會輸出最后一個 epoch 中訓練集和測試集的 RMSE。
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
2000 時期epoch 的診斷結果
正如人們可能已經猜到的那樣,在訓練和測試數據集上的額外 1000 個 epoch 中,誤差的下降趨勢仍在繼續(xù)。
值得注意的是,大約一半的案例在運行結束之前一直在減少誤差,而其余的則顯示出增加趨勢的跡象。
增長的趨勢是過度擬合的標志。這是當模型過度擬合訓練數據集時,其代價是測試數據集上的性能下降。它的例子是在訓練數據集上的持續(xù)改進,以及在測試數據集上的拐點和最差技能之后的改進。在測試數據集上,只有不到一半的運行顯示了這種類型的模式的開始。
盡管如此,測試數據集上的最終歷時結果還是非常好。我們可以通過更長的訓練看到進一步的收益。
讓我們嘗試將歷時數翻倍,從2000到4000。
?
4000個時期的診斷
在本節(jié)中,我們使用相同的實驗設置并擬合模型超過 4000 個訓練時期。
具體來說,?在run()?函數中將?n_epochs參數設置為 4000? 。
nepocs?=?4000
注意:考慮到算法或評估程序的隨機性,或數值精度的差異。考慮多次運行該示例并比較平均結果。
運行該示例會輸出最后一個 epoch 中訓練集和測試集的 RMSE。
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
4000 epoch 的診斷結果
即使超過 4000 個 epoch,也有提高性能的總體趨勢。存在一種嚴重過擬合的情況,即測試誤差急劇上升。
同樣,大多數運行以“良好”(比持久性更好)的最終測試錯誤結束。
結果總結
上面的診斷運行有助于探索模型的動態(tài)行為,但缺乏客觀和可比較的平均性能。
我們可以通過重復相同的實驗并計算和比較每個配置的匯總統計來解決這個問題。在這種情況下,完成了 30 次運行,時間值為 500、1000、2000、4000 和 6000。
這個想法是使用大量運行的匯總統計來比較配置,并確切地查看哪些配置的平均性能可能更好。
下面列出了完整的代碼示例。
# 運行一個重復實驗
epernt(rpeas, sris, ochs):
# 將數據轉化為平穩(wěn)的
dif_vues = diferne(ravaues, 1)
# 將數據轉換為有監(jiān)督的學習
to_spersed(dif_vles, 1)
# 將數據分成訓練集和測試集
train, test = spervsed[0:-2], suervues[-12:] 。
# 改變數據的尺度
scale(train, test)
# 運行實驗
for r in range(reeats):
# 擬合模型
size = 4
trtried = traled[2:, :]
ltmol = lstm(tamd, bachsie, eohs, 1)
# 預測整個訓練數據集,以建立預測的狀態(tài)
trainmd[:, 0].resape(lentran_tmmed), 1, 1)
predict(tain_rsaped, ah_size=ath_ize)
# 預測測試數據集
te_sapd = tstscaled[:,0:-1)
predict(testped, btze=btc_sze)
for i in range(len(outut)):
yhat = output[i,0]
X = te_saled[i, 0:-1] 。
# 反轉比例
yhat = invere(aler, X, yhat)
# 反轉差分
yht = invsefece(raw_aues, yat, len+1-i)
# 報告性能
sqrt(men_sqred_eror(a_vals[-12:], pedins) )
# 改變訓練歷時
echs = [500, 1000, 2000, 4000, 6000] 。
for e in eochs:
exiet(rpats, sries, e)
# 總結結果
boxlot()
運行代碼首先輸出 5 個配置中每一個的匯總統計信息。值得注意的是,這包括來自每個結果群體的 RMSE 分數的平均值和標準差。
平均值給出了配置的平均預期性能的概念,而標準差給出了方差的概念。最小和最大 RMSE 分數還給出了可能期望的最佳和最壞情況示例的范圍。
僅查看平均 RMSE 分數,結果表明配置為 1000 的 epoch 可能更好。結果還表明,可能需要對 1000 至 2000 之間的值進行進一步分析。
分布也顯示在箱線圖上。這有助于了解分布如何直接比較。
紅線顯示中位數,方框顯示第 25 個和第 75 個百分位數,或中位數 50% 的數據。這種比較還表明,將 epochs 設置為 1000 的選擇優(yōu)于測試的替代方案。它還表明,可以在 2000 或 4000 次迭代時獲得最佳性能,但代價是平均性能更差。
總結 Epoch 結果的箱線圖
接下來,我們將看看批次大小的影響。
調整批次大小
批次大小控制更新網絡權重的頻率。
重要的是,在 Keras 中,批量大小必須是測試和訓練數據集大小的一個因素。
在上一節(jié)探討訓練 epoch 數的部分中,批大小固定為 4,它分為測試數據集(大小為 12)和測試數據集(大小為 20)。
在本節(jié)中,我們將探討改變批大小的影響。我們將訓練 epoch 的數量保持在 1000。
診斷 1000 個時期和批次大小為 4
作為提醒,上一節(jié)在第二次實驗中評估了批量大小為4,歷時數為1000的實驗。
1000 個時期的診斷結果
診斷 1000 個時期和批次大小為 2
在本節(jié)中,我們著眼于將批大小從 4 減半至 2。
這個改動是?對run()?函數中的?n_batch參數進行的?;例如:
n_batch?=?2
運行該示例顯示了與批大小為 4 相同的總體性能趨勢,可能在最后一個時期具有更高的 RMSE。
運行可能會顯示出更早穩(wěn)定 RMES 的行為,而不是似乎繼續(xù)下降趨勢。
下面列出了每次運行最終的 RSME 分數。
?
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
1000 個時期和批次大小為 2 的診斷結果
讓我們再次嘗試使用批量大小。
診斷 1000 個時期和批次大小為 1
這是在每個訓練模式之后更新網絡??梢耘c批量學習形成對比,其中權重僅在每個 epoch 結束時更新。
我們可以?在run()?函數中更改?n_batch參數?;例如:
n_batch?=?1
同樣,運行該示例會輸出每次運行的最后一期的 RMSE 分數。
還創(chuàng)建了一個每個歷時的測試和訓練RMSE分數的線圖。
該圖表明,隨著時間的推移,測試RMSE有更多的變化,也許訓練RMSE比大批量的測試RMSE穩(wěn)定得更快。測試RMSE的變異性增加是意料之中的,因為每次更新對網絡所做的改變都會帶來很少的反饋。
該圖還表明,如果配置被賦予更多的訓練歷時,也許RMSE的下降趨勢會繼續(xù)下去。
?
1000 個時期和批次大小為 1 的診斷結果
結果總結
與訓練時期一樣,我們可以客觀地比較網絡在給定不同批次大小的情況下的性能。
每個配置運行 30 次,并根據最終結果計算匯總統計信息。
# 運行一個重復的實驗
# 將數據轉換為平穩(wěn)的
raw_vues = sres.values
df_vaues = difence(rvalues, 1)
# 將數據轉換為監(jiān)督學習
suesr_lus = surior.values
# 將數據分成訓練集和測試集
# 變換數據的尺度
tra_cled,testscld = scale(tain, tet)
# 運行實驗
# 擬合模型
tran_timed = tan_saled[2:, :]
lstmmdl = lstm(tainrmd, ach_e, 1000, 1)
# 預測整個訓練數據集以建立預測狀態(tài)
preit(trairehae,bach_ie=bat_size)
# 預測測試數據集
preict(tst_rehapeatc_ze=bathsize)
X = tes_cd[i, 0:-1]
# 反轉縮放
yht = ivetcale(aler, X, yhat)
# 反轉差分
yat = invese_dfence(awvalus, yat, le(tetsald)+1-i)
# 報告表現
rmse = sqrt(mean_urerror)
# 加載數據集
# 實驗
# 改變訓練批次
批次 = [1, 2, 4]
boxplot()
僅從平均性能來看,結果表明批量大小為 1 時 RMSE 較低。 正如上一節(jié)所述,這可能會隨著更多的訓練時期而得到進一步改善。
還創(chuàng)建了數據的箱線圖,以幫助以圖形方式比較分布。該圖將中值性能顯示為一條紅線,其中批次大小為 4 顯示最大的差異和最低的中值 RMSE。
調整神經網絡是平均性能和該性能的可變性的權衡,理想結果具有低平均誤差和低可變性,這意味著它通常是好的和可重復的。
總結批次大小結果的箱線圖
調整神經元的數量
在本節(jié)中,我們將研究改變網絡中神經元數量的影響。
神經元的數量影響網絡的學習能力。一般來說,更多的神經元能夠以更長的訓練時間為代價從問題中學習更多的結構。更多的學習能力也會產生潛在的過度擬合訓練數據的問題。
我們將使用 4 和 1000 個訓練時期的批量大小。
1000 個時期和 1 個神經元的診斷
我們將從 1 個神經元開始。
提醒一下,這是從 epochs 實驗中測試的第二個配置。
1000 個時期的診斷結果
1000 個時期和 2 個神經元的診斷
我們可以將神經元的數量從 1 增加到 2。這有望提高網絡的學習能力。
我們可以通過更改run()?函數中的n_neurons?變量?來做到這一點?。
n_neurons?=?2
運行此配置會輸出每次運行的最后一個時期的 RMSE 分數。
結果表明,總體表現不錯,但不是很好。
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
這更能說明問題。它顯示了測試RMSE的快速下降,大約在500-750個時期中,一個拐點顯示了測試RMSE的上升,幾乎所有的運行都是如此。同時,訓練數據集顯示持續(xù)下降到最后一期。
這些都是訓練數據集過擬合的跡象。
?
?
1000 個時期和 2 個神經元的診斷結果
讓我們看看這種趨勢是否會隨著更多的神經元而繼續(xù)。
1000 個時期和 3 個神經元的診斷
本節(jié)著眼于將神經元數量增加到 3 的相同配置。
n_neurons?=?3
運行此配置會輸出每次運行的最后一個時期的 RMSE 分數。
結果與上一節(jié)類似;我們看不到 2 或 3 個神經元的最終 epoch 測試分數之間的一般差異。3 個神經元的最終訓練分數似乎確實較低,這可能表明過度擬合加速。
訓練數據集中的拐點似乎比 2 個神經元實驗發(fā)生得更早,可能在 300-400 期。
這些神經元數量的增加可能受益于減緩學習速度的額外變化。例如使用正則化方法,如 dropout,減少批量大小,減少訓練時期的數量。
還創(chuàng)建了每個時期的測試和訓練 RMSE 分數的線圖。
1000 個時期和 3 個神經元的診斷結果
結果總結
同樣,我們可以客觀地比較增加神經元數量同時保持所有其他網絡配置的影響。
在本節(jié)中,我們將每個實驗重復 30 次,并將平均測試 RMSE 性能與 1 到 5 的神經元數量進行比較。
# 運行一個重復的實驗
# 將數據轉換為平穩(wěn)的
ra_lus = sees.values
difvles = difece(rwvlus, 1)
# 將數據轉換為監(jiān)督學習
sups_ales = supvor.values
# 將數據分成訓練集和測試集
# 變換數據的尺度
trainsld,tet_scld = scale(tain, est)
# 運行實驗
err_scres = list()
# 擬合模型
trntied = tr_aed[2:, :]
lsmel = lstm(tritid, bahze, 1000, eons)
# 預測整個訓練數據集以建立預測狀態(tài)
trrehap = ti_rimed[:, 0].rehae(len(train_trimmed), 1, 1)
prdict(trahpe,bahe=achze)
# 預測測試數據集
tet_sape = tetsaled[:,0:-1]
tetrehae = tesespe.reshape(len(tst_ehape), 1, 1)
prect(tes_rhpe,bath_ize=btchsze)
X = ts_cld[i, 0:-1]
# 反轉縮放
yhat = ivertle(scaer, X, yhat)
# 反轉差分
yht = inversefrce(rw_values, hat, len(tet_saed)+1-i)
# 報告表現
rmse = sqrt(men_sureero(aw_vue[-12:], preiions))
# 加載數據集
# 實驗
# 改變神經元
神經元 = [1, 2, 3, 4, 5]
boxplot()
運行實驗會輸出每個配置的摘要統計信息。
僅從平均性能來看,結果表明具有 1 個神經元的網絡配置在 1000 個 epoch 中具有最佳性能,批量大小為 4。
盒須圖顯示了中值測試集性能的明顯趨勢,其中神經元的增加導致測試 RMSE 的相應增加。
總結神經元結果的盒須圖
所有結果的總結
在本教程中,我們在洗發(fā)水銷售數據集上完成了相當多的 LSTM 實驗。
一般來說,似乎有狀態(tài)的 LSTM 配置了 1 個神經元,批量大小為 4,并且訓練了 1000 個 epochs 可能是一個很好的配置。
結果還表明,也許這種批量大小為 1 并且適合更多 epoch 的配置可能值得進一步探索。
調整神經網絡是一項艱巨的實證工作,事實證明 LSTM 也不例外。
本教程展示了配置行為隨時間的診斷研究以及測試 RMSE 的客觀研究的好處。
擴展
本節(jié)列出了對本教程中執(zhí)行的實驗進行擴展的一些想法。
如果您探索其中任何一個,請在評論中報告您的結果;我很想看看你想出了什么。
dropout。使用正則化方法(例如循環(huán) LSTM 連接上的 dropout)減慢學習速度。
層。通過在每層添加更多層和不同數量的神經元來探索額外的分層學習能力。
正則化。探索如何使用權重正則化(例如 L1 和 L2)來減緩網絡在某些配置上的學習和過度擬合。
優(yōu)化算法。例如經典梯度下降,以查看加速或減慢學習的特定配置是否會帶來好處。
損失函數。
特點和時間步長。探索使用滯后觀察作為輸入特征和特征的輸入時間步長,看看它們作為輸入的存在是否可以提高模型的學習和/或預測能力。
更大的批量。探索大于 4 的批量大小,可能需要進一步處理訓練和測試數據集的大小。
概括
在本教程中,您了解了如何系統地研究 LSTM 網絡的配置以進行時間序列預測。
具體來說,你學到了:
如何設計用于評估模型配置的系統測試工具。
如何隨著時間的推移使用模型診斷以及客觀預測誤差來解釋模型行為。
如何探索和解釋訓練時期數、批量大小和神經元數量的影響。
您對調整 LSTM 或本教程有任何疑問嗎?
在下面的評論中提出您的問題,我們會盡力回答。
最受歡迎的見解
1.用于NLP的Python:使用Keras的多標簽文本LSTM神經網絡分類
2.Python中利用長短期記憶模型LSTM進行時間序列預測分析 – 預測電力消耗數據
3.python在Keras中使用LSTM解決序列問題
4.Python中用PyTorch機器學習分類預測銀行客戶流失模型
5.R語言多元Copula GARCH 模型時間序列預測
6.在r語言中使用GAM(廣義相加模型)進行電力負荷時間序列分析
7.R語言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于預測時間序列數
8.R語言估計時變VAR模型時間序列的實證研究分析案例
9.用廣義加性模型GAM進行時間序列分析