本文翻译自Jason Brownlee博士的博客,参阅原文
神经网络诸如长短期记忆(LSTM)递归神经网络,几乎可以无缝地对多变量输入问题进行建模。
这在时间预测问题中非常有用,而经典线性方法难以应对多变量预测问题。
在本教程中,您将了解如何在Keras深度学习库中,为多变量时间序列预测开发LSTM模型。
学习该教程后,您将收获:如何将原始数据集转换为可用于时间序列预测的数据集;
如何准备数据,并使LSTM模型适用于多变量时间序列预测问题;
如何做预测,并将预测的结果重新调整为原始数据单位。
让我们开始吧!
教程概括
该教程分为3部分,包括:空气污染预测
数据准备
多变量LSTM预测模型
Python环境
你可以使用Python 2 或Python 3,需要安装scikit-learn、Numpy、Pandas、Matplotlib、 Scipy、Keras(2.0或更高版本)、TensorFlow或Theano backend等依赖包。
本试验在Anaconda Jupyter Notebook中进行,上述大部分依赖包均已内置,但仍需要安装单独安装TensorFlow、Theano backend。
如果你有任何问题:
1.空气污染预测
该教程中,我们将使用空气质量数据集。
该数据集字段包括日期时间、PM2.5浓度、露点、温度、风向、风速、雨雪累计小时数等,完整特征列表如下:No:行号
year:该行记录的年
month:该行记录的月
day:该行记录的日
hour:该行记录的小时
pm2.5:PM2.5浓度(细颗粒物指环境空气中空气动力学当量直径小于等于 2.5微米的颗粒物。它能较长时间悬浮于空气中,其在空气中含量浓度越高,就代表空气污染越严重)
DEWP:露点(又称露点温度(Dew point temperature),在气象学中是指在固定气压之下,空气中所含的气态水达到饱和而凝结成液态水所需要降至的温度)
TEMP:温度
PRES:大气压力
cbwd:组合风向
lws:累计风速
ls:累计小时下雪量
lr:累计小时下雨量
该数据记录了北京某段时间每小时的气象情况和污染程度,我们将根据前几个小时的记录预测下个小时的污染程度。
你可以下载该数据集,或在线使用:
2.数据准备
我们先看看数据长什么样:
yearmonthdayhourpm2.5DEWPTEMPPREScbwdIwsIsIr
No
12010110NaN-21-11.01021.0NW1.7900
22010111NaN-21-12.01020.0NW4.9200
32010112NaN-21-11.01019.0NW6.7100
42010113NaN-21-14.01019.0NW9.8400
52010114NaN-20-12.01018.0NW12.9700
可以看到日期和时间是分开的,第一步把日期时间合并为一个datetime,以便将其作为Pandas里的索引。
看数据表可知,第一个24小时里,PM2.5这一列有很多空值。因此,我们把第一个24小时里的数据行删掉。剩余的数据里面也有少部分空值,为了保持数据完整性和连续性,只要将空值填补为0即可。
下面的脚本加载了原始数据集,并将日期时间合并解析为Pandas DataFrame索引。删除No(序号)列,给剩下的列重新命名字段。最后替换空值为0,删除第一个24小时数据行。
from pandas import read_csv
from datetime import datetime
# 加载数据
def parse(x):
return datetime.strptime(x, '%Y %m %d %H')
dataset = read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/pollution.csv', parse_dates = [['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse)
#删除No列
dataset.drop('No', axis=1, inplace=True)
# 修改剩余列名称
dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain']
dataset.index.name = 'date'
# 将所有空值替换为0
dataset['pollution'].fillna(0, inplace=True)
# 删除前24小时行
dataset = dataset[24:]
# 打印前5行
print(dataset.head(5))
# 保存数据到pollution.csv
dataset.to_csv('pollution.csv')
打印前5行,并将数据保存到pollution.csv,看一下:
pollution dew temp press wnd_dir wnd_spd snow rain
date
2010-01-02 00:00:00 129.0 -16 -4.0 1020.0 SE 1.79 0 0
2010-01-02 01:00:00 148.0 -