神经网络
RNN:循环神经网络-如何成功地在Python中建模顺序数据
一个对rnn的可视化解释和一步一步的使用Keras和Tensorflow Python库构建它们的指南
介绍
建模和预测顺序数据需要不同于标准回归或分类的方法。幸运的是,有一种称为循环神经网络(RNNs)的特殊类型的神经网络是专门为此目的设计的。
在这篇文章中,我将介绍RNN的结构,并给出一个完整的示例,说明如何在Python中使用Keras和Tensorflow构建一个简单的RNN。
内容
- 看看机器学习的世界
- 循环神经网络的架构
- 如何构建和训练你自己的RNN的Python示例
看看机器学习的世界
虽然神经网络最常被用在带有标签的训练数据的监督方式下,我觉得他们独特的机器学习方法值得一个单独的类别。
循环神经网络有自己的子分支,由简单rnn、长、短期记忆(LSTMs)和门控循环单元(gru)组成。
下图是互动,所以请点击不同的类别放大并显示更多.
如果你喜欢数据科学和机器学习,请订阅收到我的新文章的邮件。
循环神经网络(RNNs)的结构
首先,让我们回想一下典型的前馈神经网络是什么样的。注意,它可以包含任意数量的输入节点、隐藏节点和输出节点。下面的2-3-2结构纯粹是为了说明。
接下来,如果我们看看RNN,我们会注意到一个轻微的区别。RNN内部的隐藏单元有一个内置的反馈循环,使信息可以多次传回到同一个节点。这些隐藏单元通常被称为复发性单位.
循环单元处理预定义数量的信息步伐,每次通过激活函数传递一个隐藏状态和特定时间步长的输入。
步伐-单处理输入通过循环单元。例如,如果你只有一个时间步,那么你的输入只会被处理一次(相当于一个普通的隐藏节点)。如果您有七个时间步,那么您的输入将被处理七次。
下图展示了循环单元内部的反馈循环:
注意,在初始时间步中,隐藏状态h0初始化为0。接下来,输出(一个隐藏的状态h在t + 1)返回给一个循环单元,并与以下输入一起再次处理:
该过程重复进行,直到达到指定的时间步数。
让我们把所有这些联系在一起,看看一个简单的RNN有一个输入、一个隐藏节点(包含三个时间步)和一个输出会是什么样子。
为了帮助更详细地解释发生了什么,让我们看一个简单的例子。
假设你想根据过去三天的气温序列来预测明天的气温。然后:
- 输入-虽然你可能只有一个输入节点,你必须传递三个数字序列作为你的输入,因为这是循环层所需要的,例如[x0, x1, x2],…,[x_{n-2}, x_{n-1}, x_{n}]。
- 复发性层-在一个典型的前馈神经网络中,隐藏节点有两个参数:权重和偏差。然而,一个循环层有三个参数优化:输入的权重,隐藏单元的权重和偏差。注意,即使您有10个时间步,它仍然是3个参数。
- 培训-使用反向传播算法训练一个典型的前馈神经网络。同时,训练RNN使用稍微修改的反向传播版本,其中包括时间展开来训练网络的权值。该算法以计算梯度向量为基础,称为反向传播的时间或BPTT为短。
现在您已经熟悉了简单RNN的体系结构,让我们看一个Python示例。
如何构建和训练你自己的RNN的Python示例
设置
我们需要以下数据和库:
- 来自Kaggle的澳大利亚天气数据(许可证:知识共享,数据的原始来源:澳大利亚联邦气象局).
- 熊猫而且Numpy对数据操作
- 情节数据可视化
- Tensorflow / Keras循环神经网络
- Scikit-learn图书馆把数据分成train-test样本,用于数据缩放(MinMaxScaler),以及其他模型评估(mean_squared_error)
让我们导入所有的库:
上面的代码打印本例中使用的包版本:
Tensorflow / Keras: 2.7.0
熊猫:1.3.4
numpy: 1.21.4
sklearn: 1.0.1
情节:5.4.0
接下来,我们下载并摄取澳大利亚的天气数据(来源:Kaggle).我们还执行一些简单的数据操作,并导出一个新的变量(中位温度)供我们使用。
考虑到数据包含澳大利亚多个地点的天气信息,让我们选择一个城市(堪培拉),并在图表上绘制日平均温度。
循环神经网络(RNN)的训练与评价
在我们训练和评估我们的循环神经网络之前,我们需要创建一个函数,它将帮助我们重新塑造数据,以遵循所需的格式。
上面的函数可以为任意数量的时间步重新构造数据。例如,我使用7个时间步(即,7天的温度序列来预测第二天的气温),它将像这样分割数据:
现在我们可以训练和评估我们的RNN。对于这个例子,我们使用了一个非常简单的神经网络,它有四层,每层只有一个节点。您可以通过添加额外的层、节点或更改激活函数来进行试验。
我对下面的代码进行了广泛的注释,以便让您清楚地了解每个部分的作用。因此,我不会在文章正文中重复同样的内容。
上面的代码打印出我们的循环神经网络的总结和评估指标如下:
现在让我们在图表上绘制结果,并比较实际值和预测值。注意,我们使用inverse_transform函数将目标和预测从缩放(我们在训练RNN之前使用MinMaxScaler)转换为原始值范围。
以上结果适用于测试数据集。这个预测看起来相当准确,但请记住,我们在每种情况下使用7个先前的数据点,只预测下一个数据点。因此,如果我们试图预测未来的多个点,这个特定模型的结果将会非常不准确,正如我将在后面的示例中演示的那样。
利用RNN进行预测
您还记得,在上述模型的训练和预测过程中,我们将序列中的每8个观测作为我们的目标。但是,如果我们想使用模型为数据框架中的每个项目(天)生成预测呢?下面的代码就是这样做的:
由于我们将模型预测添加到原始数据框架中,我们可以使用它来绘制结果。
还是那句话,很不错的结果记住我们只预测了未来一天的温度。
如果我们试图预测未来365天的气温,每次只预测一天会怎么样?我们将尝试通过在我们的7天序列中不断添加新的预测,同时从序列中删除最老的预测。
最后,我们重用前一步中的图表绘制代码来显示过去两年的结果+未来365天的预测。
替换:
x=dfCan['Date']→x=dfCan2['Date'][-730:] #
y=dfCan['MedTemp']→y=dfCan2['MedTemp'][-730:] #用于第一次跟踪
y=dfCan['MedTemp_prediction']→y=dfCan2['MedTemp_prediction'][-730:] #用于第二次跟踪
我们可以看到使用现有的RNN模型的时间超过天+ 1预测是不明智的。之所以会有这样的结果,是因为我们设计它只是为了提前一天进行预测,而且部分受到了rnn相对“短记忆”的影响。
在接下来的文章中,我将分析循环神经网络的更高级版本,例如长、短期记忆而且门控循环单位(GRU)所以别忘了订阅不要错过他们。
最后的评论
我真诚地希望您喜欢阅读这篇文章,并获得一些新的知识。
请使用本文提供的代码来构建您自己的循环神经网络。你可以在我的GitHub库.
在我努力使我的文章对读者更有用的时候,如果您能告诉我是什么驱使您阅读这篇文章,以及它是否给了您所寻找的答案,我将不胜感激。如果没有,那么缺少了什么?
干杯!
扫罗Dobilas
如果你已经花了这个月的学习预算,下次请记得我。我加入Medium的个性化链接: