拓端tecdat|Python用LSTM長短期記憶神經網絡對不穩定降雨量時間序列進行預測分析


原文鏈接: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模型的預測結果進行比較。

下面是數據集的一個片段。

然后形成一個數據集矩陣,將時間序列與過去的數值進行回歸。

  1.  
    # 形成數據集矩陣
  2.  
     
  3.  
    for i in range(len(df)-previous-1):
  4.  
    a = df[i:(i+previous), 0]
  5.  
    dataX.append(a)
  6.  
    dataY.append(df[i + previous, 0])

然后用MinMaxScaler對數據進行標准化處理。

將前一個參數設置為120,訓練和驗證數據集就建立起來了。作為參考,previous = 120說明模型使用從t - 120到t - 1的過去值來預測時間t的雨量值。

前一個參數的選擇要經過試驗,但選擇120個時間段是為了確保識別到時間序列的波動性或極端值。

  1.  
    # 訓練和驗證數據的划分
  2.  
    train_size = int(len(df) * 0.8)
  3.  
    val_size = len(df) - train_size
  4.  
    train, val = df[0:train_size,:], df[train_size:len(df),:]# 前期的數量
  5.  
    previous = 120

然后,輸入被轉換為樣本、時間步驟、特征的格式。 

  1.  
    # 轉換輸入為[樣本、時間步驟、特征]。
  2.  
    np.reshape(X_train, (shape[0], 1, shape[1]))

模型訓練和預測

該模型在100個歷時中進行訓練,並指定了712個批次的大小(等於訓練和驗證集中的數據點數量)。

  1.  
    # 生成LSTM網絡
  2.  
    model = tf.keras.Sequential()
  3.  
    # 列出歷史中的所有數據
  4.  
    print(history.history.keys())
  5.  
    # 總結准確度變化
  6.  
    plt.plot(history.history['loss'])

下面是訓練集與驗證集的模型損失的關系圖。

預測與實際降雨量的關系圖也被生成。

  1.  
    # 繪制所有預測圖
  2.  
    plt.plot(valpredPlot)

預測結果在平均方向准確性(MDA)、平均平方根誤差(RMSE)和平均預測誤差(MFE)的基礎上與驗證集進行比較。 

  1.  
    mda(Y_val, predictions)0.9090909090909091
  2.  
    >>> mse = mean_squared_error(Y_val, predictions)
  3.  
    >>> rmse = sqrt(mse)
  4.  
    >>> forecast_error
  5.  
    >>> mean_forecast_error = np.mean(forecast_error)

 

 

  • MDA: 0.909
  • RMSE: 48.5
  • MFE: -1.77

針對測試數據進行預測

雖然驗證集的結果相當可觀,但只有將模型預測與測試(或未見過的)數據相比較,我們才能對LSTM模型的預測能力有合理的信心。

如前所述,過去10個月的降雨數據被用作測試集。然后,LSTM模型被用來預測未來10個月的情況,然后將預測結果與實際值進行比較。

至t-120的先前值被用來預測時間t的值。

  1.  
    # 測試(未見過的)預測
  2.  
    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進行時間序列預測分析 – 預測電力消耗數據

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進行時間序列分析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM