【Python TensorFlow】 BiTCN-LSTM双向时间序列卷积长短期记忆神经网络时序预测算法(附代码)

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

目录

一,概述

传统的单一 RNN/LSTM 时间序列预测模型在同时建模局部短期模式与跨较长时间跨度的依赖时存在效率或精度不足的问题;纯卷积的TCN(Temporal Convolutional Network)虽然并行性好、可利用扩张卷积(dilated convolution)获取多尺度感受野,但在建模累积性的长程记忆上仍可能欠缺。为增强模型对多尺度时序特征的捕获与长短期依赖融合,当前算法将双向(Bidirectional)封装的 TCN 与 LSTM 串联,形成 BiTCN-LSTM 结构:

BiTCN-LSTM算法的流程如下:

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

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

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

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

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

BiTCN-LSTM 模型将双向 TCN 的多尺度卷积表示力与 LSTM 的顺序记忆机制有机叠加,通过统一的滑动窗口数据构造实现多特征---多步并行预测,在时序复杂度与预测精度之间取得平衡。其流程清晰、易扩展,可作为传统单结构(纯 LSTM / 纯 CNN)改进的中间形架构,为进一步引入元启发式优化或注意力增强提供良好基础。

二,代码

代码中文注释非常清晰,按照示例数据修改格式,替换数据集即可运行,数据集可以是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))

    # 调用BiTCN_LSTM_model函数来建立BiTCN-LSTM模型
    model = BiTCN_LSTM_model()

。。。。。。

三,运行结果

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

相关推荐
劈星斩月20 小时前
神经网络之感知机(Perceptron)
神经网络·感知机·perceptron
喵手21 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
Suchadar21 小时前
if判断语句——Python
开发语言·python
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大21 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
喵手21 小时前
Python爬虫零基础入门【第九章:实战项目教学·第14节】表格型页面采集:多列、多行、跨页(通用表格解析)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·表格型页面采集·通用表格解析
0思必得01 天前
[Web自动化] 爬虫之API请求
前端·爬虫·python·selenium·自动化
莫问前路漫漫1 天前
WinMerge v2.16.41 中文绿色版深度解析:文件对比与合并的全能工具
java·开发语言·python·jdk·ai编程
木头左1 天前
Backtrader框架下的指数期权备兑策略资金管理实现与风险控制
python
玄同7651 天前
LangChain 核心组件全解析:构建大模型应用的 “乐高积木”
人工智能·python·语言模型·langchain·llm·nlp·知识图谱
喵手1 天前
Python爬虫实战:从零构建 Hacker News 数据采集系统:API vs 爬虫的技术抉择!(附CSV导出 + SQLite 存储)!
爬虫·python·爬虫实战·hacker news·python爬虫工程化实战·零基础python爬虫教学·csv导出