【Python TensorFlow】 CNN-GRU卷积神经网络-门控循环神经网络时序预测算法(附代码)

作者:千源万码日期:2025/11/28

资源下载:https://download.csdn.net/download/vvoennvv/92371651

目录

一,概述

传统的时序预测模型在处理复杂时序数据时存在一些问题,比如难以同时提取局部特征和长期依赖关系、对时间序列中的突变模式捕捉能力不足等。为了解决这些问题,我们提出了CNN-GRU混合神经网络模型,将卷积神经网络(CNN)与门控循环单元(GRU)相结合,充分发挥两者的优势。

首先,我们来了解一下CNN-GRU模型的核心思想。卷积神经网络擅长提取局部特征,能够从时序数据中捕捉短期模式和局部依赖关系;而门控循环单元作为循环神经网络的改进版本,能够有效处理长序列数据并捕捉长期时间依赖关系。在CNN-GRU算法中,我们将CNN作为特征提取器,GRU作为序列建模器,实现了对时序数据的深度学习和精准预测。

CNN-GRU算法的流程如下:

(1)数据准备:首先,我们需要准备历史数据作为训练集。

(2)数据预处理:对于训练集中的数据,我们需要进行一些预处理操作,比如去除异常值、归一化等,以提高预测模型的准确性。

(3)网络构建:根据预处理后的训练集,我们构建CNN-GRU网络模型。该模型包括输入层、卷积层、池化层、GRU层和输出层。

(4)模型训练:采用 MSE 作为回归损失,Adam 优化器提升收敛速度与鲁棒性,同时监控 MAE 作为评估指标。

(5)模型评估:在训练完成后,我们需要对模型进行评估。这可以通过将训练集中的一部分数据作为测试集,来计算模型的预测误差和准确率。

二,代码

代码中文注释非常清晰,按照示例数据修改格式,替换数据集即可运行,数据集可以是csv或者excel表格。

部分代码如下:

1if __name__ == "__main__":
2    warnings.filterwarnings("ignore")  # 取消警告
3    # 使用pandas模块的read_csv函数读取名为"电力负荷预测数据.csv"的文件。
4    # 参数 'encoding' 设置为 'gb2312',这通常用于读取中文字符,确保文件中的中文字符能够正确读取。
5    # 读取的数据被存储在名为 'dataset' 的DataFrame变量中。
6    dataset = pd.read_csv("电力负荷预测数据.csv", encoding='gb2312')
7    # 下面是读取xlsx的方式,根据实际数据集文件选择是read_csv还是read_excel
8    # dataset = pd.read_excel("数据集.xlsx", sheet_name='Sheet1', header=0)
9    print(dataset)  # 显示dataset数据
10
11    # 从dataset DataFrame中提取数据。
12    # dataset.values将DataFrame转换为numpy数组。
13    # [:,1:],逗号前是行,逗号之后是列。这个表示选择所有行(:)和从第二列到最后一列(1:)的数据。
14    # 这样做通常是为了去除第一列,这在第一列是索引或不需要的数据时很常见。
15    # 只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:
16    # 单输入单步预测,就让values等于某一列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
17    # 单输入多步预测,就让values等于某一列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
18    # 多输入单步预测,就让values等于多列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
19    # 多输入多步预测,就让values等于多列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
20    values = dataset.values[:, 1:]
21    # 如果第一列不是索引,需保留全部列的数据时,则使用下面这句代码,并把上面那句代码屏蔽
22    # values = dataset.values[:, :]
23
24    # 确保所有数据是浮点数
25    # 将values数组中的数据类型转换为float32。
26    # 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
27    values = values.astype('float32')
28
29    # 下面是多特征输入,多步预测的案例
30    n_in = 5  # 输入前5行的数据
31    n_out = 2  # 预测未来2步的数据
32    or_dim = values.shape[1]  # 记录特征数据维度
33    # 默认是全部数据用于本次网络的训练与测试,也可以设定具体是数值,比如2000,这个数值不能超过实际的数据点
34    num_samples = values.shape[0] - n_in - n_out
35    # num_samples = 2000
36    scroll_window = 1  # 如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
37    res = data_collation(values, n_in, n_out, or_dim, scroll_window, num_samples)
38
39    # 把数据集分为训练集和测试集
40    # 将前面处理好的DataFrame(data)转换成numpy数组,方便后续的数据操作。
41    values = np.array(res)
42
43    # 计算训练集的大小。
44    # 设置80%作为训练集
45    # int(...) 确保得到的训练集大小是一个整数。
46    n_train_number = int(num_samples * 0.8)
47
48    # 先划分数据集,在进行归一化,这才是正确的做法!
49    Xtrain = values[:n_train_number, :n_in * or_dim]
50    Ytrain = values[:n_train_number, n_in * or_dim:]
51    Xtest = values[n_train_number:, :n_in * or_dim]
52    Ytest = values[n_train_number:, n_in * or_dim:]
53
54    # 对训练集和测试集进行归一化
55    m_in = MinMaxScaler()
56    vp_train = m_in.fit_transform(Xtrain)  # 注意fit_transform()  transform()的区别
57    vp_test = m_in.transform(Xtest)  # 注意fit_transform()  transform()的区别
58    m_out = MinMaxScaler()
59    vt_train = m_out.fit_transform(Ytrain)  # 注意fit_transform()  transform()的区别
60    vt_test = m_out.transform(Ytest)  # 注意fit_transform()  transform()的区别
61
62    # 将训练集的输入数据vp_train重塑成三维格式。
63    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
64    vp_train = vp_train.reshape((vp_train.shape[0], n_in, or_dim))
65
66    # 将测试集的输入数据vp_test重塑成三维格式。
67    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
68    vp_test = vp_test.reshape((vp_test.shape[0], n_in, or_dim))
69
70    # 调用lstm_model函数来建立LSTM模型
71    model = cnn_gru_model()
72
73......

