DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

使用長短期記憶模型(LSTM)預測天氣(繁體)

作者 Dan 羅傑瑞
難度 中等
所需時間 2小時

 

由於我們已經討論過如何使用像是Raspberry Pi之類的嵌入式系統來收集感測器資料,因此我們想介紹一種如何使用資料通過深度學習進行預測的方法。尤其是如果我們的資料庫或存儲庫中已經有大量資料的話,這是一個非常有用的主題。

在執行此專案時,我們使用了以下規格:

  • 作業系統: Windows 10
  • GPU: Nvidia GTX1070
  • RAM: 32GB

這些規格對於這個應用已經綽綽有餘。但是,我們建議使用帶有GPU的電腦來運行此專案,以便您可以立即看到結果。否則,訓練模型的等待時間可能會花費一些時間。另一方面,這是該項目所需的函式庫:

  • keras 2.2.4
  • matplotlib 2.1.1
  • numpy 1.17.4
  • opencv-python 3.4.3.18
  • tensorflow-gpu 1.11.0
  • scikit-image 0.15.0
  • scikit-learn 0.19.1
  • scipy 1.1.0

如同我們以往的建議,在完成專案教學之前,請先安裝函式庫。也請注意這些函式庫可能不是最新版本,因此這個程式可能不適用於較早或較晚版本的函式庫。

原理

我們要在此專案中使用的神經網路架構基於長短期記憶模型(LSTM)。它是一種人工循環神經網路,主要用於時間序列資料的預測。 LSTM包含一個由輸入、輸出和遺忘閥組成的單元。典型的LSTM單元如下所示:

資料來源:https://bhrnjica.net/2019/04/08/in-depth-lstm-implementation-using-cntk-on-net-platform/

作為簡要說明,LSTM單元的輸入是資料x的時間序列集,它經歷了多個sigmoid activation閥,每個閥計算一個確定的函數以計算單元狀態。我們提供的只是LSTM工作原理非常簡要的解釋,有關LSTM的更多資訊,最好參加一門深度學習課程以進一步理解這些概念。

軟體

在學習了有關LSTM的一些知識之後,我們想瞭解如何將LSTM實施到程式中。要閱讀本教學,請參考我們Github中的LSTM_demo.py。

https://github.com/danrustia11/WeatherLSTM

打開演示程式後,您可以看到以下原始程式碼:

1)首先,我們要調用運行該程式所需的函式庫。除此之外,我們想調用一些資料條件函數。與其他LSTM演示相比,我們想在這裡展示使用整理過的輸入資料執行LSTM預測的重要性。正如人們所期望的那樣,LSTM並不是預測的完美解決方案。如果從資料中發現的模式很少,那麼LSTM仍然無法預測您的資料。因此,我們要先對資料進行條件處理。除此之外,我們希望通過設置亂數產生器來使結果可再現。

2)接下來,我們只想使用該程式所需的其他函式庫。特別是我們希望正規化資料以進行訓練。正規化對於提高模型效率非常重要。

3)在這裡,您可以設置n_timestamp,即要用作預測輸入的時間戳記數(在本例中為天數)。因為我們要在進行預測之前考慮模型應檢查多少資料所以這很重要。這取決於要應用在哪個方面,假設我們要進行天氣預報,那麼我們可能至少需要一週的資料才能預測第二天的資料。

我們這裡也有訓練天數train_days,這樣可以確保模型根據歷史資料學習幾種模式, testing_days是我們要預測的天數。對於訓練,我們有n_epochs,即訓練所需的回合數。由於我們能夠事先測試該程式,因此大約25個epoch就足以訓練模型而不會過度擬合。

最後,我們有filter_on變數,用於啟動資料過濾器。

4)我們要在這裡選擇模型類型,我們要使用兩個LSTM細胞堆疊在一起的堆疊模型。

5)我們的資料來自下方網址,我們將使用臺灣環境保護局提供的臺灣宜蘭縣的每日環境溫度。

6)這邊我們對資料集執行中值過濾和高斯過濾。

7)接下來,我們要根據之前設置的變數設置訓練和測試資料集。

8)此處將資料標準化,範圍是0到1。

9)我們的資料是根據之前宣告的分割時間戳記數。

這意味著我們使用n_timestamps來預測第二天。預測程式執行n_timestamps的移動視窗(moving window)以進行預測

10)現在我們要使用Keras建構LSTM模型。

11)我們從這裡開始模型訓練。如果您無法執行訓練程式,那麼減少batch size可能是一個不錯的解決方案。

12)之後我們希望基於測試資料集來預測資料,我們還希望根據正規化過程將資料轉換回其原始值。

13)最後我們要顯示預測結果,包括原始資料、n個預測天數和前75天。

使用這些程式碼顯示訓練曲線、殘差圖和散點圖,作為結果的參考我們還將MSE和r2包括在內。

結果

如果您使用我們的預設參數,可以看到以下結果:

圖1.堆疊式LSTM預測結果,使用10個輸入天的篩檢程式。

從結果可以看出,我們的模型預測是成功的,但是從預測的天數(n天)可以看出,錯誤通常是由於資料的意外上升或下降(例如在350-360天),不過在前75天模型可以正確的遵循資料模式。

但是為了嘗試調整LSTM模型,我們也使用不同的參數執行程式:

 

從表中可以看出,與其他類型相比,堆疊式LSTM的性能最佳,還可以看到單細胞在輸入100天後效果很好,但是我們發現這種設置在計算上消耗過大,雙向LSTM在輸入天數較多的情況下也表現較差。

最後,我們想證明調節資料對執行LSTM來說確實很重要,常理來講預測的準確率並不會達到99.9%,而且我們在這個專案中只是想預測溫度,而不是像火山爆發這類的事件。為了證明我們的觀點,以下是未經過濾的結果:

圖2. 堆疊式LSTM預測結果,沒有使用10個輸入天的過濾器。

我們可以看到,如果沒有使用過濾器,則LSTM模型只能遵循該模式,但誤差幅度更大。結果仍然是會產生的,有點合理但是不是太精確。以下是對結果進行定量比較的表格:

總結

在這個專案中,我們發現LSTM是預測資料的好工具,但是從這裡我們可以看到使用LSTM可以學到一些經驗。首先,輸入更多的天數並不真正意味著該模型將更加準確,除此之外,資料調節可能有助於使模型更準確,最後,即使我們沒有展示,LSTM也需要一定數量的資料才能實際應用。從這些經驗中,我們可以想像LSTM實際應用在預測股票、天氣、趨勢等方面。

Github:

https://github.com/danrustia11/WeatherLSTM

 

參考資料:

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/

https://www.kdnuggets.com/2018/11/keras-long-short-term-memory-lstm-model-predict-stock-prices.html

https://bhrnjica.net/2019/04/08/in-depth-lstm-implementation-using-cntk-on-net-platform/

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including App Inventor, Lego robot and IoT (Arduino / Raspberry Pi). Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw

25 Feb 2020, 1:51