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

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

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

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用卷积神经网络-长短期记忆网络(bi-lstm)-注意力机制对股票收盘价进行回归预测是一种基于深度学习的方法。该方法主要通过多层卷积神经网络提取输入数据特征,并使用双向的长短期记忆网络来学习数据的时序信息,并通过注意力机制来自动选择对预测结果具有重要贡献的部分。 首先,卷积神经网络可以有效提取输入数据的空间特征,这对于股票收盘价预测来说很关键,因为股票市场的价格变化通常具有一定的空间相关性。通过多层卷积网络的前向传播和反向传播过程,模型可以从原始数据中提取出具有预测意义的低维特征表示。 其次,双向的长短期记忆网络可以帮助我们学习到时序信息。在股票市场中,过去一段时间的价格变动通常能够为未来提供一定的指引。LSTM网络在处理时序数据时具有优势,能够自动学习到长期依赖关系。通过双向LSTM网络结构,我们可以同时考虑历史信息和未来信息,更好地捕捉到股票价格的动态变化。 最后,注意力机制被引入用于选择对预测结果贡献最重要的部分。在股票市场中,不同的特征可能对价格的预测具有不同的重要性。通过引入注意力机制,我们可以自动学习到不同时间点或特征在预测中的贡献程度,并将更多的关注点放在对预测结果具有更大影响的部分上。 综上所述,使用卷积神经网络-长短期记忆网络(bi-lstm)-注意力机制对股票收盘价进行回归预测是一种较为有效的方法。该方法可以利用卷积网络提取空间特征LSTM网络学习时序信息,并通过注意力机制选择重要特征,从而提高对股票收盘价的预测准确性。这种方法不仅可以应用于股票市场,还可以扩展到其他时序预测问题中。 ### 回答2: 在对股票收盘价进行回归预测时,可以采用卷积神经网络(Convolutional Neural Network, CNN)结合长短期记忆网络(Bidirectional Long Short-Term Memory, bi-LSTM)和注意力机制的方法。 首先,通过卷积神经网络对股票数据进行特征提取。卷积层可以提取出时间序列数据中的局部模式和趋势,并且具有平移不变性,能够保留数据的空间结构信息。卷积层的输出经过池化操作,进一步减少参数数量,并提取出更加重要的特征。 接下来,通过双向LSTM模型对经过卷积特征提取的序列数据进行处理。LSTM模型可以捕捉到序列数据中的长期依赖关系,并能够记忆之前的状态,相比传统的循环神经网络效果更好。通过双向LSTM,可以同时考虑到当前数据点前后的信息,提升模型对时间序列数据的理解能力。 最后,引入注意力机制来加权模型对各个时间步的关注程度。注意力机制可以根据每个时间步的重要性,给予不同的权重。对于股票收盘价的回归预测,模型可以更加关注重要的时间步,提高预测的准确性。 整个模型的训练过程包括特征提取、双向LSTM注意力机制的训练。在训练过程中,可以采用均方误差(Mean Squared Error, MSE)作为损失函数,通过梯度下降算法进行参数优化。 最后,在进行股票收盘价的预测时,可以将历史数据输入到模型中,根据模型输出的预测结果进行回归预测。通过不断的迭代优化,可以提高模型对股票收盘价的准确预测能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值