news 2026/1/19 3:48:58

基于时间序列预测的组合模型,CNN-LSTM-Attention、CNN-GRU-Attent...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于时间序列预测的组合模型,CNN-LSTM-Attention、CNN-GRU-Attent...

基于时间序列预测的组合模型,CNN-LSTM-Attention、CNN-GRU-Attention的深度学习神经网络的多特征用电负荷预测。 关于模型算法预测值和真实值对比效果如下图所示,同时利用R2、MAPE、RMSE等评价指标进行模型性能评价。 关于数据:利用的是30分钟一采样的电力负荷单特征数据,其中还包含对应的其他影响特征如温度、湿度、电价、等影响影响因素;具体如图详情图中所示。 个人编码习惯很好,基本做到逐行逐句进行注释;项目的文件截图具体如图详情所示。

最近在折腾一个多特征用电负荷预测的项目,手头有30分钟粒度的电力数据,除了负荷值还带着温度、湿度、电价这些变量。咱们这次要试试两个混合模型:CNN-LSTM-Attention和CNN-GRU-Attention,看看它们能不能把用电负荷的波动给拿捏住。

先看数据长啥样。原始数据csv里每行记录长这样:

timestamp,load,temp,humidity,price 2023-07-01 00:00:00, 235.6, 28.3, 65%, 0.43 2023-07-01 00:30:00, 228.4, 27.9, 67%, 0.41 ...

处理时序数据最烦人的就是时间窗设置。这里用滑动窗口把连续时间步打包成样本,比如用过去6小时(12个时间点)预测未来1小时(2个时间点):

def create_dataset(data, look_back=12, pred_step=2): X, y = [], [] for i in range(len(data)-look_back-pred_step): X.append(data[i:(i+look_back)]) y.append(data[i+look_back:i+look_back+pred_step, 0]) # 只取负荷值作为标签 return np.array(X), np.array(y)

注意这里y只取负荷值,其他特征只在输入时使用。归一化用的是MinMaxScaler,但不同列要分开处理,毕竟温度和电价单位差太多。

模型结构是重头戏。以CNN-GRU-Attention为例,Keras里这么搭:

def build_model(input_shape): inputs = Input(shape=input_shape) # 先用CNN抓局部特征 conv = Conv1D(64, 3, activation='relu', padding='same')(inputs) conv = Dropout(0.2)(conv) # GRU处理时序依赖 gru = GRU(128, return_sequences=True)(conv) gru = GRU(64, return_sequences=False)(gru) # 注意力给关键时间点加权重 attention = Dense(64, activation='tanh')(gru) attention = Attention()([attention, attention]) outputs = Dense(2)(attention) # 预测未来两个时间点 model = Model(inputs=inputs, outputs=outputs) model.compile(optimizer='adam', loss='mse') return model

这里有个细节,Conv1D的padding设成'same'是为了保持时间步长度,不然经过卷积后时间维度会缩减。Attention层这里用了自定义实现,主要计算各时间步的注意力分数:

class Attention(Layer): def __init__(self, **kwargs): super(Attention, self).__init__(**kwargs) def build(self, input_shape): self.W = self.add_weight(name='attention_weight', shape=(input_shape[-1], 1), initializer='random_normal') super(Attention, self).build(input_shape) def call(self, x): # 计算注意力得分 e = K.tanh(K.dot(x, self.W)) a = K.softmax(e, axis=1) output = x * a return K.sum(output, axis=1)

训练时发现个坑——直接拿全部特征训练容易过拟合。后来改成在CNN之后加了特征dropout,让模型别太依赖某个特定特征,MAPE从8.7%降到了6.3%。

评估指标这块,除了常见的RMSE,还用了MAPE看百分比误差。R²指标用sklearn的r2_score计算时要注意,多步预测需要把输出展开:

y_pred = model.predict(X_test) # 把预测的2步和真实的2步展开计算 r2 = r2_score(y_test.reshape(-1), y_pred.reshape(-1))

最终两个模型的效果对比:

  • CNN-LSTM-Attention:RMSE 23.4,MAPE 5.8%
  • CNN-GRU-Attention:RMSE 21.7,MAPE 5.2%

GRU版本稍好可能因为数据量不算特别大,GRU参数少反而更容易收敛。不过实际部署时发现,在电价波动剧烈的时段,LSTM版本更稳定,可能需要融合两个模型的结果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/19 10:32:02

HarukaBot:打造智能B站信息推送系统

在信息爆炸的时代,如何精准获取心仪UP主的最新动态和直播信息?HarukaBot作为一款基于NoneBot2框架开发的B站推送机器人,能够将B站的动态和直播信息实时推送到QQ群,让粉丝们永远不错过任何精彩瞬间。这款智能推送系统不仅支持多群管…

作者头像 李华
网站建设 2026/1/17 14:31:16

打破设备孤岛:海尔智家全屋智能联动实战指南

打破设备孤岛:海尔智家全屋智能联动实战指南 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 还在为家中海尔智能设备无法与其他品牌设备联动而烦恼吗?当您打开空调时,希望窗帘能自动关闭;当您…

作者头像 李华
网站建设 2026/1/17 20:40:00

Open-AutoGLM插件核心功能全曝光(90%开发者还不知道的隐藏能力)

第一章:Open-AutoGLM插件的核心定位与行业价值Open-AutoGLM是一款面向企业级大模型应用的开源自动化工具插件,专注于增强通用语言模型在复杂业务场景中的任务理解与执行能力。其核心定位是作为连接自然语言指令与结构化系统操作之间的智能桥梁&#xff0…

作者头像 李华
网站建设 2026/1/18 18:04:20

深入解析Micropython HC-SR04超声波传感器驱动设计与实战应用

深入解析Micropython HC-SR04超声波传感器驱动设计与实战应用 【免费下载链接】micropython-hcsr04 Micropython driver for ultrasonic sensor HC-SR04 项目地址: https://gitcode.com/gh_mirrors/mi/micropython-hcsr04 当你在开发智能小车避障系统或智能家居感应装置…

作者头像 李华
网站建设 2026/1/17 21:00:18

webman终极指南:PHP高性能框架快速入门与实战

想要体验极速的PHP开发?webman就是你的最佳选择!🚀 这款基于Workerman的高性能PHP框架,采用异步非阻塞架构,能够轻松应对高并发场景,让你的Web应用性能飙升。无论是构建企业网站、API服务还是实时通讯应用&…

作者头像 李华
网站建设 2026/1/18 9:00:42

3、.NET技术新特性与应用深度解析

.NET技术新特性与应用深度解析 1. .NET Standard概述 在.NET生态系统中,存在着众多运行时。比如.NET Framework,它是安装在Windows操作系统上的全系统范围框架,为Windows Presentation Foundation (WPF)、Windows Forms和ASP.NET提供应用程序模型。而.NET Core则针对跨平台…

作者头像 李华