【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享

简介: 【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享

长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络,能够学习长期依赖关系。



视频:LSTM神经网络架构和工作原理及其在Python中的预测应用

image.png


么是依赖关系?

假设您在观看视频时记得前一个场景,或者在阅读一本书时您知道前一章发生了什么。

传统的神经网络无法做到这一点,这是一个主要缺点。例如,假设您想对电影中每一点发生的事件进行分类。目前尚不清楚传统的神经网络如何利用电影中先前事件来推理后来的事件。

递归神经网络解决了这个问题。它们是带有循环的网络,允许信息持续存在。循环神经网络有循环。

在上图中,一大块神经网络,查看一些输入x并输出一个值h. 循环允许信息从网络的一个步骤传递到下一个步骤。


这些循环使循环神经网络看起来有点神秘。然而,如果你想得更多,就会发现它们与普通的神经网络并没有什么不同。循环神经网络可以被认为是同一网络的多个副本,每个副本都将消息传递给后继者。考虑一下如果我们展开循环会发生什么:

这种链状性质表明循环神经网络与序列和列表密切相关。它们是用于此类数据的神经网络的自然架构。在过去的几年里,将 RNN 应用于各种问题取得了令人难以置信的成功:语音识别、语言建模、翻译、图像字幕……不胜枚举。这些成功的关键是使用“LSTM”,这是一种非常特殊的循环神经网络,几乎所有基于循环神经网络的令人兴奋的结果都是用它们实现的。本文将探讨的正是这些 LSTM。


长期依赖问题

下面是一个关于如何使用循环神经网络(RNN)来拟合语言模型的例子。

RNN 的吸引力之一是它们可能能够将先前的信息与当前任务联系起来,例如使用先前的视频帧可能会告知对当前帧的理解。如果 RNN 可以做到这一点,它们将非常有用。但他们可以吗?

有时,我们只需要查看最近的信息即可执行当前任务。例如,考虑一个语言模型试图根据之前的单词预测下一个单词。如果我们试图预测“云在天空”中的最后一个词,我们不需要任何进一步的上下文——很明显下一个词将是天空。在这种情况下,相关信息与所需位置之间的差距很小,RNN 可以学习使用过去的信息。


但也有我们需要更多上下文的情况。考虑尝试预测文本“我在中国长大……我说地道的中文”中的最后一个词。最近的信息表明,下一个词可能是一种语言的名称,但如果我们想缩小哪种语言的范围,我们需要中国的上下文,从更远的地方。相关信息和需要的点之间的差距完全有可能变得非常大。

随着差距的扩大,RNN 变得无法学习连接信息。


LSTM 网络

长短期记忆网络——通常称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。它们在解决各种各样的问题时表现出色,现在被广泛使用。LSTM 被明确设计为避免长期依赖问题。长时间记住信息实际上是他们的默认行为,而不是他们难以学习的东西!

所有循环神经网络都具有神经网络的重复模块链的形式。在标准 RNN 中,此重复模块将具有非常简单的结构,例如单个 tanh 层。


LSTM 也有这种链状结构,但重复模块有不同的结构。不是只有一个神经网络层,而是三个部分组成,以一种非常特殊的方式进行交互。

LSTM 的工作方式非常类似于 RNN 单元。这是 LSTM 网络的内部功能。LSTM 由三个部分组成,如图所示,每个部分执行一个单独的功能。第一部分选择来自前一个时间戳的信息是被记住还是不相关并且可以被遗忘。在第二部分中,单元尝试从该单元的输入中学习新信息。最后,在第三部分,单元将更新的信息从当前时间戳传递到下一个时间戳。LSTM 单元的这三个部分称为门。第一部分称为忘记门或遗忘门,第二部分称为输入门,最后一部分称为输出门。



Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析


每年的降雨量数据可能是相当不平稳的。与温度不同,温度通常在四季中表现出明显的趋势,而雨量作为一个时间序列可能是相当不平稳的。夏季的降雨量与冬季的降雨量一样多是很常见的。

下面是某地区2020年11月降雨量数据查看文末了解数据获取方式的图解。

作为一个连续的神经网络,LSTM模型可以证明在解释时间序列的波动性方面有优势。

使用Ljung-Box检验,小于0.05的p值表明这个时间序列中的残差表现出随机模式,表明有明显的波动性。

>>> sm.stats.acorr_ljungbox(res.resid, lags=\[10\])

Ljung-Box检验

Dickey-Fuller 检验

数据操作和模型配置

该数据集由722个月的降雨量数据组成。

选择712个数据点用于训练和验证,即用于建立LSTM模型。然后,过去10个月的数据被用来作为测试数据,与LSTM模型的预测结果进行比较。

下面是数据集的一个片段。

然后形成一个数据集矩阵,将时间序列与过去的数值进行回归。

# 形成数据集矩阵
    for i in range(len(df)-previous-1):
        a = df\[i:(i+previous), 0\]
        dataX.append(a)
        dataY.append(df\[i + previous, 0\])

然后用MinMaxScaler对数据进行标准化处理。

将前一个参数设置为120,训练和验证数据集就建立起来了。作为参考,previous = 120说明模型使用从t - 120到t - 1的过去值来预测时间t的雨量值。

