拓端tecdat|Python用LSTM長短期記憶神經(jīng)網(wǎng)絡對不穩(wěn)定降雨量時間序列進行預測分析
原文鏈接:http://tecdat.cn/?p=23544?
原文出處:拓端數(shù)據(jù)部落公眾號
下面是一個關(guān)于如何使用長短期記憶網(wǎng)絡(LSTM)來擬合一個不穩(wěn)定的時間序列的例子。
每年的降雨量數(shù)據(jù)可能是相當不穩(wěn)定的。與溫度不同,溫度通常在四季中表現(xiàn)出明顯的趨勢,而雨量作為一個時間序列可能是相當不穩(wěn)定的。夏季的降雨量與冬季的降雨量一樣多是很常見的。
下面是某地區(qū)2020年11月降雨量的圖解。

作為一個連續(xù)的神經(jīng)網(wǎng)絡,LSTM模型可以證明在解釋時間序列的波動性方面有優(yōu)勢。
使用Ljung-Box檢驗,小于0.05的p值表明這個時間序列中的殘差表現(xiàn)出隨機模式,表明有明顯的波動性。
>>> sm.stats.acorr_ljungbox(res.resid, lags=[10])
Ljung-Box檢驗

Dickey-Fuller 檢驗
?

數(shù)據(jù)操作和模型配置
該數(shù)據(jù)集由722個月的降雨量數(shù)據(jù)組成。
選擇712個數(shù)據(jù)點用于訓練和驗證,即用于建立LSTM模型。然后,過去10個月的數(shù)據(jù)被用來作為測試數(shù)據(jù),與LSTM模型的預測結(jié)果進行比較。
下面是數(shù)據(jù)集的一個片段。

然后形成一個數(shù)據(jù)集矩陣,將時間序列與過去的數(shù)值進行回歸。
# 形成數(shù)據(jù)集矩陣
for i in range(len(df)-previous-1):
a = df[i:(i+previous), 0]
dataX.append(a)
dataY.append(df[i + previous, 0])
然后用MinMaxScaler對數(shù)據(jù)進行標準化處理。

將前一個參數(shù)設置為120,訓練和驗證數(shù)據(jù)集就建立起來了。作為參考,previous = 120說明模型使用從t - 120到t - 1的過去值來預測時間t的雨量值。
前一個參數(shù)的選擇要經(jīng)過試驗,但選擇120個時間段是為了確保識別到時間序列的波動性或極端值。
# 訓練和驗證數(shù)據(jù)的劃分
train_size = int(len(df) * 0.8)
val_size = len(df) - train_size
train, val = df[0:train_size,:], df[train_size:len(df),:]# 前期的數(shù)量
previous = 120
然后,輸入被轉(zhuǎn)換為樣本、時間步驟、特征的格式。?
# 轉(zhuǎn)換輸入為[樣本、時間步驟、特征]。
np.reshape(X_train, (shape[0], 1, shape[1]))
模型訓練和預測
該模型在100個歷時中進行訓練,并指定了712個批次的大?。ǖ扔谟柧毢万炞C集中的數(shù)據(jù)點數(shù)量)。
# 生成LSTM網(wǎng)絡
model = tf.keras.Sequential()
# 列出歷史中的所有數(shù)據(jù)
print(history.history.keys())
# 總結(jié)準確度變化
plt.plot(history.history['loss'])
下面是訓練集與驗證集的模型損失的關(guān)系圖。

預測與實際降雨量的關(guān)系圖也被生成。
# 繪制所有預測圖
plt.plot(valpredPlot)

預測結(jié)果在平均方向準確性(MDA)、平均平方根誤差(RMSE)和平均預測誤差(MFE)的基礎上與驗證集進行比較。?
mda(Y_val, predictions)0.9090909090909091
>>> mse = mean_squared_error(Y_val, predictions)
>>> rmse = sqrt(mse)
>>> forecast_error
>>> mean_forecast_error = np.mean(forecast_error)

?

?

MDA:?0.909
RMSE:?48.5
MFE:?-1.77
針對測試數(shù)據(jù)進行預測
雖然驗證集的結(jié)果相當可觀,但只有將模型預測與測試(或未見過的)數(shù)據(jù)相比較,我們才能對LSTM模型的預測能力有合理的信心。
如前所述,過去10個月的降雨數(shù)據(jù)被用作測試集。然后,LSTM模型被用來預測未來10個月的情況,然后將預測結(jié)果與實際值進行比較。

至t-120的先前值被用來預測時間t的值。
# 測試(未見過的)預測
np.array([tseries.iloctseries.iloc,t
獲得的結(jié)果如下
MDA:?0.8
RMSE:?49.57
MFE:?-6.94
過去10個月的平均降雨量為148.93毫米,預測精度顯示出與驗證集相似的性能,而且相對于整個測試集計算的平均降雨量而言,誤差很低。
結(jié)論
在這個例子中,你已經(jīng)看到:
如何準備用于LSTM模型的數(shù)據(jù)
構(gòu)建一個LSTM模型
如何測試LSTM的預測準確性
使用LSTM對不穩(wěn)定的時間序列進行建模的優(yōu)勢

最受歡迎的見解
1.用于NLP的Python:使用Keras的多標簽文本LSTM神經(jīng)網(wǎng)絡分類
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進行時間序列分析