首页 > 编程语言 >回归预测|基于卷积神经网络-长短期记忆网络-自注意力机制的数据回归预测Python程序 多特征输入单输出 CNN-LSTM-Attention

回归预测|基于卷积神经网络-长短期记忆网络-自注意力机制的数据回归预测Python程序 多特征输入单输出 CNN-LSTM-Attention

时间:2024-08-23 18:26:03浏览次数:9  
标签:plt 卷积 回归 Attention train CNN LSTM

回归预测|基于卷积神经网络-长短期记忆网络-自注意力机制的数据回归预测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模型的工作流程

  1. 输入数据预处理:

    • 将原始输入数据(如时间序列数据、文本数据等)转化为适合CNN处理的形式。
  2. CNN特征提取:

    • 通过卷积层提取数据中的空间特征。
    • 经过池化层缩减特征图的尺寸并进一步提取重要特征。
  3. 序列建模(LSTM):

    • 将CNN提取的特征输入LSTM网络,捕捉时间序列数据中的长期依赖关系。
  4. 应用注意力机制:

    • 对LSTM的输出应用注意力机制,计算每个时间步的注意力权重。
    • 对LSTM的输出进行加权求和,得到最终的上下文特征表示。
  5. 输出层:

    • 根据任务需求,进一步处理注意力加权后的特征表示,如进行回归预测、分类等操作。

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等等

用于数据的分类,时序,回归预测。
多特征输入,单输出,多输出

标签:plt,卷积,回归,Attention,train,CNN,LSTM
From: https://blog.csdn.net/2401_86241083/article/details/141337694

相关文章

  • 回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归
    **回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归预测Matlab程序多特征输入单输出含基础模型NGO-CNN-BiLSTM-Attention**文章目录前言回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归预测M......
  • 回归预测|基于NGO-TCN-BiGRU-Attention的数据预测Matlab程序 多特征输入单输出 含基础
    回归预测|基于NGO-TCN-BiGRU-Attention的数据预测Matlab程序多特征输入单输出含基础模型文章目录前言回归预测|基于NGO-TCN-BiGRU-Attention的数据预测Matlab程序多特征输入单输出含基础模型一、NGO-TCN-BiGRU-Attention模型NGO-TCN-BiGRU-Attention模型详细流......
  • 6-SoftMax回归
    https://blog.csdn.net/qq_43799400/article/details/131202148写代码遇到问题1、使用data.DataLoader时如果使用多进程num_workers,会报错其原因可能是https://blog.csdn.net/KaelCui/article/details/1061841582、loss的backward注意backward只能对标量,而不是对张量。......
  • Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归
    全文链接:https://tecdat.cn/?p=37423原文出处:拓端数据部落公众号“你的命运早在出生那一刻起便被决定了。”这样无力的话语,无数次在年轻人的脑海中回响,尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国,这种现象尤为明显:没有生在大城市的他们,从小便需面对......
  • 用Python实现9大回归算法详解——09. 决策树回归算法
    1.决策树回归的基本概念决策树回归(DecisionTreeRegression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈值来最大化每次分裂后的目标函数增益,从而找到使误差最小化的模型......
  • 4-线性回归
    python中*运算符的使用用于将可迭代对象(如列表或元组)的元素解压缩为单独的参数当我们从Dataloader取出来的时候,又会将压缩为的单独参数分开importtorchfromtorch.utilsimportdata#准备数据true_w=torch.tensor([2,-3.4])true_b=4.2defsynthetic_data(w,b......
  • CNN-BiLSTM-Attention(12种算法优化CNN-BiLSTM-Attention多输入单输出)
     12种算法优化CNN-BiLSTM-Attention模型预测的代码。其中Attention模型可以改为单头或者多头,在代码中就是改个数字而已。代码注释已写好如何更改。12种算法优化CNN-BiLSTM-Attention多特征输入单步预测代码获取戳此处代码获取戳此处代码获取戳此处主要功能为:采用12种......
  • 亦菲喊你来学机器学习(9) --逻辑回归实现手写数字识别
    文章目录逻辑回归实现手写数字识别训练模型测试模型总结逻辑回归逻辑回归(LogisticRegression)虽然是一种广泛使用的分类算法,但它通常更适用于二分类问题。然而,通过一些策略(如一对多分类,也称为OvR或One-vs-Rest),逻辑回归也可以被扩展到多分类问题,如手写数字识别(通常是......
  • 线性回归(Linear Regression)
    一、损失(Loss)类型:L1损失【Re】:对模型对各个样本的预测的绝对误差求和。平均绝对误差(MAE)【Re】:一组样本L1损失的平均值。L2损失:【Re】对模型【Re】对各个样本的预测的误差的平方求和。均方误差【Re】:一组样本的L2 损失的平均值。如果数据中特征值超过了一定范围,或者模......
  • 【人工智能】案例分析和项目实践:使用高斯过程回归预测股票价格
    一、项目背景与目标股票价格预测是金融领域的热门话题,对于投资者、金融机构及研究者而言具有重要意义。高斯过程回归(GaussianProcessRegression,GPR)作为一种强大的非参数贝叶斯回归方法,能够处理复杂的非线性关系,同时提供预测的不确定性估计,非常适合用于股票价格预测。项目......