预测模型用于许多不同的领域和应用程序。例如,根据最近几天,几周或几年内的需求预测产品的需求。但是,在现实生活中,模型中应包括其他时变功能,例如相关产品的需求,因为它们对预测值的影响也可能随时间变化。
这样的时间序列分析应用程序,包括一个以上功能的过去历史,属于多元时间序列问题和递归神经网络的一类。 (RNN)是解决多元时间序列问题的好方法。
在此博客文章中,我们想展示如何通过自行车共享案例研究将**基于长期记忆(LSTM)**的RNN用于多变量时间序列预测,在该案例中,我们基于多个输入功能来预测自行车的需求。
单变量时间序列:仅收集一个变量的历史记录作为分析的输入。例如,仅随时间推移从每秒一次测量房间温度的传感器收集的温度数据。
多元时间序列:收集多个变量的历史记录作为分析的输入。例如,在三轴加速度计中,随时间测量了三个加速度,每个轴(x,y,z)一个。
案例研究-根据伦敦自行车共享数据集预测自行车需求
在我们的示例中,我们使用伦敦自行车共享Kaggle的数据集。数据集有10列,包括时间戳,新自行车份额(cnt)的计数,以及其他独立功能,例如以°C为单位的实际温度(t1),以°C为单位的毡温(t2)或是否是假期一天还是不一天(isholiday)。下面是不同输入功能的概述:
“时间戳”-用于将数据分组的时间戳字段
TF =“ cnt”-新自行车份额的计数
F 1 =“ t1”-以C为单位的实际温度
F 2 =“ t2”-C中的温度“感觉像”
F 3 =“ hum”-湿度百分比
F 4 =“ windspeed”-风速,以km / h为单位
F 5 =“ weathercode”-天气类别
F 6 =“ isholiday”-布尔字段-1个假期/ 0个非假期
F 7 =“ isweekend”-布尔字段-如果一天是周末,则为1
F8 =“季节”-类别气象季节:0-春季;1夏;2跌; 3冬
自行车份额(TF)的数量可以解释为给定时间t上对自行车的需求,如时间戳功能所定义。时间粒度为小时,即数据集中的每个记录指的是在数据收集所使用的时间窗口中每小时对自行车的需求。此处的目标是根据过去的需求值以及其他功能的过去值来预测自行车的需求。
有监督的学习问题
因此,该案例研究可以被视为监督学习问题。过去的需求(即新自行车份额的数量)以及最近10个小时内其他功能的过去值代表输入。我们的目标是预测下一个小时的自行车需求。
使用多对一RNN架构预测需求
我们决定采用多对一的递归神经体系结构。这是一种常用的神经体系结构,仅在整个特征向量序列通过后才处理输入特征的n个向量的序列并产生输出。此外,在训练过程中通过循环网络处理顺序数据时,有三种类型的体系结构可供选择:
- **多对多体系结构:**在这种情况下,输入和目标是向量序列。有两种方法可以实现此目的。序列的每个向量在每个时间t都会产生响应。或者,在另一个循环层开始生成输出序列之前,首先由循环层逐步处理输入序列,提取输入序列的密集表示。
- **多对一架构:**只有最后一个特征向量的处理才能触发网络响应,这是我们为实施此案例研究而采用的架构类型。这里的输入是特征向量的序列,但是输出只是一个值或向量。
- **一对多体系结构:**在这种情况下,输入只是固定张量,而输出是向量序列。这种架构的一个例子是图像字幕。
提示:在部署过程中,可以通过创建包含一个或多个预测值的输入序列,使用多对一体系结构来生成序列。
为了开始使用递归神经网络和LSTM,我们推荐以下博客文章:
了解LSTM
用LSTM生成文本
我们选择使用基于LSTM的多对一RNN。该网络包括一个接受数据序列的输入层,一个用于处理序列的LSTM层(实现多对一层)以及一个具有激活功能ReLU的密集层,以预测目标特征的下一个值。图1显示了该体系结构。
图1.网络架构
在图2中,您可以看到LSTM层的多对一行为。该图以所谓的展开方式向您显示了网络的LSTM层,其中考虑了最近5个时间步骤。
图2.多元时间序列的LSTM层的展开结构
考虑到时间t-5处的特征向量和一些初始隐藏状态,该层开始。请记住,时间t-5处的特征向量包括需求值以及时间t-5处所有其他特征的值。根据此输入,将更新LSTM单元的隐藏状态,并将其与特征向量一起在时间t-4处馈入LSTM单元的下一个副本,依此类推,直到时间t-1为止。
在处理了前5个时间步长的所有特征向量之后,隐藏状态应该能够通过激活ReLU将必要的信息馈送到输出密集层中,以预测下一个时间步长t的需求值。
像这样的网络需要一个训练集,该训练集具有在接下来的时间步长上与需求相关的5个特征向量的序列。
有许多种可以使用数据的方式。例如,第二天就已经知道诸如季节,isweekend或isholiday之类的信息,这些信息可以用作附加的输入功能,以增加分析的丰富度。
首先实施训练申请-分步进行
图3中的工作流涵盖了从读取,预处理,定义和培训网络到在测试集上执行网络并评估其性能的所有步骤。
让我们详细看一下不同的步骤。
图3.此工作流读取和预处理数据,并构建,训练和评估基于LSTM的RNN。(单击图像以查看放大的版本。)
现在创建训练样本
工作流程通过使用新的(更快的)CSV阅读器读取london_merged.csv文件开始节点。(在此博客文章中了解有关新文件处理框架的更多信息。)接下来,使用“提取日期和时间”字段从时间戳字段(月日,星期几,月和小时)中提取一些时间功能。 节点。
删除timestamp列后,我们剩下13个属性。然后将数据分为两个子集-一个用于训练,一个用于测试和验证集。接下来,使用规范化器对数据进行规范化训练集和Normalizer的节点(应用) 其他子集的节点。
在我们的案例研究中,我们采用了长度为n = 10的序列。这意味着每个训练样本应包括一个输入矩阵,该矩阵由最近10个时间步的特征向量和相关的目标值组成。
让我们为此举一个小例子。假设我们有一个多元时间序列,其中包含来自x,y,z三个来源的值,并且假设我们根据前5个时间步长进行了预测。在这种情况下,输入矩阵可以如下组织。
该矩阵的形状为“ 5,3”,沿时间维度为5,沿特征维度为3。
在KNIME Analytics Platform中,此矩阵可由Keras Network Learner创建 基于通过以下顺序串联上述矩阵中的单元而获得的向量的节点:
x(t-5),x(t-4),x(t-3),x(t-2),x(t-1),y(t-5),y(t-4),y (t-3),y(t-2),y(t-1),z(t-5)z(t-4),z(t-3),z(t-2),z(t -1)
Keras节点
这是一个接一个的功能,其值按从最新到最新的顺序排序。然后,我们将所有这些值分组到一个收集单元中,并将它们馈送到网络中。接受输入数据的层通常是Keras输入层 节点。如果在Keras输入层节点的配置窗口中将输入形状设置为“ 5,3”,则Keras Network Learner节点将自动将收集单元中的值转换为所需的矩阵。
创建和重新利用向量
在“重组训练集”和“重组测试和验证集”元节点中执行和创建此类向量。图4向您显示“重组训练集”元节点的内容,与“重组测试和验证集”元节点的内容相似。
图4.“重组训练集”元节点的内容,以所需顺序创建10个过去特征向量的序列
元节点以数据集列上的循环开始。在每次迭代中,都会处理一列。在后柱 循环主体中的“节点”(位于“循环开始”节点与“循环结束”节点之间)通过将滞后值设置为10,创建当前列的n = 10个过去值的序列。“滞后列”节点产生的时间序列遵循此顺序:
x(t-1)x(t-2)x(t-3)... x(t-9)x(t-10)
但是,网络需要按时间顺序递增的输入序列,例如:
x(t-10)x(t-9)…x(t-3)x(t-2)x(t-1)
“ Resort Columns”元节点适当地重新排序该序列。循环结束(列追加)的输出 节点具有特征向量和相应目标的排序序列,作为下一个时间步的需求值。
现在,该表随时间进行了拆分:一侧的所有列在时间t都具有当前值;另一方面,所有列的过去值分别位于
t-10,t-9,…,t-1。
现在,我们查看包含所有具有当前值的列的表,并除去“ cnt”列(其中包含第t天的自行车需求,即我们的目标值)以外的所有列。我们在一侧创建了输入序列,在另一侧创建了相应的目标。使用“创建集合列”将先前特征向量的序列聚合到集合单元中节点。最后,这两部分与Column Appender重新结合在一起节点。我们的训练集现在可以开始了。
定义,训练和评估网络
在此案例研究中,我们选择了一个基本的RNN结构,可以通过堆叠多个LSTM层来优化和改进这些结构,包括诸如丢失以避免过度拟合之类的正则化技术。
我们在这里实现的简单网络包括三层:
- 输入层,用于定义通过Keras输入层实现的输入形状节点。在时间序列的情况下,输入形状是一个元组,表示为
n,m,其中n是序列的长度,m在逗号后是每个时间步长的特征向量的大小。在我们的示例中,输入形状为10,13。 - 通过Keras
LSTM层实现的LSTM层节点。在多对一的体系结构中,我们仅在处理了输入向量序列之后才需要输出。因此,“返回序列”复选框未激活。对于设置选项“单位”,我们使用100。
注意:
LSTM在状态单元格C(t)中存储先前的信息,并产生输出矢量h(t)。C(t)和h(t)具有相同的大小。这里的“单位”参数指的是这样一个向量的大小。因此,设置“单位”不指序列长度,不应与图2中的LSTM单位数量混淆。在图2中,我们使用LSTM单位在展开的表示形式中描述LSTM层的一个副本。 - 通过Keras密集层实现的输出层使用激活功能ReLU的节点。
在图3中,您可以看到如何使用工作流左上角的棕色节点序列来构建此网络。每个棕色节点都构建了一层网络。
提示:对于所有负值,激活函数ReLU为0,对于所有正值,标识函数为。在我们的《使用KNIME进行无代码深度学习》一书中 , 我们描述了常用的激活函数,并提供了有关何时使用哪种激活函数的一些技巧。
现在我们已经预处理了数据并定义了网络,我们可以使用Keras Network Learner训练网络节点。节点的配置窗口使设置所有训练参数变得容易。以下是此案例研究的设置:
图5.测试集上的网络性能
现在我们有了训练有素的模型,我们可以为部署构建第二个工作流程。
现在部署模型以预测需求
图6显示了一个简单的部署工作流,该工作流根据最近10个小时的需求和其他功能来预测下一小时的需求。
该工作流程将读取新数据,并执行与培训工作流程相同的预处理步骤。这意味着使用相同的归一化方法从时间戳中提取字段,创建特征向量并将其聚合为一个向量,以便Keras Network Executor节点可以创建输入矩阵。然后,应用训练后的网络,并对预测值进行归一化和舍入。
图6.此工作流将训练有素的网络应用于一些新数据,以预测下一个小时的需求。(单击图像以查看放大的版本。)
使用递归循环不仅可以预测下一小时的需求,还可以预测更长的需求
要不仅预测接下来一个小时的需求,还可以预测接下来几个小时的需求,可以使用递归循环。KNIME Hub上的以下工作流程可以用作实现递归循环的起点。