三,运行结果

资源下载:https://download.csdn.net/download/vvoennvv/92371651


【Python TensorFlow】 CNN-GRU卷积神经网络-门控循环神经网络时序预测算法(附代码)》 是转载文章,点击查看原文


相关推荐


如何用Python处理文件:Word导出PDF & 如何用Python从Word中提取数据:以处理简历为例
诸神缄默不语2025/11/26

诸神缄默不语-个人技术博文与视频目录 专栏网址:https://blog.csdn.net/polarisrisingwar/category_13089386.html 专栏文章目录:专栏《Python自动化办公的192个实例项目》目录 本篇是《Python自动化办公的192个实例项目》专栏内容,内容主要为使用Python将Word文档导出为PDF格式 & 从Word文档中提取数据(以处理简历为例)。 欢迎关注、评论、提问。 文章目录 1. 项目9:将Word文档导出为PDF文档准


安全小白入门(2)-----跨站脚本(XSS)
天下不喵2025/11/24

跨站脚本(XSS) 1. 漏洞原理 XSS 是由于 用户输入的恶意脚本未被转义,直接在浏览器中执行,导致攻击者窃取 Cookie、伪造身份或钓鱼。FastAPI 虽以 JSON 接口为主,但若返回 HTML 内容(如模板渲染)或前端直接渲染 API 返回的用户输入,仍可能触发 XSS。 2. 攻击场景(FastAPI 漏洞代码) 假设 FastAPI 接口返回包含用户输入的 HTML 页面(使用 Jinja2 模板): from fastapi import FastAPI, Request f


大数据-160 Apache Kylin Cube 实战:从建模到构建与查询(含踩坑与优化)
武子康2025/11/22

TL;DR 场景:以电商销售事实表为例,在 Kylin 上按“日期”维度预计算加速聚合查询。 结论:合理裁剪 Cuboid、优化维度/事实表可在存储与性能间取得平衡;构建与查询链路跑通。 产出:项目/数据源/模型/Cube 全流程指引、监控与常见错误定位表、实操 SQL 示例。 版本矩阵 模块技术要点工程化建议数据源准备Hive表结构设计,分区字段选择维度表主键唯一,单表≤300MB;事实表


