173
技術社區[雲棲]
教你搭建多變量時間序列預測模型LSTM(附代碼、數據集)
長短期記憶循環神經網絡等幾乎可以完美地模擬多個輸入變量的問題,這為時間序列預測帶來極大益處。本文介紹了如何在 Keras 深度學習庫中搭建用於多變量時間序列預測的 LSTM 模型。
諸如長短期記憶(LSTM)循環神經網絡的神經神經網絡幾乎可以無縫建模具備多個輸入變量的問題。
這為時間序列預測帶來極大益處,因為經典線性方法難以適應多變量或多輸入預測問題。
通過本教程,你將學會如何在 Keras 深度學習庫中搭建用於多變量時間序列預測的 LSTM 模型。
完成本教程後,你將學會:
如何將原始數據集轉換成適用於時間序列預測的數據集如何處理數據並使其適應用於多變量時間序列預測問題的 LSTM 模型。
如何做出預測並將結果重新調整到初始單元。
我們開始吧!
本教程分為三大部分,分別是:
- 空氣汙染預測
- 準備基本數據
- 搭建多變量 LSTM 預測模型
- 本教程假設你配置了 Python SciPy 環境,Python 2/3 皆可。
- 你還需要使用 TensorFlow 或 Theano 後端安裝 Keras(2.0 或更高版本)。
- 本教程還假定你已經安裝了 scikit-learn、Pandas、NumPy 和 Matplotlib。
本教程將使用空氣質量數據集。這是美國駐北京大使館記錄了五年的數據集,其按小時報告天氣和汙染水平。
此數據包括日期、PM2.5 濃度,以及天氣信息,包括露點、溫度、氣壓、風向、風速和降水時長。原始數據中的完整特征列表如下:
- NO:行號
- year:年份
- month:月份
- day:日
- hour:時
- pm2.5:PM2.5 濃度
- DEWP:露點
- TEMP:溫度
- PRES:氣壓
- cbwd:組合風向
- Iws:累計風速
- s:累積降雪時間
- Ir:累積降雨時間
我們可以使用這些數據並構建一個預測問題,我們根據過去幾個小時的天氣條件和汙染狀況預測下一個小時的汙染狀況。此數據集亦可用於構建其他預測問題。
您可以從 UCI 機器學習庫中下載此數據集。
- 下載地址:https://archive.ics.uci.edu/ml/datasets/Beijing+PM2.5+Data
下載數據集並將其命名為「raw.csv」,放置到當前工作目錄。
原始數據尚不可用,我們必須先處理它
以下是原始數據集的前幾行數據。
第一步,將零散的日期時間信息整合為一個單一的日期時間,以便我們可以將其用作 Pandas 的索引。
快速檢查第一天的 pm2.5 的 NA 值。因此,我們需要刪除第一行數據。在數據集中還有幾個零散的「NA」值,我們現在可以用 0 值標記它們。
以下腳本用於加載原始數據集,並將日期時間信息解析為 Pandas DataFrame 索引。「No」列被刪除,每列被指定更加清晰的名稱。最後,將 NA 值替換為「0」值,並刪除前一天的數據。
運行該例子打印轉換後的數據集的前 5 行,並將轉換後的數據集保存到「pollution.csv」。
現在數據已經處理得簡單易用,我們可以為每個天氣參數創建快圖,看看能得到什麼。
下麵的代碼加載了「pollution.csv」文件,並且為每個參數(除用於分類的風速以外)繪製了單獨的子圖。
運行上例創建一個具有 7 個子圖的大圖,顯示每個變量 5 年中的數據。
本節,我們將調整一個 LSTM 模型以適合此預測問題。
第一步是為 LSTM 模型準備汙染數據集,這涉及將數據集用作監督學習問題以及輸入變量歸一化。
我們將監督學習問題設定為:根據上一個時間段的汙染指數和天氣條件,預測當前時刻(t)的汙染情況。
這個表述簡單直接,隻是為了說明問題。你可以探索的一些替代方案包括:
- 根據過去一天的天氣情況和汙染狀況,預測下一個小時的汙染狀況。
- 根據過去一天的天氣情況和汙染狀況以及下一個小時的「預期」天氣條件,預測下一個小時的汙染狀況。
我們可以使用之前博客中編寫的 series_to_supervised()函數來轉換數據集:
- 如何用 Python 將時間序列問題轉換為監督學習問題(https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/)
首先加載「pollution.csv」數據集。給風速特征打上標注(整型編碼)。如果你再深入一點就會發現,整形編碼可以進一步進行一位有效編碼(one-hot encoding)。
接下來,所有特征都被歸一化,然後數據集轉換成監督學習問題。之後,刪除要預測的時刻(t)的天氣變量。
完整的代碼列表如下。
運行上例打印轉換後的數據集的前 5 行。我們可以看到 8 個輸入變量(輸入序列)和 1 個輸出變量(當前的汙染水平)。
這個數據準備過程很簡單,我們可以深入了解更多相關知識,包括:
- 對風速進行一位有效編碼
- 用差值和季節性調整使所有序列數據恒定
- 提供超過 1 小時的輸入時間步長
最後也可能是最重要的一點,在學習序列預測問題時,LSTM 通過時間步進行反向傳播。
在本節中,我們將擬合多變量輸入數據的 LSTM 模型。
首先,我們必須將準備好的數據集分成訓練集和測試集。為了加快此次講解的模型訓練,我們將僅使用第一年的數據來擬合模型,然後用其餘 4 年的數據進行評估。
下麵的示例將數據集分成訓練集和測試集,然後將訓練集和測試集分別分成輸入和輸出變量。最後,將輸入(X)重構為 LSTM 預期的 3D 格式,即 [樣本,時間步,特征]。
運行此示例輸出訓練數據的維度,並通過測試約 9K 小時的數據對輸入和輸出集合進行訓練,約 35K 小時的數據進行測試。
我們現在可以定義和擬合 LSTM 模型了。
我們將在第一個隱藏層中定義具有 50 個神經元的 LSTM,在輸出層中定義 1 個用於預測汙染的神經元。輸入數據維度將是 1 個具有 8 個特征的時間步長。
我們將使用平均絕對誤差(MAE)損失函數和高效的隨機梯度下降的 Adam 版本。
該模型將適用於 50 個 epoch,批大小為 72 的訓練。請記住,每個批結束時,Keras 中的 LSTM 的內部狀態都將重置,因此內部狀態是天數的函數可能有所幫助(試著證明它)。
最後,我們通過在 fit()函數中設置 validation_data 參數來跟蹤訓練過程中的訓練和測試損失,並在運行結束時繪製訓練和測試損失圖。
評估模型
模型擬合後,我們可以預測整個測試數據集。
我們將預測與測試數據集相結合,並調整測試數據集的規模。我們還用預期的汙染指數來調整測試數據集的規模。
通過初始預測值和實際值,我們可以計算模型的誤差分數。在這種情況下,我們可以計算出與變量相同的單元誤差的均方根誤差(RMSE)。
完整示例
完整示例如下所示。
運行示例首先創建一幅圖,顯示訓練中的訓練和測試損失。
有趣的是,我們可以看到測試損失低於訓練損失。該模型可能過度擬合訓練數據。在訓練過程中測繪 RMSE 可能會使問題明朗。
在每個訓練 epoch 結束時輸出訓練和測試的損失。在運行結束後,輸出該模型對測試數據集的最終 RMSE。我們可以看到,該模型取得了不錯的 RMSE——3.836,這顯著低於用持久模型(persistence model)得到的 RMSE(30)。
總結
在本教程中,您學會了如何將 LSTM 應用於多變量時間序列預測問題。
具體點講,你學會了:
- 如何將原始數據集轉換成適用於時間序列預測的數據集
- 如何處理數據並使其適應用於多變量時間序列預測問題的 LSTM 模型。
- 如何做出預測並將結果重新調整到初始單元。
最後更新:2017-11-07 11:33:54