时间序列预测 — BiLSTM实现多变量多步光伏预测(Tensorflow)

目录

1 数据处理

1.1 导入库文件

1.2 导入数据集

1.3 缺失值分析

2 构造训练数据

3 模型训练

3.1 BiLSTM网络 

3.2 模型训练

4 模型预测


1 数据处理

1.1 导入库文件

import time
import datetime
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt  
from sampen import sampen2  # sampen库用于计算样本熵
from vmdpy import VMD  # VMD分解库import tensorflow as tf 
from sklearn.cluster import KMeans
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, mean_absolute_percentage_error 
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, LSTM, GRU
from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping# 忽略警告信息
import warnings
warnings.filterwarnings('ignore')  

1.2 导入数据集

实验数据集采用数据集8:新疆光伏风电数据集(下载链接),数据集包括组件温度(℃) 、温度(°)    气压(hPa)、湿度(%)、总辐射(W/m2)、直射辐射(W/m2)、散射辐射(W/m2)、实际发电功率(mw)特征,时间间隔15min。对数据进行可视化:

# 导入数据
data_raw = pd.read_excel("E:\\课题\\08数据集\\新疆风电光伏数据\\光伏2019.xlsx")
data_raw
from itertools import cycle
# 可视化数据
def visualize_data(data, row, col):cycol = cycle('bgrcmk')cols = list(data.columns)fig, axes = plt.subplots(row, col, figsize=(16, 4))fig.tight_layout()if row == 1 and col == 1:  # 处理只有1行1列的情况axes = [axes]  # 转换为列表,方便统一处理for i, ax in enumerate(axes.flat):if i < len(cols):ax.plot(data.iloc[:,i], c=next(cycol))ax.set_title(cols[i])else:ax.axis('off')  # 如果数据列数小于子图数量,关闭多余的子图plt.subplots_adjust(hspace=0.6)plt.show()visualize_data(data_raw.iloc[:,1:], 2, 4)

​单独查看部分功率数据,发现有较强的规律性。

​因为只是单变量预测,只选取实际发电功率(mw)数据进行实验:

1.3 缺失值分析

首先查看数据的信息,发现并没有缺失值

data_raw.info()

 进一步统计缺失值

data_raw.isnull().sum()

2 构造训练数据

构造训练数据,也是真正预测未来的关键。首先设置预测的timesteps时间步、predict_steps预测的步长(预测的步长应该比总的预测步长小),length总的预测步长,参数可以根据需要更改。

timesteps = 96*5 #构造x,为96*5个数据,表示每次用前96*5个数据作为一段
predict_steps = 96 #构造y,为96个数据,表示用后96个数据作为一段
length = 96 #预测多步,预测96个数据
feature_num = 7 #特征的数量

通过前5天的timesteps数据预测后一天的数据predict_steps个,需要对数据集进行滚动划分(也就是前timesteps行的特征和后predict_steps行的标签训练,后面预测时就可通过timesteps行特征预测未来的predict_steps个标签)。因为是多变量,特征和标签分开划分,不然后面归一化会有信息泄露的问题。

# 构造数据集,用于真正预测未来数据
# 整体的思路也就是,前面通过前timesteps个数据训练后面的predict_steps个未来数据
# 预测时取出前timesteps个数据预测未来的predict_steps个未来数据。
def create_dataset(datasetx,datasety,timesteps=36,predict_size=6):datax=[]#构造xdatay=[]#构造yfor each in range(len(datasetx)-timesteps - predict_steps):x = datasetx[each:each+timesteps]y = datasety[each+timesteps:each+timesteps+predict_steps]datax.append(x)datay.append(y)return datax, datay

数据处理前,需要对数据进行归一化,按照上面的方法划分数据,这里返回划分的数据和归一化模型,函数的定义如下:

# 数据归一化操作
def data_scaler(datax,datay):# 数据归一化操作scaler1 = MinMaxScaler(feature_range=(0,1))scaler2 = MinMaxScaler(feature_range=(0,1))datax = scaler1.fit_transform(datax)datay = scaler2.fit_transform(datay)# 用前面的数据进行训练,留最后的数据进行预测trainx, trainy = create_dataset(datax[:-timesteps-predict_steps,:],datay[:-timesteps-predict_steps,0],timesteps, predict_steps)trainx = np.array(trainx)trainy = np.array(trainy)return trainx, trainy, scaler1, scaler2

