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