【Python TensorFlow】CNN-BiLSTM时序预测 卷积神经网络-双向长短期记忆神经网络组合模型(附代码)

资源下载:https://download.csdn.net/download/vvoennvv/92352150

目录

一,概述

传统单一 RNN 或 LSTM 模型在处理含多尺度局部模式与长序列依赖的多特征时序预测任务中,往往存在对局部突变敏感性不足、长距离信息捕获衰减以及多步预测误差累积等问题。为提升建模能力,当前算法构建了卷积神经网络(CNN)与双向长短期记忆网络(BiLSTM)组合的混合结构:前端一维卷积与池化层侧重提取局部时间片内的短期形态特征,后端双向 LSTM 同时在正向与反向时间维上聚合长期上下文依赖,再经全连接层输出多步预测结果,实现多特征输入→多步输出的时序回归。优化过程采用标准反向传播与 Adam 优化器,结合归一化预处理与滑动窗口样本构造,增强训练稳定性与泛化能力。

CNN-BiLSTM算法的流程如下:

(1)数据准备:首先,我们需要准备历史数据作为训练集。

(2)数据预处理:对于训练集中的数据,我们需要进行一些预处理操作,比如去除异常值、归一化等,以提高预测模型的准确性。

(3)网络构建:根据预处理后的训练集,我们构建CNN-BiLSTM网络模型。该模型包括输入层、卷积层、池化层、双向LSTM层和输出层。

(4)模型训练:采用 MSE 作为回归损失,Adam 优化器提升收敛速度与鲁棒性,同时监控 MAE 作为评估指标。

(5)模型评估:在训练完成后,我们需要对模型进行评估。这可以通过将训练集中的一部分数据作为测试集,来计算模型的预测误差和准确率。

二,代码

代码中文注释非常清晰,按照示例数据修改格式,替换数据集即可运行,数据集可以是csv或者excel表格。

部分代码如下:

复制代码
if __name__ == "__main__":
    warnings.filterwarnings("ignore")  # 取消警告
    # 使用pandas模块的read_csv函数读取名为"电力负荷预测数据.csv"的文件。
    # 参数 'encoding' 设置为 'gb2312',这通常用于读取中文字符,确保文件中的中文字符能够正确读取。
    # 读取的数据被存储在名为 'dataset' 的DataFrame变量中。
    # dataset = pd.read_csv("电力负荷预测数据.csv", encoding='gb2312')
    # 下面是读取xlsx的方式,根据实际数据集文件选择是read_csv还是read_excel
    dataset = pd.read_excel("风电场功率预测.xlsx", sheet_name='Sheet1', header=0)
    print(dataset)  # 显示dataset数据

    # 从dataset DataFrame中提取数据。
    # dataset.values将DataFrame转换为numpy数组。
    # [:,1:],逗号前是行,逗号之后是列。这个表示选择所有行(:)和从第二列到最后一列(1:)的数据。
    # 这样做通常是为了去除第一列,这在第一列是索引或不需要的数据时很常见。
    # 只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:
    # 单输入单步预测,就让values等于某一列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
    # 单输入多步预测,就让values等于某一列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
    # 多输入单步预测,就让values等于多列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
    # 多输入多步预测,就让values等于多列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
    values = dataset.values[:, 1:]
    # 如果第一列不是索引,需保留全部列的数据时,则使用下面这句代码,并把上面那句代码屏蔽
    # values = dataset.values[:, :]

    # 确保所有数据是浮点数
    # 将values数组中的数据类型转换为float32。
    # 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
    values = values.astype('float32')

    # 下面是多特征输入,多步预测的案例
    n_in = 5  # 输入前5行的数据
    n_out = 2  # 预测未来2步的数据
    or_dim = values.shape[1]  # 记录特征数据维度
    # 默认是全部数据用于本次网络的训练与测试,也可以设定具体是数值,比如2000,这个数值不能超过实际的数据点
    num_samples = values.shape[0] - n_in - n_out
    # num_samples = 2000
    scroll_window = 1  # 如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
    res = data_collation(values, n_in, n_out, or_dim, scroll_window, num_samples)

    # 把数据集分为训练集和测试集
    # 将前面处理好的DataFrame(data)转换成numpy数组,方便后续的数据操作。
    values = np.array(res)

    # 计算训练集的大小。
    # 设置80%作为训练集
    # int(...) 确保得到的训练集大小是一个整数。
    n_train_number = int(num_samples * 0.8)

    # 先划分数据集,在进行归一化,这才是正确的做法!
    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()的区别

    # 将训练集的输入数据vp_train重塑成三维格式。
    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
    vp_train = vp_train.reshape((vp_train.shape[0], n_in, or_dim))

    # 将测试集的输入数据vp_test重塑成三维格式。
    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
    vp_test = vp_test.reshape((vp_test.shape[0], n_in, or_dim))

    # 调用cnn_bilstm_model函数来建立CNN-BiLSTM模型
    model = cnn_bilstm_model()

。。。。。。

三,运行结果

资源下载:https://download.csdn.net/download/vvoennvv/92352150

相关推荐
程序员三藏6 小时前
接口测试及常用接口测试工具总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
小二·8 小时前
Python Web 开发进阶实战 :AI 原生数字孪生 —— 在 Flask + Three.js 中构建物理世界实时仿真与优化平台
前端·人工智能·python
HyperAI超神经8 小时前
加州大学构建基于全连接神经网络的片上光谱仪,在芯片级尺寸上实现8纳米的光谱分辨率
人工智能·深度学习·神经网络·机器学习·ai编程
hmywillstronger8 小时前
【Rhino】【Python】 查询指定字段并cloud标注
开发语言·python
dyyx1119 小时前
如何从Python初学者进阶为专家?
jvm·数据库·python
二十雨辰9 小时前
[python]-函数
开发语言·python
CryptoRzz9 小时前
如何高效接入日本股市实时数据?StockTV API 对接实战指南
java·python·kafka·区块链·状态模式·百度小程序
小二·10 小时前
Python Web 开发进阶实战(终章):从单体应用到 AI 原生生态 —— 45 篇技术演进全景与未来开发者生存指南
前端·人工智能·python
极客小云10 小时前
【基于 PyQt6 的红外与可见光图像配准工具开发实战】
c语言·python·yolo·目标检测
0思必得012 小时前
[Web自动化] 处理爬虫异常
运维·爬虫·python·selenium·自动化·web自动化