然后对数据按照上面的函数进行划分和归一化。通过前5天的96*5数据预测后一天的数据96个,需要对数据集进行滚动划分(也就是前96*5行的特征和后96行的标签训练,后面预测时就可通过96*5行特征预测未来的96个标签)

datax = df_vmd[:,:-1]
datay = df_vmd[:,-1].reshape(df_vmd.shape[0],1)
trainx, trainy, scaler1, scaler2 = data_scaler(datax, datay)

3 模型训练

3.1 BiLSTM网络 

长短期记忆神经网络(Long Short-Term Memory, LSTM) 是一种时间循环神经网络,是为
了解决一般的RNN存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经
网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一
个tanh层。 LSTM神经网络采用门控机制替换了循环神经网络简单的隐含层神经元, 可以解决长
期依赖的问题,在处理时序问题上表现出色。

LSTM 神经网络

传统的 LSTM 网络只能根据历史状态向前编码,无法考虑反向序列的影响。而电力负荷数
据变化与时间发展密切相关,未来数据通常与过去数据相似, 为了更全面、准确地预测,需要
考虑反向序列的影响。 双向长短期记忆神经网络(Bi-directional Long Short-Term Memory,
BiLSTM) 引入了双向计算的思想,它可以实现基于原始的 LSTM 网络同时进行正向和反向计
算, 可以同时提取前向和后向信息,更好地挖掘负荷数据的时序特征,进一步提高预测模型精度。

BiLSTM 神经网络

可以通过Bidirectional()来构建一个BiLSTM模型并进行训练的过程,实现主体代码如下:

    model.add(Bidirectional(LSTM(units=50, return_sequences=True), input_shape=(timesteps, feature_num)))model.add(Bidirectional(LSTM(units=100, return_sequences=True), input_shape=(timesteps, feature_num)))model.add(Bidirectional(LSTM(units=150)))
  •  units=50:表示LSTM层中有50个神经元
  • return_sequences=True:表示该层返回整个序列而不仅仅是输出序列的最后一个
  • input_shape=(timesteps, feature_num):表示输入数据的形状为(timesteps, feature_num),这里timesteps和feature_num是预先定义好的输入数据的时间步数和特征数。

第一行代码向模型中再次添加了一个双向的LSTM层,使用了units=50个神经元。

第二行代码向模型中再次添加了一个双向的LSTM层,与上一行类似,但这次使用了units=100个神经元。

第三行代码向模型中添加了另一个双向的LSTM层,这次没有设置return_sequences=True,表示该层不返回整个序列,而是只返回输出序列的最后一个值。
 

3.2 模型训练

首先搭建模型的常规操作,然后使用训练数据trainx和trainy进行训练,进行50个epochs的训练,每个batch包含64个样本。此时input_shape划分数据集时每个x的形状。(建议使用GPU进行训练,因为本人电脑性能有限,建议增加epochs值;也可以依次增加LSTM网络中units)

# # 创建BiLSTM模型
def BiLSTM_model_train(trainx, trainy):# 调用GPU加速gpus = tf.config.experimental.list_physical_devices(device_type='GPU')for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)# BiLSTM网络构建 start_time = datetime.datetime.now()model = Sequential()model.add(Bidirectional(LSTM(units=50, return_sequences=True), input_shape=(timesteps, feature_num)))model.add(Bidirectional(LSTM(units=100, return_sequences=True), input_shape=(timesteps, feature_num)))model.add(Bidirectional(LSTM(units=150)))model.add(Dropout(0.1))model.add(Dense(predict_steps))model.compile(loss='mse', optimizer='adam')# 模型训练model.fit(trainx, trainy, epochs=50, batch_size=64)end_time = datetime.datetime.now()running_time = end_time - start_time# 保存模型model.save('BiLSTM_model.h5')# 返回构建好的模型return model
model = BiLSTM_model_train(trainx, trainy)

4 模型预测

首先加载训练好后的模型

# 加载模型
from tensorflow.keras.models import load_model
model = load_model('BiLSTM_model.h5')

准备好需要预测的数据,训练时保留了6天的数据,将前5天的数据作为输入预测,将预测的结果和最后一天的真实值进行比较。

