回归预测|基于卷积神经网络-长短期记忆网络-自注意力机制的数据回归预测Python程序 多特征输入单输出 CNN-LSTM-Attention
文章目录
前言
回归预测|基于卷积神经网络-长短期记忆网络-自注意力机制的数据回归预测Python程序 多特征输入单输出 CNN-LSTM-Attention
一、CNN-LSTM-Attention模型
CNN-LSTM-Attention模型是一种结合了卷积神经网络(CNN)、长短期记忆网络(LSTM)和注意力机制(Attention)的深度学习模型,广泛用于处理时间序列数据和序列预测任务。下面详细介绍其原理和流程,并提供一个简化的示意图。
1. CNN-LSTM-Attention模型的基本组成部分
1.1. 卷积神经网络(CNN)
原理: CNN主要用于从数据中提取局部特征。它通过卷积层和池化层来捕捉输入数据的空间特征。
步骤:
- 卷积层: 对输入数据应用卷积操作,生成特征图。卷积操作通过滑动卷积核提取局部特征。
- 池化层: 通过池化操作(如最大池化或平均池化)减少特征图的空间尺寸,降低计算复杂度,并提取重要特征。
输出: 特征图或特征向量,通常被展平(flatten)为一维向量。
1.2. 长短期记忆网络(LSTM)
原理: LSTM是一种递归神经网络(RNN)的变体,用于处理时间序列数据。它通过门控机制解决了标准RNN中的长期依赖问题。
步骤:
- 输入门、遗忘门、输出门: LSTM通过这些门控机制控制信息的流动和保留。
- 记忆单元: 保持长期信息的记忆,避免梯度消失问题。
输出: 序列数据的时间序列特征表示。
1.3. 注意力机制(Attention)
原理: 注意力机制使模型能够集中注意力在输入序列中的重要部分,提高了模型的性能。它通过计算输入序列的加权平均值,给予重要部分更高的权重。
步骤:
- 计算注意力权重: 基于当前LSTM的隐藏状态和编码器的输出计算权重。
- 加权求和: 使用注意力权重对LSTM的输出进行加权求和,得到加权特征表示。
输出: 加权后的特征表示。
2. CNN-LSTM-Attention模型的工作流程
-
输入数据预处理:
- 将原始输入数据(如时间序列数据、文本数据等)转化为适合CNN处理的形式。
-
CNN特征提取:
- 通过卷积层提取数据中的空间特征。
- 经过池化层缩减特征图的尺寸并进一步提取重要特征。
-
序列建模(LSTM):
- 将CNN提取的特征输入LSTM网络,捕捉时间序列数据中的长期依赖关系。
-
应用注意力机制:
- 对LSTM的输出应用注意力机制,计算每个时间步的注意力权重。
- 对LSTM的输出进行加权求和,得到最终的上下文特征表示。
-
输出层:
- 根据任务需求,进一步处理注意力加权后的特征表示,如进行回归预测、分类等操作。
3. 示意图
以下是CNN-LSTM-Attention模型的简化示意图:
+-----------------+
| 输入数据 |
+-----------------+
|
v
+-----------------+
| CNN特征提取 |
| (卷积 + 池化) |
+-----------------+
|
v
+-----------------+
| LSTM建模 |
| (时间序列特征) |
+-----------------+
|
v
+-----------------+
| 注意力机制 |
| (加权求和) |
+-----------------+
|
v
+-----------------+
| 输出层 |
| (回归预测) |
+-----------------+
总结
CNN-LSTM-Attention模型结合了卷积神经网络的空间特征提取能力、LSTM的时间序列建模能力和注意力机制的加权能力。它特别适用于处理需要提取空间特征、建模时间依赖关系并关注重要部分的任务,如时间序列预测和自然语言处理任务。
二、实验结果
训练曲线结果
训练集核测试集实验结果
训练集残差
误差直方图
散点图
评价结果
三、核心代码
# 调用相关库
import pandas as pd # 导入pandas模块,用于数据处理和分析
from math import sqrt # 从math模块导入sqrt函数,用于计算平方根
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
import numpy as np # 导入numpy模块,用于数值计算
from sklearn.preprocessing import MinMaxScaler # 导入sklearn中的MinMaxScaler,用于特征缩放
from tensorflow.keras.layers import * # 从tensorflow.keras.layers导入所有层,用于构建神经网络
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # 导入额外的评估指标
import warnings
from prettytable import PrettyTable #可以优美的打印表格结果
from keras.layers import Dense, Activation, Dropout, LSTM, Bidirectional, LayerNormalization, Input, Conv1D, \
MaxPooling1D, Reshape
from tensorflow.keras.models import Model
from pylab import mpl
warnings.filterwarnings("ignore") #取消警告
# 绘图设置中文字体
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号
## 1.读取数据
values = pd.read_excel("数据集.xlsx")
num_samples = values.shape[0]
per = np.random.permutation(num_samples) #打乱后的行号
n_train_number = per[:int(num_samples * 0.8)]
n_test_number = per[int(num_samples * 0.8):]
## 2.划分数据集
Xtrain = values[n_train_number, :-1]
Ytrain = values[n_train_number, -1]
Ytrain = Ytrain.reshape(-1, 1)
Xtest = values[n_test_number, :-1]
Ytest = values[n_test_number, -1]
Ytest = Ytest.reshape(-1, 1)
## 3.对训练集和测试集进行归一化
m_in = MinMaxScaler()
vp_train = m_in.fit_transform(Xtrain)
vp_test = m_in.transform(Xtest)
m_out = MinMaxScaler()
vt_train = m_out.fit_transform(Ytrain)
vt_test = m_out.transform(Ytest)
## 4.转换成CNN输入的数据格式
vp_train = vp_train.reshape((vp_train.shape[0], 1, vp_train.shape[1])) # [样本数量, 时间步长, 特征数量]
vp_test = vp_test.reshape((vp_test.shape[0], 1, vp_test.shape[1]))
## 5.构建CNN-LSTM-Attention模型
def attention_layer(inputs, time_steps):
a = Permute((2, 1))(inputs)
def cnn_lstm_attention_model():
# 定义一个包含CNN, LSTM和注意力机制的模型
inputs = Input(shape=(vp_train.shape[1], vp_train.shape[2]))
conv1d = Conv1D(filters=64, kernel_size=1, activation='relu')
# 训练模型
history = model.fit(vp_train, vt_train, batch_size=32, epochs=50, validation_split=0.25, verbose=2)
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='test')
plt.legend()
plt.show()
## 6.仿真测试
t_sim1 = model.predict(vp_train) # 训练集预测
t_sim1 = t_sim1.reshape(-1, 1) # 将预测值yhat重塑为二维数组,以便进行后续操作。
t_sim2 = model.predict(vp_test) # 测试机预测
t_sim2 = t_sim2.reshape(-1, 1) # 将预测值yhat重塑为二维数组,以便进行后续操作。
## 7.反归一化
T_sim1 = m_out.inverse_transform(t_sim1)
T_sim2 = m_out.inverse_transform(t_sim2)
## 9.计算评价指标
print('训练集评价指标结果') # 显示预测指标数值
mse_dic, rmse_dic, mae_dic, mape_dic, r2_dic, table = evaluate_forecasts(Ytrain, T_sim1)
print(table) # 显示预测指标数值
print('测试集评价指标结果') # 显示预测指标数值
mse_dic, rmse_dic, mae_dic, mape_dic, r2_dic, table = evaluate_forecasts(Ytest, T_sim2)
print(table) # 显示预测指标数值
## 10.绘制图像
plt.figure(figsize=(8, 5)) # 设置图形大小
x = range(1, len(T_sim1) + 1) # 设置x轴的刻度,每几个点显示一个刻度。
plt.tick_params(labelsize=12) # 改变刻度字体大小
plt.plot(x, T_sim1, 'r-*', linewidth=1.5, label='预测值') # 绘制预测值的折线图
plt.plot(x, Ytrain, 'b-o', linewidth=1.5, label='真实值') # 绘制实际值的折线图
plt.legend(loc='upper right', frameon=False) # 显示图例
plt.xlabel("预测样本", fontsize=12) # 设置x轴标签
plt.ylabel("预测结果", fontsize=12) # 设置y轴标签
plt.title(f"预测结果:\nMAPE: {mape(Ytrain, T_sim1)} %", fontsize=14) # 设置标题
plt.show()
## 测试集真实值和预测值结果
plt.figure(figsize=(8, 5)) # 设置图形大小
x = range(1, len(T_sim2) + 1) # 设置x轴的刻度,每几个点显示一个刻度。
plt.tick_params(labelsize=12) # 改变刻度字体大小
plt.plot(x, T_sim2, 'r-*', linewidth=1.5, label='预测值') # 绘制预测值的折线图
plt.plot(x, Ytest, 'b-o', linewidth=1.5, label='真实值') # 绘制实际值的折线图
plt.legend(loc='upper right', frameon=False) # 显示图例
plt.xlabel("预测样本", fontsize=12) # 设置x轴标签
plt.ylabel("预测结果", fontsize=12) # 设置y轴标签
plt.title(f"预测结果:\nMAPE: {mape(Ytest, T_sim2)} %", fontsize=14) # 设置标题
plt.show()
# 计算测试集误差
ERROR = Ytest - T_sim2
# 绘制测试集误差图
plt.figure(figsize=(7, 5)) # 设置图形大小
plt.plot(ERROR, 'b-*', linewidth=1.5, label='预测输出误差') # 设置颜色和图例
plt.xlabel('测试集样本编号', fontsize=12) # 设置x轴标签和字体大小
plt.ylabel('预测误差', fontsize=12) # 设置y轴标签和字体大小
plt.title('测试集预测误差', fontsize=14) # 设置标题和字体大小
plt.grid(True, linestyle='--', linewidth=0.5) # 设置网格线样式
plt.legend(fontsize=12) # 设置图例字体大小
plt.show()
# 绘制误差直方图
plt.figure(figsize=(7, 5))
plt.hist(ERROR, bins=30, edgecolor='black', alpha=0.7)
plt.xlabel('误差', fontsize=12)
plt.ylabel('频数', fontsize=12)
plt.title('误差直方图', fontsize=14)
plt.grid(True, linestyle='--', linewidth=0.5)
plt.show()
四、代码获取
私信即可 30米
五、总结
包括但不限于
优化BP神经网络,深度神经网络DNN,极限学习机ELM,鲁棒极限学习机RELM,核极限学习机KELM,混合核极限学习机HKELM,支持向量机SVR,相关向量机RVM,最小二乘回归PLS,最小二乘支持向量机LSSVM,LightGBM,Xgboost,RBF径向基神经网络,概率神经网络PNN,GRNN,Elman,随机森林RF,卷积神经网络CNN,长短期记忆网络LSTM,BiLSTM,GRU,BiGRU,TCN,BiTCN,CNN-LSTM,TCN-LSTM,BiTCN-BiGRU,LSTM–Attention,VMD–LSTM,PCA–BP等等
用于数据的分类,时序,回归预测。
多特征输入,单输出,多输出