当前位置: 首页 > 科技观察

基于Keras的LSTM多变量时间序列预测

时间:2023-03-16 12:32:27 科技观察

神经网络,例如长短期记忆(LSTM)递归神经网络,可以几乎无缝地对具有多个输入变量的问题进行建模。这给时间序列预测带来了很大的好处,因为经典的线性方法很难适应多变量或多输入的预测问题。通过本教程,您将学习如何在Keras深度学习库中构建用于多元时间序列预测的LSTM模型。完成本教程后,您将学习:如何将原始数据集转换为适合时间序列预测的数据集如何处理数据并将其拟合到LSTM模型以解决多变量时间序列预测问题。如何进行预测并将结果重新调整为初始单位。让我们开始吧!教程概述本教程分为三个部分,分别是:空气污染预测准备基础数据搭建多元LSTM预测模型Python环境本教程假设你已经配置了PythonSciPy环境,Python2/3即可。您还需要与TensorFlow或Theano后端一起安装的Keras(2.0版或更高版本)。本教程还假设您已安装scikit-learn、Pandas、NumPy和Matplotlib。空气污染预报本教程将使用空气质量数据集。这是美国驻北京大使馆记录的五年数据集,按小时报告天气和污染水平。这些数据包括日期、PM2.5浓度和天气信息,包括露点、温度、气压、风向、速度和降水持续时间。原始数据中完整的特征列表如下:NO:行号year:年month:月day:dayhour:hourpm2.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值。以下脚本加载原始数据集并将日期时间信息解析为PandasDataFrame索引。删除了“否”列,并为每列指定了一个更清晰的名称。最后将NA值替换为“0”值,删除前一天的数据。运行该示例会打印转换后数据集的前5行,并将转换后的数据集保存到“pollution.csv”。现在数据已经被处理得易于使用,我们可以为每个天气参数创建快速图表并查看我们得到的结果。下面的代码加载“pollution.csv”文件并为每个参数绘制单独的子图(用于分类的风速除外)。运行上述示例会创建一个包含7个子图的大图,显示每个变量5年的数据。空气污染时间序列折线图多变量LSTM预测模型在本节中,我们将采用LSTM模型来解决此预测问题。1.LSTM数据准备第一步是为LSTM模型准备受污染的数据集,这涉及将数据集用作监督学习问题并对输入变量进行归一化。我们将监督学习问题设置为:根据前一时间段的污染指数和天气状况,预测当前时刻(t)的污染情况。此表述简单明了,仅作说明。您可以探索的一些备选方案包括:根据过去一天的天气状况和污染状况,预测下一小时的污染状况。根据过去一天的天气和污染情况以及下一个小时的“预期”天气情况,预测下一个小时的污染情况。我们可以使用之前博客文章中编写的series_to_supervised()函数转换数据集:如何将时间序列问题转换为Python中的监督学习问题(https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/)首先加载“pollution.csv”数据集。标注风速特征(整数代码)。如果再深入一点,你会发现塑料编码可以通过one-hotencoding进一步处理。接下来,对所有特征进行归一化,然后将数据集转化为监督学习问题。之后,删除要预测的时刻(t)的天气变量。完整的代码清单如下。运行上面的示例打印转换数据集的前5行。我们可以看到8个输入变量(输入序列)和1个输出变量(当前污染水平)。这个数据准备过程很简单,我们可以深入了解它,包括:风速的一位高效编码对所有系列数据不断使用增量和季节调整提供超过1小时的输入时间步长最后,它也可能最重要的是,LSTMs在学习序列预测问题时通过时间步长进行反向传播。2.定义和拟合模型在本节中,我们将对多元输入数据拟合LSTM模型。首先,我们必须将准备好的数据集拆分为训练集和测试集。为了加快本次演练的模型训练,我们将只使用第一年的数据来拟合模型,然后使用剩余4年的数据进行评估。下面的示例将数据集拆分为训练集和测试集,然后将训练集和测试集分别拆分为输入和输出变量。最后,输入(X)被重构为LSTM期望的3D格式,即[样本、时间步长、特征]。运行此示例通过测试约9K小时的训练数据和约35K小时的测试数据来输出训练数据的维度以及输入和输出集。我们现在可以定义和拟合LSTM模型。我们将定义一个LSTM,其第一个隐藏层有50个神经元,输出层有1个神经元,用于预测污染。输入数据维度将是1个时间步长,具有8个特征。我们将使用平均绝对误差(MAE)损失函数和随机梯度下降的高效Adam版本。该模型将训练50个时期,批次大小为72。请记住,Keras中LSTM的内部状态在每个批次结束时重置,因此内部状态的函数作为天数的函数可能会有所帮助(尝试证明)。最后,我们通过在fit()函数中设置validation_data参数来跟踪训练过程中的训练和测试损失,并在运行结束时绘制训练和测试损失。3.评估模型模型拟合后,我们可以对整个测试数据集进行预测。我们将预测与测试数据集结合起来并调整测试数据集的大小。我们还使用预期的污染指数缩放测试数据集。根据初始预测值和实际值,我们可以计算模型的错误分数。在这种情况下,我们可以计算与变量相同单位的误差的均方根误差(RMSE)。4.完整示例完整示例如下所示。运行示例首先创建一个图表,显示训练期间的训练和测试损失。有趣的是,我们可以看到测试损失低于训练损失。该模型可能过度拟合训练数据。在训练期间映射RMSE可能会阐明问题。多变量LSTM模型训练期间的训练、测试损失线图在每个训练时期结束时输出训练和测试损失。在运行结束时,输出模型在测试数据集上的最终RMSE。我们可以看到该模型实现了3.836的RMSE,这明显低于持久性模型获得的RMSE(30)。总结在本教程中,您学习了如何将LSTM应用于多变量时间序列预测问题。具体来说,您学习了:如何将原始数据集转换为适合时间序列预测的数据集如何处理数据并将其拟合到LSTM模型以解决多变量时间序列预测问题。如何进行预测并将结果重新调整为初始单位。原文:https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/【本文为专栏组织《机器之心》原文翻译,微信公众号《机器之心》(id:almosthuman2014)》】点此查看作者更多好文