y_true = datay[-timesteps-predict_steps:-timesteps]
x_pred = datax[-timesteps:]

预测并计算误差,并进行可视化,将这些步骤封装为函数。

# 预测并计算误差和可视化
def predict_and_plot(x, y_true, model, scaler, timesteps):# 变换输入x格式,适应LSTM模型predict_x = np.reshape(x, (1, timesteps, feature_num))  # 预测predict_y = model.predict(predict_x)predict_y = scaler.inverse_transform(predict_y)y_predict = []y_predict.extend(predict_y[0])# 计算误差r2 = r2_score(y_true, y_predict)rmse = mean_squared_error(y_true, y_predict, squared=False)mae = mean_absolute_error(y_true, y_predict)mape = mean_absolute_percentage_error(y_true, y_predict)print("r2: %.2f\nrmse: %.2f\nmae: %.2f\nmape: %.2f" % (r2, rmse, mae, mape))# 预测结果可视化cycol = cycle('bgrcmk')plt.figure(dpi=100, figsize=(14, 5))plt.plot(y_true, c=next(cycol), markevery=5)plt.plot(y_predict, c=next(cycol), markevery=5)plt.legend(['y_true', 'y_predict'])plt.xlabel('时间')plt.ylabel('功率(kW)')plt.show()return y_predict
y_predict_nowork = predict_and_plot(x_pred, y_true, model, scaler2, timesteps)

最后得到可视化结果,发下可视化结果并不是太好,可以通过调参和数据处理进一步提升模型预测效果。

​  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

触发器和函数:让代码更接近数据

来源&#xff1a;艾特保IT 虹科干货丨触发器和函数&#xff1a;让代码更接近数据 原文链接&#xff1a;虹科干货 | 触发器和函数&#xff1a;让代码更接近数据 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 文章速览&#xff1a; 触发器和函数的基础知识 编写语言…

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、龙辰辰事件概述二、为什么龙辰辰会被质疑AI创作&#xff1f;1.1 AI 作画的特点2.2 关于建行的合作宣传图…

都是星光赶路人

不知不觉已经快工作五年了&#xff0c;工作以后就感觉时间一年比一年快&#xff0c;仿佛昨天才刚毕业&#xff0c;就像陈鸿宇歌中的那样&#xff0c;多少遗憾自负存念想&#xff0c;唯有时间不可挡。五年&#xff0c;思考了很多&#xff0c;也想明白了许多。正好借着年末&#…

Angular+Nginx区域HIS医院信息管理系统源码

医院管理信息系统&#xff08;HIS&#xff09;是医院基本、重要的管理系统&#xff0c;是医院大数据的基础。“云”指系统采用云计算的技术和建设模式&#xff0c;具有可扩展、易共享、区域化、易协同、低成本、易维护、体验好的优势。“H”是医疗卫生&#xff0c;由原来医院 (…

利用transition-group标签包裹li标签,实现输入数据后按Enter键将数据添加到列表中

1.效果图 2.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.3.0/vue.js"></script><div id&quo…

CLEAR MOT评估指标

错误正样本&#xff08;False Positive&#xff0c;FP&#xff09;&#xff1a;整个视频中被预测为正的负样本数。 错误负样本&#xff08;False Negatives&#xff0c;FN&#xff09;&#xff1a;整个视频中被预测为负的正样本数。 IDs&#xff1a;跟踪过程中目标ID切换总数。…

QT----第三天,Visio stdio自定义封装控件

目录 第三天1 自定义控件封装 源码&#xff1a;CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass&#xff0c;同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到mainwidget.ui&#xff0c;拖入一个widget&#xff08;因为我们封装的也…

【送书活动】探究AIGC、AGI、GPT和人工智能大模型

文章目录 前言01 《ChatGPT 驱动软件开发》推荐语 02 《ChatGPT原理与实战》推荐语 03 《神经网络与深度学习》推荐语 04 《AIGC重塑教育》推荐语 05 《通用人工智能》推荐语 后记赠书活动 前言 人工智能技术在过去几年中发展迅猛&#xff0c;得益于大数据、云计算、深度学习等…

C++1114新标准——统一初始化(Uniform Initialization)、Initializer_list(初始化列表)、explicit

