本代码基于Tensor flow框架,即插即用!!!
基于CNN-LSTM-Attention的回归预测算法结合了卷积神经网络(CNN)、长短期记忆网络(LSTM)和注意力机制(Attention)三种强大的技术,通常用于时序数据的回归预测问题。这种结合模型能够有效地处理和预测复杂的时序数据,尤其是包含空间和时间信息的任务,如气象预测、股市分析、电力负荷预测等。
1. 模型概述
该模型的核心思想是通过不同网络结构的组合,充分挖掘数据中的空间和时间特征。
- CNN(卷积神经网络):用于提取输入数据中的空间特征。尤其适合处理图像、时序数据和其他具有局部关联的数据。CNN能够通过卷积操作自动识别数据中的局部模式,减少手工特征工程的需求。
- LSTM(长短期记忆网络):LSTM是一种特殊的循环神经网络(RNN),用于捕捉时间序列数据中的长时间依赖关系。它能够记住长期的历史信息,并有效防止传统RNN中的梯度消失问题。LSTM常用于处理具有时序关系的数据。
- Attention(注意力机制):注意力机制通过加权输入信息的不同部分,帮助模型聚焦于对当前任务最相关的特征。在时序预测任务中,注意力机制能够动态地调整对不同时间步的关注程度,使模型能够更加精确地抓住重要的时间窗口和关键时间点。
2. 模型架构
(1) CNN部分
CNN层通常用于处理输入数据的空间特征,尤其是在时序数据具有局部相关性时,例如一段时间内的数值变化趋势。通过卷积操作,CNN可以提取输入数据中的局部模式,然后通过池化操作减少数据的维度,从而保留更重要的特征。
- 卷积层:负责从输入序列中提取局部特征。
- 池化层:帮助降维,并保持最重要的特征信息。
(2) LSTM部分
在特征通过CNN提取之后,LSTM用于建模数据中的时间依赖性。LSTM能够捕捉长时间序列数据中的时序模式,将CNN提取的空间特征进一步处理,并为后续的预测提供时间相关的信息。
- LSTM层:处理时序特征,并通过门控机制(遗忘门、输入门、输出门)决定哪些信息应保留,哪些应被遗忘。LSTM能够有效地捕捉序列中的长短期依赖性。
(3) Attention部分
注意力机制能够对LSTM的输出进行加权,调整不同时间步的影响力。通过计算每个时间步的重要性,模型可以选择性地关注对当前预测最有价值的时间点,从而提高预测的精度。
- 加权求和:根据计算出的注意力权重,对LSTM的输出进行加权求和。
- 动态调整:注意力机制能够在每一时刻调整对各个时间步的关注程度,使模型能够集中注意力于关键信息。
(4) 回归输出层
模型的最后一层是一个全连接层,用于将CNN和LSTM输出的特征映射到回归任务的预测结果。
附件:代码
如下为关键部分代码,如需获取完整版请至代码最后一行自行获取!!
# 调用相关库
import os # 导入os模块,用于操作系统功能,比如环境变量
import math # 导入math模块,提供基本的数学功能
import pandas as pd # 导入pandas模块,用于数据处理和分析
import openpyxl
from math import sqrt # 从math模块导入sqrt函数,用于计算平方根
from numpy import concatenate # 从numpy模块导入concatenate函数,用于数组拼接
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
import numpy as np # 导入numpy模块,用于数值计算
# import tensorflow as tf # 导入tensorflow模块,用于深度学习
from sklearn.preprocessing import MinMaxScaler # 导入sklearn中的MinMaxScaler,用于特征缩放
from sklearn.preprocessing import StandardScaler # 导入sklearn中的StandardScaler,用于特征标准化
from sklearn.preprocessing import LabelEncoder # 导入sklearn中的LabelEncoder,用于标签编码
from sklearn.metrics import mean_squared_error # 导入sklearn中的mean_squared_error,用于计算均方误差
from tensorflow.keras.layers import * # 从tensorflow.keras.layers导入所有层,用于构建神经网络
from tensorflow.keras.models import * # 从tensorflow.keras.models导入所有模型,用于构建和管理模型
from sklearn.metrics import mean_squared_error, mean_absolute_error,r2_score # 导入额外的评估指标
from pandas import DataFrame # 从pandas导入DataFrame,用于创建和操作数据表
from pandas import concat # 从pandas导入concat函数,用于DataFrame的拼接
import keras.backend as K # 导入keras的后端接口
from scipy.io import savemat, loadmat # 从scipy.io导入savemat和loadmat,用于MATLAB文件的读写
from sklearn.neural_network import MLPRegressor # 从sklearn.neural_network导入MLPRegressor,用于创建多层感知器回归模型
from keras.callbacks import LearningRateScheduler # 从keras.callbacks导入LearningRateScheduler,用于调整学习率
from tensorflow.keras import Input, Model, Sequential # 从tensorflow.keras导入Input, Model和Sequential,用于模型构建
import mplcyberpunk
from qbstyles import mpl_style
import warnings
from prettytable import PrettyTable #可以优美的打印表格结果
warnings.filterwarnings("ignore") #取消警告
dataset=pd.read_excel("") #在此导入数据,excel
print(dataset)#显示dataset数据
values = dataset.values[:,1:] #只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:
# 确保所有数据是浮动的
values = values.astype('float32')
# 将values数组中的数据类型转换为float32。
# 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
def data_collation(data, n_in, n_out, or_dim, scroll_window, num_samples):
res = np.zeros((num_samples,n_in*or_dim+n_out))
for i in range(0, num_samples):
h1 = values[scroll_window*i: n_in+scroll_window*i,0:or_dim]
h2 = h1.reshape( 1, n_in*or_dim)
h3 = values[n_in+scroll_window*(i) : n_in+scroll_window*(i)+n_out,-1].T
h4 = h3[np.newaxis, :]
h5 = np.hstack((h2,h4))
res[i,:] = h5
return res
n_in = 5 # 输入前5行的数据
n_out = 2 # 预测未来2步的数据
or_dim = values.shape[1] # 记录特征数据维度
num_samples = 12900 # 可以设定从数据中取出多少个点用于本次网络的训练与测试。
scroll_window = 1 #如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
res = data_collation(values, n_in, n_out, or_dim, scroll_window, num_samples)
# 把数据集分为训练集和测试集
values = np.array(res)
# 将前面处理好的DataFrame(data)转换成numpy数组,方便后续的数据操作。
n_train_number = int(num_samples * 0.8)
# 计算训练集的大小。
# 设置80%作为训练集
# int(...) 确保得到的训练集大小是一个整数。
# 先划分数据集,在进行归一化,这才是正确的做法!
Xtrain = values[:n_train_number, :n_in*or_dim]
Ytrain = values[:n_train_number, n_in*or_dim:]
Xtest = values[n_train_number:, :n_in*or_dim]
Ytest = values[n_train_number:, n_in*or_dim:]
# 对训练集和测试集进行归一化
m_in = MinMaxScaler()
vp_train = m_in.fit_transform(Xtrain) # 注意fit_transform() 和 transform()的区别
vp_test = m_in.transform(Xtest) # 注意fit_transform() 和 transform()的区别
m_out = MinMaxScaler()
vt_train = m_out.fit_transform(Ytrain) # 注意fit_transform() 和 transform()的区别
vt_test = m_out.transform(Ytest) # 注意fit_transform() 和 transform()的区别
# In[10]:
vp_train = vp_train.reshape((vp_train.shape[0], n_in, or_dim))
# 将训练集的输入数据vp_train重塑成三维格式。
# 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
vp_test = vp_test.reshape((vp_test.shape[0], n_in, or_dim))
# 将训练集的输入数据vp_test重塑成三维格式。
# 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
# 完整版代码见:https://mbd.pub/o/bread/aJWTl5hq
3. 训练过程
训练过程中,模型通过输入的历史数据进行前向传播和反向传播,优化损失函数(通常是均方误差(MSE)或其他回归损失函数),不断调整CNN、LSTM和Attention层的权重参数,最终使模型在回归任务上达到较好的预测效果。
4. 模型优势
- 空间特征和时间特征结合:CNN提取空间特征,LSTM捕捉时间依赖性,而Attention机制进一步增强了重要时间点的影响力,适合处理复杂的时序数据。
- 注意力机制的动态加权:通过注意力机制,模型能够自动选择不同时间步的贡献,从而提高预测的准确性和鲁棒性。
- 端到端训练:CNN、LSTM和Attention部分都可以端到端训练,减少了手工特征工程的工作量。
5. 模型应用
- 电力负荷预测:结合历史负荷数据、气候变化等因素进行电力需求预测。
- 金融市场分析:根据历史股价、交易量等时间序列数据,预测未来的股票走势。
- 气象预测:通过历史气象数据(如温度、湿度、气压等)预测未来天气情况。
- 交通流量预测:分析交通数据,预测未来的交通流量或道路拥堵情况。
6. 总结
基于CNN-LSTM-Attention的回归预测算法通过结合卷积神经网络、长短期记忆网络和注意力机制,能够有效地处理复杂的时序数据,特别适合需要同时捕捉空间特征和时间特征的任务。通过这种多层次、多维度的学习策略,模型能够在多个领域(如电力负荷预测、金融预测、气象预测等)取得较好的预测效果。