【Python TensorFlow】 TCN-BiGRU时间序列卷积双向门控循环神经网络时序预测算法(附代码)

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

目录

一,概述

传统的循环神经网络(RNN)在处理长序列时存在梯度消失和梯度爆发等问题,而单一的LSTM或GRU网络在捕捉时序数据的多尺度特征方面存在局限性。为了解决这些问题,我们将时间卷积网络(TCN)与双向门控循环单元(BiGRU)相结合,提出了TCN-BiGRU混合预测算法。

首先,我们来了解一下TCN和BiGRU的特点。TCN通过扩张卷积和因果卷积的方式,能够有效捕捉序列数据中不同时间尺度的特征,且具有并行计算的优势。BiGRU则通过双向信息流,既能从过去获取信息,也能从未来获取信息,从而更全面地理解时序模式。在TCN-BiGRU算法中,我们将这两种网络结构串联使用,充分发挥各自的优势。

TCN-BiGRU的流程如下:

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

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

(3)网络构建:根据预处理后的训练集,我们构建TCN-BiGRU网络模型。该模型包括输入层、时间卷积层(TCN)、BiGRU层、全连接层和输出层。

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

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

二,代码

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

部分代码如下:

复制代码
if __name__ == "__main__":
    warnings.filterwarnings("ignore")  # 取消警告
    
    # # 设置随机种子,确保结果可复现(日常训练不固定随机种子,发表论文或需要精确复现时再取消注释这段代码。)
    # import random
    # import tensorflow as tf
    # seed_value = 42
    # random.seed(seed_value)
    # np.random.seed(seed_value)
    # tf.random.set_seed(seed_value)
    # os.environ['PYTHONHASHSEED'] = str(seed_value)
    
    # 使用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 = 20  # 微调:时间窗口优化到20
    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)

    # 计算训练集的大小。
    # 设置85%作为训练集(增加训练数据量)划分训练集和测试集
    # int(...) 确保得到的训练集大小是一个整数。
    n_train_number = int(num_samples * 0.85)

    # 先划分数据集,在进行归一化,这才是正确的做法!
    # 对于时序数据,应该按时间顺序划分训练集和验证集,把训练集的前80%作为真正的训练集,后20%作为验证集
    n_val_number = int(n_train_number * 0.8)  # 训练集的80%用于训练,20%用于验证
    
    Xtrain = values[:n_val_number, :n_in * or_dim]
    Ytrain = values[:n_val_number, n_in * or_dim:]
    Xval = values[n_val_number:n_train_number, :n_in * or_dim]
    Yval = values[n_val_number: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_val = m_in.transform(Xval)  # 使用训练集的缩放参数
    vp_test = m_in.transform(Xtest)  # 注意fit_transform() 和 transform()的区别
    m_out = MinMaxScaler()
    vt_train = m_out.fit_transform(Ytrain)  # 注意fit_transform() 和 transform()的区别
    vt_val = m_out.transform(Yval)  # 使用训练集的缩放参数
    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_val = vp_val.reshape((vp_val.shape[0], n_in, or_dim))

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

    # 调用tcn_bigru_model函数来建立TCN-BiGRU模型
    model = tcn_bigru_model()

......

三,运行结果

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

相关推荐
代码方舟2 小时前
Java Spring Boot 实战:构建天远高并发个人消费能力评估系统
java·大数据·spring boot·python
小句2 小时前
arthas-boot.jar 热替换
java·python·jar
风送雨2 小时前
八周Python强化计划(六)
开发语言·python
IT·小灰灰2 小时前
AI算力租赁完全指南(三):实战篇——GPU租用实操教程:从选型、避坑到跑通AI项目
人工智能·python·深度学习
Francek Chen3 小时前
【自然语言处理】应用04:自然语言推断与数据集
人工智能·pytorch·深度学习·神经网络·自然语言处理
冰西瓜60011 小时前
从项目入手机器学习——鸢尾花分类
人工智能·机器学习·分类·数据挖掘
爱思德学术11 小时前
中国计算机学会(CCF)推荐学术会议-C(人工智能):IJCNN 2026
人工智能·神经网络·机器学习
在屏幕前出油11 小时前
二、Python面向对象编程基础——理解self
开发语言·python
Java后端的Ai之路11 小时前
【神经网络基础】-神经网络学习全过程(大白话版)
人工智能·深度学习·神经网络·学习