原文鏈接:http://tecdat.cn/?p=23544
原文出處:拓端數據部落公眾號
下面是一個關於如何使用長短期記憶網絡(LSTM)來擬合一個不穩定的時間序列的例子。
每年的降雨量數據可能是相當不穩定的。與溫度不同,溫度通常在四季中表現出明顯的趨勢,而雨量作為一個時間序列可能是相當不穩定的。夏季的降雨量與冬季的降雨量一樣多是很常見的。
下面是某地區2020年11月降雨量的圖解。

作為一個連續的神經網絡,LSTM模型可以證明在解釋時間序列的波動性方面有優勢。
使用Ljung-Box檢驗,小於0.05的p值表明這個時間序列中的殘差表現出隨機模式,表明有明顯的波動性。
>>> sm.stats.acorr_ljungbox(res.resid, lags=[10])
Ljung-Box檢驗
![]()
Dickey-Fuller 檢驗

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

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

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

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

預測結果在平均方向准確性(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
針對測試數據進行預測
雖然驗證集的結果相當可觀,但只有將模型預測與測試(或未見過的)數據相比較,我們才能對LSTM模型的預測能力有合理的信心。
如前所述,過去10個月的降雨數據被用作測試集。然后,LSTM模型被用來預測未來10個月的情況,然后將預測結果與實際值進行比較。

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

最受歡迎的見解
1.用於NLP的Python:使用Keras的多標簽文本LSTM神經網絡分類
2.Python中利用長短期記憶模型LSTM進行時間序列預測分析 – 預測電力消耗數據
4.Python中用PyTorch機器學習分類預測銀行客戶流失模型
6.在r語言中使用GAM(廣義相加模型)進行電力負荷時間序列分析
