天天看點

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

長短期記憶循環神經網絡等幾乎可以完美地模拟多個輸入變量的問題,這為時間序列預測帶來極大益處。本文介紹了如何在 Keras 深度學習庫中搭建用于多變量時間序列預測的 LSTM 模型。

諸如長短期記憶(LSTM)循環神經網絡的神經神經網絡幾乎可以無縫模組化具備多個輸入變量的問題。

這為時間序列預測帶來極大益處,因為經典線性方法難以适應多變量或多輸入預測問題。

通過本教程,你将學會如何在 Keras 深度學習庫中搭建用于多變量時間序列預測的 LSTM 模型。

完成本教程後,你将學會:

如何将原始資料集轉換成适用于時間序列預測的資料集

如何處理資料并使其适應用于多變量時間序列預測問題的 LSTM 模型。

如何做出預測并将結果重新調整到初始單元。

我們開始吧!

教程概述

本教程分為三大部分,分别是:

空氣污染預測

準備基本資料

搭建多變量 LSTM 預測模型

Python 環境

本教程假設你配置了 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」,放置到目前工作目錄。

基本資料準備

原始資料尚不可用,我們必須先處理它

以下是原始資料集的前幾行資料。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

第一步,将零散的日期時間資訊整合為一個單一的日期時間,以便我們可以将其用作 Pandas 的索引。

快速檢查第一天的 pm2.5 的 NA 值。是以,我們需要删除第一行資料。在資料集中還有幾個零散的「NA」值,我們現在可以用 0 值标記它們。

以下腳本用于加載原始資料集,并将日期時間資訊解析為 Pandas DataFrame 索引。「No」列被删除,每列被指定更加清晰的名稱。最後,将 NA 值替換為「0」值,并删除前一天的資料。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

運作該例子列印轉換後的資料集的前 5 行,并将轉換後的資料集儲存到「pollution.csv」。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

現在資料已經處理得簡單易用,我們可以為每個天氣參數建立快圖,看看能得到什麼。

下面的代碼加載了「pollution.csv」檔案,并且為每個參數(除用于分類的風速以外)繪制了單獨的子圖。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

運作上例建立一個具有 7 個子圖的大圖,顯示每個變量 5 年中的資料。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

多變量 LSTM 預測模型

本節,我們将調整一個 LSTM 模型以适合此預測問題。

LSTM 資料準備

第一步是為 LSTM 模型準備污染資料集,這涉及将資料集用作監督學習問題以及輸入變量歸一化。

我們将監督學習問題設定為:根據上一個時間段的污染指數和天氣條件,預測目前時刻(t)的污染情況。

這個表述簡單直接,隻是為了說明問題。你可以探索的一些替代方案包括:

根據過去一天的天氣情況和污染狀況,預測下一個小時的污染狀況。

根據過去一天的天氣情況和污染狀況以及下一個小時的「預期」天氣條件,預測下一個小時的污染狀況。

我們可以使用之前部落格中編寫的 series_to_supervised()函數來轉換資料集:

如何用 Python 将時間序列問題轉換為監督學習問題(https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/)

首先加載「pollution.csv」資料集。給風速特征打上标注(整型編碼)。如果你再深入一點就會發現,整形編碼可以進一步進行一位有效編碼(one-hot encoding)。

接下來,所有特征都被歸一化,然後資料集轉換成監督學習問題。之後,删除要預測的時刻(t)的天氣變量。

完整的代碼清單如下。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

運作上例列印轉換後的資料集的前 5 行。我們可以看到 8 個輸入變量(輸入序列)和 1 個輸出變量(目前的污染水準)。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

這個資料準備過程很簡單,我們可以深入了解更多相關知識,包括:

對風速進行一位有效編碼

用內插補點和季節性調整使所有序列資料恒定

提供超過 1 小時的輸入時間步長

最後也可能是最重要的一點,在學習序列預測問題時,LSTM 通過時間步進行反向傳播。

定義和拟合模型

在本節中,我們将拟合多變量輸入資料的 LSTM 模型。

首先,我們必須将準備好的資料集分成訓練集和測試集。為了加快此次講解的模型訓練,我們将僅使用第一年的資料來拟合模型,然後用其餘 4 年的資料進行評估。

下面的示例将資料集分成訓練集和測試集,然後将訓練集和測試集分别分成輸入和輸出變量。最後,将輸入(X)重構為 LSTM 預期的 3D 格式,即 [樣本,時間步,特征]。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

運作此示例輸出訓練資料的次元,并通過測試約 9K 小時的資料對輸入和輸出集合進行訓練,約 35K 小時的資料進行測試。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

我們現在可以定義和拟合 LSTM 模型了。

我們将在第一個隐藏層中定義具有 50 個神經元的 LSTM,在輸出層中定義 1 個用于預測污染的神經元。輸入資料次元将是 1 個具有 8 個特征的時間步長。

我們将使用平均絕對誤差(MAE)損失函數和高效的随機梯度下降的 Adam 版本。

該模型将适用于 50 個 epoch,批大小為 72 的訓練。請記住,每個批結束時,Keras 中的 LSTM 的内部狀态都将重置,是以内部狀态是天數的函數可能有所幫助(試着證明它)。

最後,我們通過在 fit()函數中設定 validation_data 參數來跟蹤訓練過程中的訓練和測試損失,并在運作結束時繪制訓練和測試損失圖。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

評估模型

模型拟合後,我們可以預測整個測試資料集。

我們将預測與測試資料集相結合,并調整測試資料集的規模。我們還用預期的污染指數來調整測試資料集的規模。

通過初始預測值和實際值,我們可以計算模型的誤差分數。在這種情況下,我們可以計算出與變量相同的單元誤差的均方根誤差(RMSE)。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

完整示例

完整示例如下所示。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

運作示例首先建立一幅圖,顯示訓練中的訓練和測試損失。

有趣的是,我們可以看到測試損失低于訓練損失。該模型可能過度拟合訓練資料。在訓練過程中測繪 RMSE 可能會使問題明朗。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

在每個訓練 epoch 結束時輸出訓練和測試的損失。在運作結束後,輸出該模型對測試資料集的最終 RMSE。我們可以看到,該模型取得了不錯的 RMSE——3.836,這顯著低于用持久模型(persistence model)得到的 RMSE(30)。

教你搭建多變量時間序列預測模型LSTM(附代碼、資料集)

總結

在本教程中,您學會了如何将 LSTM 應用于多變量時間序列預測問題。

具體點講,你學會了:

原文釋出時間為:2017-11-6