融合创新!CNN-Transformer时间序列预测

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类算法的家人,可关注我的VX公众号:python算法小当家,不定期会有很多免费代码分享~

CNN-Transformer实现完美融合

CNN层在特征维度上提取有价值的信息,补偿了Transformer编码器从多元数据集中挖掘信息的有限能力。同时在不同编码器层之间使用多头注意层能有效地提高预测精度。

本文将使用CNN-Transformer完成电力负荷多元时间序列预测,这个模型当前用的人还比较少,且不仅适用于电力负荷预测,如光伏预测、股价预测等时间序列预测也是可以用的。下面先给大家看实验结果,模型原理在后面!!!

CNN-Transformer时间序列预测

输入数据(部分展示)

datedry bulb temperaturedew point temperaturewet bulb temperaturehumiditypriceLoad
2007/5/1 0:0017.610.113.66156.278014.32
2007/5/1 0:3017.310.2513.556353.647872.69
2007/5/1 1:001710.413.56539.477693.98
2007/5/1 1:3016.7510.5513.456751.367569.55

数据集介绍:
date:日期
dry bulb temperature:干球温度
dew point temperature:露点温度
wet bulb temperature:湿球温度
humidity:湿度
price:电价
Load:负荷(输出)

数据划分

# 定义输入数据,输出标签数据的格式的函数 ,同时将数据转换模型可接受的3D格式
def create_dataset(datasetX, datasetY, look_back=1, T=1):
    dataX, dataY = [], []
    for i in range(0, len(datasetX) - look_back, T):
        a = datasetX[i:(i + look_back), :]
        dataX.append(a)
        dataY.append(datasetY[i + look_back:i + look_back + T, 0])
    return np.array(dataX), np.array(dataY)

create_dataset函数用于将输入数据和输出标签数据格式化,并转换成模型可接受的3D格式。该函数通过滑动窗口的方式从时间序列数据中创建特征和标签。

模型创建

model = create_model(
input_shape=(look_back, num_features),
num_blocks=3, embed_dim=32, dense_dim=64,
num_heads=4, dropout_rate=0.1, output_sequence_length=T)

create_model函数用于创建CNN-Transformer时间序列预测模型。参数说明如下:

  • input_shape:输入数据的形状,通常为三维元组,包含look_back和num_features。
  • num_blocks:模型中的块数,表示模型由多少个重复模块组成。
  • embed_dim:嵌入维度,表示嵌入层的输出维度。
  • dense_dim:密集层的维度,表示全连接层的节点数量。
  • num_heads:多头注意力机制的头数,表示每个注意力层的注意力头数量。
  • dropout_rate:Dropout的比例,表示在训练过程中随机丢弃神经元的比例,防止过拟合。
  • output_sequence_length:输出序列的长度,通常与预测步长T一致。

预测结果

  • R2: 0.9565503349887645
  • MAE: 212.94421388377688
  • RMSE: 276.2253945995932
  • MAPE: 0.02585057585279897

这个模型的预测效果非常棒!从图上看,预测值和真实值几乎重合,说明模型的准确性非常高。平均绝对百分比误差不到2.6%,R²值接近1。总体来说,这个模型在电力负荷预测上表现出色。

CNN-Transformer原理介绍

CNN 模型

卷积神经网络(CNN)广泛用于时间序列预测中的特征提取。CNN 的主要操作包括卷积和池化。卷积操作通过在输入数据上应用一组滤波器(卷积核)来捕捉局部依赖关系。卷积操作的输出可以表示为:
$ \ f_{lh} = \sum_{i=1}^{m} \sum_{j=1}^{n} w_{hij} \cdot T_{ij} $
其中:

  • $ \ f_{lh}$是位置 l l l处使用第 h h h个滤波器的输出特征图。
  • $\ w_{hij} $ 表示第 h h h个滤波器的权重。
  • $\ T_{ij} $ 是位置$ (i, j) $ 处的输入数据。

结果特征图的大小 ( r ) 由以下公式确定:$ r = \frac{m - p}{q} + 1 $

其中:

  • $ m $ 是输入大小。
  • $ p $ 是滤波器大小。
  • $ q $ 是步长。

Transformer 模型

Transformer 模型依赖自注意力机制来捕捉数据中的全局依赖关系。Transformer 的关键操作包括计算注意力得分和应用多头注意力。注意力机制可以定义为:

A ( Q , K , V ) = softmax ( Q K T d k ) V A(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V A(Q,K,V)=softmax(dk QKT)V

其中:

  • ( Q )(查询)、( K )(键)和 ( V )(值)是输入矩阵。
  • ( d_k ) 是键的维度。

多头注意力机制是单头注意力机制的扩展,允许模型同时关注来自不同表示子空间的信息。它定义为:

M ( Q , K , V ) = Concat ( head 1 , … , head h ) W O M(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O M(Q,K,V)=Concat(head1,,headh)WO

其中:

  • $ \text{head}_i = A(QW_i^Q, KW_i^K, VW_i^V) $
  • $ W_i^Q, W_i^K, W_i^V$是学习的投影矩阵。
  • $ W^O $ 是输出投影矩阵。

CNN-Transformer 模型

混合 CNN-Transformer 模型结合了 CNN 在局部特征提取和 Transformer 在捕捉长期依赖关系中的优势。其结构包括将输入通过 CNN 以提取有意义的特征,然后输入到 Transformer 模型中。CNN 组件有助于捕捉局部模式,而 Transformer 组件则对全局关系建模。
工作流程如下:

  1. CNN 特征提取

    • 应用卷积层以提取特征图。
    • 使用池化层减少维度,同时保留重要特征。
  2. 位置编码

    • 对时间序列数据进行位置编码,以维护时间关系。
  3. Transformer 编码

    • 将 CNN 提取的特征和位置编码通过 Transformer 编码层,以捕捉全局依赖关系。
  4. Transformer 解码

    • 使用解码层从编码特征中生成最终预测。

CNN 和 Transformer 的结合确保了模型有效地捕捉局部和全局模式,从而增强其时间序列数据预测的性能。

代码获取

关注VX公众号python算法小当家,后台回复关键字,即可获得完整代码

负荷预测

可后台回复需求定制模型,看到秒回

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值