考研408笔记——数据结构
烧冻鸡翅QAQ2025/11/20

文章目录 数据结构什么是置换选择排序?置换选择排序是用来干啥的?什么是最佳归并树?最佳归并树是用来干什么的?什么是败者树?败者树是用来干什么的?什么是十字链表?什么是多重邻接表?二者有啥区别?迪杰斯特拉算法:用贪心策略求解图中单源最短路径问题最小生成树(MST)什么是最小生成树呢?怎么求最小生成树?Prim算法Kruskal算法 弗洛伊德算法:用动态规划思想求解图中任意两点之间的最短路径弗洛伊德算法 vs 迪杰斯特拉算法堆排序什么是大根堆?什么是小根堆?如何利用堆来进行排序?如何用堆排序


playwright的调试模式,方便调试selector, locator语法及查找效果
yeyong2025/11/19

下面是一套“边写边测”的通用套路,确保 page.locator() / wait_for_selector() 在提交代码前就能一次跑通,不用每次都重跑完整流程。 官方“秒测”工具:Playwright Inspector 命令行里加 --paused 即可打开自带调试器: # Python 例子 PWDEBUG=1 pytest my_test.py # 或直接 playwright codegen https://your-site.com 左侧 “Pick” 图标点一下,再点


Langchain Template 全面指南
前端小东2025/11/17

概述 LangChain Template 是 LangChain 提示工程的核心组件,用于动态生成模型的输入。 🎯 Template 的核心概念: Template 本质是一个带有占位符的文本字符串,这些占位符会在运行时被具体的值填充。它的主要目的是将提示逻辑与业务数据分离。 模板分类 1. 🎯 基础模板类(Core Templates) (1) PromptTemplate 最基础的文本模板 from langchain.prompts import PromptTemplate #


蓝桥杯备战记录:图论中关键边识别与DFS应用
akai1472025/11/16

一、问题背景与核心思路 问题描述 给定一个无向连通图和n对点,要求找到一条边,使得删除该边后所有n对点之间的路径都不连通。这类问题在图论中被称为关键边(Bridge)​或必经边问题。 核心算法思想 ​公共边识别​:寻找所有n对点路径上的公共边​边计数法​:统计每条边被多少对点的路径所经过​关键边判定​:计数等于n的边即为所求的关键边 二、DFS实现关键边识别 算法框架 vector<int> adj[MAXN]; // 邻接表存图 int edge_count[MAXN][MA


Jetpack Compose Navigation 2.x 详解
雨白2025/11/15

简单的页面跳转 在 Compose 中,我们可以借助 State 实现一个非常简单的屏幕内容切换效果。 class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent {


深度测评解析 CANN:从 ACL 到自定义算子,解锁昇腾计算的全部潜能
wei_shuo2025/11/14

深度测评解析 CANN:从 ACL 到自定义算子,解锁昇腾计算的全部潜能 CANN 核心价值解读:统一计算底座与全场景适配 ✅端到端栈级支持:CANN 覆盖驱动、运行时、算子加速库、编译器及上层框架适配的全套工具链,大幅降低模型向昇腾硬件移植的工程成本 ✅开发者定制接口:ACL 提供 C/C++、Python 双接口,兼顾快速原型验证与生产级接入;AOL(aclnn)算子性能强,支持两段式调用,方便做内存、离线编译优化 ✅可控资源调度与并发:通过 Device/Context/Stream


Python 的内置函数 input
IMPYLH2025/11/13

Python 内建函数列表 > Python 的内置函数 input Python 的内置函数 input() 是一个用于获取用户输入的标准函数,它会暂停程序执行,等待用户在控制台输入内容并按回车键确认。这个函数在交互式程序和需要用户参与的脚本中非常有用。 基本用法 input() 函数的基本语法如下: user_input = input([prompt]) 其中: prompt 是一个可选参数,用于显示提示信息,告诉用户需要输入什么内容函数返回用户输入的内容,以字符串形式保存

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读