系列文章目录 C11&14新标准——Variadic templates&#xff08;数量不定的模板参数&#xff09; C11&14新标准——Uniform Initialization&#xff08;统一初始化&#xff09;、Initializer_list&#xff08;初始化列表&#xff09;、explicit 文章目录 系列文章目录1…

TiDB 7.5 LTS 发版丨提升规模化场景下关键应用的稳定性和成本的灵活性

作者&#xff1a; TiDB社区小助手 原文来源&#xff1a; https://tidb.net/blog/1cffec89 互联网时代&#xff0c;数据的迅猛增长给数据库带来了可扩展性的挑战&#xff0c;Gen AI 带来的数据暴增更加剧了这种挑战。传统的数据分片已经不能承载新时代数据暴增的需求&#xf…

UE4 Niagara学习笔记

需要在其他发射器的同一个粒子位置发射其他粒子就用Spawn Particles from other Emitter 把发射器名字填上去即可 这里Move to Nearest Distance Field Subface GPU&#xff0c;可以将生成的Niagara附着到最近的物体上 使用场景就是做的火苗附着到物体上

【每日一题】2697. 字典序最小回文串-2023.12.13

题目&#xff1a; 2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变成一个 回文串 。如果执行…

Python和Beautiful Soup爬虫助力提取文本内容

大家好&#xff0c;网络爬虫是一项非常抢手的技能&#xff0c;收集、分析和清洗数据是数据科学项目中最重要的部分。今天介绍如何从链接中爬取高质量文本内容&#xff0c;我们使用迭代&#xff0c;从大约700个链接中进行网络爬取。如果想直接跳转到代码部分&#xff0c;可以在下…

Java版本+鸿鹄企业电子招投标系统源代码+支持二开+Spring cloud +鸿鹄电子招投标系统

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。为了符合国家电子招投标法律法规及相关规范&#xff0c;…

2697. 字典序最小回文串(2023-12-13)

力扣每日一题 题目&#xff1a;2697. 字典序最小回文串 日期&#xff1a;2023-12-13 用时&#xff1a;4 m 53 s 时间&#xff1a;7ms 内存&#xff1a;43.61MB 代码&#xff1a; class Solution {public String makeSmallestPalindrome(String s) {char[] chs s.toCharArray…

基于SpringBoot的在线考试系统

基于SpringBoot的在线考试系统 文章目录 基于SpringBoot的在线考试系统 一.引言二.系统设计三.技术架构四.系统功能模块设计五.功能实现六.源码获取 一.引言 在线考试系统是一种基于互联网技术的教育辅助工具&#xff0c;它通过利用SpringBoot框架的优势&#xff0c;实现了高效…

c语言注册登录+实验室物帐管理系统

实验室物帐管理系统&#xff1a;用户手册 1引言 本用户手册旨在为实验室物帐管理系统的使用提供指导和帮助。该系统旨在实现以下功能&#xff1a;仪器设备条目的输入、仪器设备的借还以及库存情况查询及修改。通过本手册&#xff0c;您将了解到如何正确使用该系统&#xff0c…

创建全0或全1矩阵numpy.matlib.zeros()numpy.matlib.ones()

【小白从小学Python、C、Java】 【计算机等级考试500强证书考研】 【Python-数据分析】 创建全0或全1矩阵 numpy.matlib.zeros() numpy.matlib.ones() 选择题 请问执行np.matlib.zeros((2,2))的结果是&#xff1a; import numpy.matlib import numpy as np print("【执行】…

图片压缩软件4K Image Compressor Pro mac特点介绍

4K Image Compressor Pro mac是一款专业的图片压缩软件&#xff0c;它可以在不损失图像质量的前提下&#xff0c;优化图片文件的大小&#xff0c;从而节省存储空间&#xff0c;方便在社交媒体上共享图片&#xff0c;并优化网站加载速度。 4K Image Compressor Pro mac软件特点 …

Go语言文件操作:文件读写案例以及相关细节介绍

文章目录 介绍一、打开文件1.1 以只读的方式打开文件1.2 自定义的方式打开文件 二、文件读写代码案例2.1 从磁盘读取数据2.2 向磁盘写数据 介绍 对文件进行操作时&#xff0c;其中最基本的操作就是"读写"。本文将介绍Go语言中文件读写的案例和相关细节。在Go语言中&…