拓端tecdat|Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
原文链接:http://tecdat.cn/?p=23544
原文出处:拓端数据部落公众号
下面是一个关于如何使用长短期记忆网络(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'])
下面是训练集与验证集的模型损失的关系图。
预测与实际降雨量的关系图也被生成。
-
# 绘制所有预测图
-
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.用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类
2.Python中利用长短期记忆模型LSTM进行时间序列预测分析 – 预测电力消耗数据
4.Python中用PyTorch机器学习分类预测银行客户流失模型
6.在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
原文地址:https://www.cnblogs.com/tecdat/p/15196499.html
- 写入Ring Buffer
- Enterprise Library 4 缓存快速入门
- Enterprise Library 4 缓存应用程序块的设计
- 让WordPress 在RSS 中Feed 输出支持“More”标签
- WordPress文章版权保护:复制文字自动添加版权信息
- 替换WordPress 自带默认的 jQuery库, jQuery库页脚加载
- Enterprise Library 4 数据访问应用程序块
- 替换EnterPrise Library 4.0 缓存应用程序块的CacheManager
- Enterprise Library 4.0缓存应用程序块
- 通过.htaccess 让WordPress 的上传文件夹更安全
- asp.net 性能调较
- 零基础学习大数据,搭建Hadoop处理环境
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mysql面对高并发修改的问题处理【2】
- java (多网卡环境下)发送组播广播(multicast/broadcast)失败问题
- activmq:android平台下使用openwire协议连接activemq服务的问题
- Leetcode No.9 回文数
- go-zero微服务框架入门教程
- 聊聊java中的哪些Map:(九)TreeMap源码分析
- 海康IPCamera结合OpenCV图像处理的一般步骤
- 聊聊java中的哪些Map:(十)各种map的总结
- SwiftUI:辅助功能——项目优化示例
- Visualizing the impact of ordered vs. random index insertion in InnoDB (16 顺序插入和随机插入索引的影响可视化分析)
- 一点思考|工作十几年了,竟从未用过do-while!
- springboot 默认日志配置源码
- logback 通过javaconfig实现配置
- springboot通过javaconfig实现logback配置
- 干货来了,vue 3.0 自定义指令变化