前一个参数的选择要经过试验,但选择120个时间段是为了确保识别到时间序列的波动性或极端值。

# 训练和验证数据的划分
train_size = int(len(df) * 0.8)
val\_size = len(df) - train\_size
train, val = df\[0:train\_size,:\], df\[train\_size:len(df),:\]# 前期的数量
previous = 120

然后,输入被转换为样本、时间步骤、特征的格式。

# 转换输入为\[样本、时间步骤、特征\]。

np.reshape(X_train, (shape\[0\], 1, shape\[1\]))

模型训练和预测

该模型在100个历时中进行训练,并指定了712个批次的大小(等于训练和验证集中的数据点数量)。

# 生成LSTM网络
model = tf.keras.Sequential()
# 列出历史中的所有数据
print(history.history.keys())
# 总结准确度变化
plt.plot(history.history\['loss'\])

下面是训练集与验证集的模型损失的关系图。

预测与实际降雨量的关系图也被生成。

01

02

03

04




# 绘制所有预测图

plt.plot(valpredPlot)

预测结果在平均方向准确性(MDA)、平均平方根误差(RMSE)和平均预测误差(MFE)的基础上与验证集进行比较。

mda(Y_val, predictions)0.9090909090909091
>>> mse = mean\_squared\_error(Y_val, predictions)
>>> rmse = sqrt(mse)
>>> forecast_error
>>> mean\_forecast\_error = np.mean(forecast_error)

  • MDA: 0.909
  • RMSE: 48.5
  • MFE: -1.77

针对测试数据进行预测

虽然验证集的结果相当可观,但只有将模型预测与测试(或未见过的)数据相比较,我们才能对LSTM模型的预测能力有合理的信心。

如前所述,过去10个月的降雨数据被用作测试集。然后,LSTM模型被用来预测未来10个月的情况,然后将预测结果与实际值进行比较。

至t-120的先前值被用来预测时间t的值。

# 测试(未见过的)预测

np.array(\[tseries.iloctseries.iloc,t

获得的结果如下

  • MDA: 0.8
  • RMSE: 49.57
  • MFE: -6.94

过去10个月的平均降雨量为148.93毫米,预测精度显示出与验证集相似的性能,而且相对于整个测试集计算的平均降雨量而言,误差很低。

结论

在这个例子中,你已经看到:

  • 如何准备用于LSTM模型的数据
  • 构建一个LSTM模型
  • 如何测试LSTM的预测准确性
  • 使用LSTM对不稳定的时间序列进行建模的优势
相关文章
|
1天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】循环神经网络(RNN)与LSTM详解
【4月更文挑战第30天】本文探讨了处理序列数据的关键模型——循环神经网络(RNN)及其优化版长短期记忆网络(LSTM)。RNN利用循环结构处理序列依赖,但遭遇梯度消失/爆炸问题。LSTM通过门控机制解决了这一问题,有效捕捉长距离依赖。在Python中,可使用深度学习框架如PyTorch实现LSTM。示例代码展示了如何定义和初始化一个简单的LSTM网络结构,强调了RNN和LSTM在序列任务中的应用价值。
|
1天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】卷积神经网络(CNN)的原理与应用
【4月更文挑战第30天】本文介绍了卷积神经网络(CNN)的基本原理和结构组成,包括卷积层、激活函数、池化层和全连接层。CNN在图像识别等领域表现出色,其层次结构能逐步提取特征。在Python中,可利用TensorFlow或PyTorch构建CNN模型,示例代码展示了使用TensorFlow Keras API创建简单CNN的过程。CNN作为强大深度学习模型,未来仍有广阔发展空间。
|
1天前
|
数据采集 数据挖掘 测试技术
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
10 1
|
1天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
1天前
|
Python
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
|
1天前
|
机器学习/深度学习 计算机视觉 Python
【Python 机器学习专栏】图像数据的特征提取与预处理
【4月更文挑战第30天】本文探讨了图像数据的特征提取与预处理在机器学习中的重要性。图像数据具有大容量、信息丰富和冗余性高的特点。特征提取涉及颜色、纹理和形状特征;预处理包括图像增强、去噪和分割。Python的OpenCV和Scikit-image库在处理这些任务时非常有用。常见的特征提取方法有统计、变换和基于模型的方法,而预处理应注意保持图像真实性、适应性调整及验证评估。有效的特征提取和预处理能提升模型性能,Python工具使其更高效。
|
1天前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习专栏】文本数据的特征提取与表示
【4月更文挑战第30天】本文探讨了文本特征提取与表示在机器学习和NLP中的重要性。介绍了词袋模型、TF-IDF和n-gram等特征提取方法,以及稀疏向量和词嵌入等表示方式。Python中可利用sklearn和gensim库实现这些技术。有效的特征提取与表示有助于将文本数据转化为可处理的数值形式,推动NLP和机器学习领域的进步。
|
10天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
4天前
|
网络协议 算法 Linux
【Linux】深入探索:Linux网络调试、追踪与优化
【Linux】深入探索:Linux网络调试、追踪与优化
|
1天前
|
JSON 网络协议 Linux
Linux ip命令:网络的瑞士军刀
【4月更文挑战第25天】
7 1

热门文章

最新文章