声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类算法的家人,可关注我的VX公众号:python算法小当家,不定期会有很多免费代码分享~
CNN-Transformer实现完美融合
CNN层在特征维度上提取有价值的信息,补偿了Transformer编码器从多元数据集中挖掘信息的有限能力。同时在不同编码器层之间使用多头注意层能有效地提高预测精度。
本文将使用CNN-Transformer完成电力负荷多元时间序列预测,这个模型当前用的人还比较少,且不仅适用于电力负荷预测,如光伏预测、股价预测等时间序列预测也是可以用的。下面先给大家看实验结果,模型原理在后面!!!
CNN-Transformer时间序列预测
输入数据(部分展示)
date | dry bulb temperature | dew point temperature | wet bulb temperature | humidity | price | Load |
---|---|---|---|---|---|---|
2007/5/1 0:00 | 17.6 | 10.1 | 13.6 | 61 | 56.27 | 8014.32 |
2007/5/1 0:30 | 17.3 | 10.25 | 13.55 | 63 | 53.64 | 7872.69 |
2007/5/1 1:00 | 17 | 10.4 | 13.5 | 65 | 39.47 | 7693.98 |
2007/5/1 1:30 | 16.75 | 10.55 | 13.45 | 67 | 51.36 | 7569.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(dkQKT)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 组件则对全局关系建模。
工作流程如下:
-
CNN 特征提取:
- 应用卷积层以提取特征图。
- 使用池化层减少维度,同时保留重要特征。
-
位置编码:
- 对时间序列数据进行位置编码,以维护时间关系。
-
Transformer 编码:
- 将 CNN 提取的特征和位置编码通过 Transformer 编码层,以捕捉全局依赖关系。
-
Transformer 解码:
- 使用解码层从编码特征中生成最终预测。
CNN 和 Transformer 的结合确保了模型有效地捕捉局部和全局模式,从而增强其时间序列数据预测的性能。
代码获取
关注VX公众号python算法小当家,后台回复关键字,即可获得完整代码
负荷预测
可后台回复需求定制模型,看到秒回