时间序列预测 — LSTM实现单变量风电滚动预测(Keras)

目录

1 数据处理

1.1 数据集简介

1.2 数据集处理

2 模型训练与预测

2.1 模型训练

2.2 模型滚动预测

2.3 结果可视化


1 数据处理

1.1 数据集简介

实验数据集采用数据集5:风电机组运行数据集(下载链接),包括风速、风向、温度、湿度、气压和真实功率等共30万余条。

  • WINDSPEED:预测风速
  • WINDDIRECTION:风向
  • TEMPERATURE:温度
  • HUMIDITY:湿度
  • PRESSURE:气压
  • PREPOWER:预测功率
  • ROUND(A.WS,1):实际风速
  • ROUND(A.POWER,0):实际功率
  • YD15:已有实际功率预测目标

1.2 数据集处理

首先检查数据的缺失值情况,通过统计数据可以看到,存在少量缺失值,可以通过前后项填充进行缺失值填补。

# 缺失值统计
data.isnull().sum()
缺失值填补
data = data.fillna(method='ffill')

由于本次实验是单变量滚动预测,所以只截取数据集中的功率部分

#读取数据
data = data[['ROUND(A.POWER,0)']]

计划预测后两天的数据96*2个,将要预测的数据保留(也就是未来未知的数据),单独提取出前面训练的数据(也就是历史数据),并对数据集进行滚动划分

# 训练数据,也就是历史数据
dataf = data.values[0:-96*2]# #构造数据集
def create_dataset(dataset, timesteps=36,predict_size=6):datax=[]#构造xdatay=[]#构造yfor each in range(len(dataset)-timesteps - predict_steps):x = dataset[each:each+timesteps,0]y = dataset[each+timesteps:each+timesteps+predict_steps,0]datax.append(x)datay.append(y)return datax, datay#np.array(datax),np.array(datay)

接着对数据进行归一化处理,设置预测的时间步、每次预测的步长、最后总的预测步长

#构造train and predict
scaler = MinMaxScaler(feature_range=(0,1))
dataf = scaler.fit_transform(dataf)
train = dataf.copy()
timesteps = 72#构造x,为72个数据,表示每次用前72个数据作为一段
predict_steps = 12#构造y,为12个数据,表示用后12个数据作为一段
length = 96*2#预测多步,预测288个数据,每次预测12个,想想要怎么构造预测才能满足288?

最后对数据集进行划分,并将数据变换为满足模型格式要求的数据

trainx, trainy = create_dataset(train, timesteps, predict_steps)
trainx = np.array(trainx)
trainy = np.array(trainy)
#变换
trainx = np.reshape(trainx,(trainx.shape[0],timesteps,1))#变换shape,以满足keras

2 模型训练与预测

2.1 模型训练

首先搭建模型的常规操作,然后使用训练数据trainx和trainy进行训练,进行50个epochs的训练,每个batch包含200个样本。

#lstm training
model = Sequential()
model.add(LSTM(128,input_shape=(timesteps,1),return_sequences= True))
model.add(Dropout(0.5))
model.add(LSTM(128,return_sequences=True))
#model.add(Dropout(0.3))
model.add(LSTM(64,return_sequences=False))
#model.add(Dropout(0.2))
model.add(Dense(predict_steps))
model.compile(loss="mean_squared_error",optimizer="adam")
model.fit(trainx,trainy, epochs= 50, batch_size=200)

2.2 模型滚动预测

下面介绍文章中最重要,也是真正没有未来特征的情况下预测未来标签的方法。整体的思路也就是取出预测前72个数据预测未来的12个未来数据,然后见12个数据添加进历史数据,再预测12个数据,滚动预测。因为每次只能预测12个数据,但是我要预测96个数据,所以采用的就是循环预测的思路。每次预测的12个数据,添加到数据集中充当预测x,然后在预测新的12个y,再添加到预测x列表中,如此往复,最终预测出96个点。(里面的数据可以根据需求进行更改)

#predict
#因为每次只能预测12个数据,但是我要预测288个数据,所以采用的就是循环预测的思路。每次预测的12个数据,添加到数据集中充当预测x,然后在预测新的12个y,再添加到预测x列表中,如此往复。最终预测出288个点。
predict_xlist = [] #添加预测x列表
predict_y = [] #添加预测y列表
predict_xlist.extend(dataf[dataf.shape[0]-timesteps:dataf.shape[0],0].tolist())#已经存在的最后timesteps个数据添加进列表,预测新值(比如已经有的数据从1,2,3到288。现在要预测后面的数据,所以将216到288的72个数据添加到列表中,预测新的值即288以后的数据)
while len(predict_y) < length:predictx = np.array(predict_xlist[-timesteps:])#从最新的predict_xlist取出timesteps个数据,预测新的predict_steps个数据(因为每次预测的y会添加到predict_xlist列表中,为了预测将来的值,所以每次构造的x要取这个列表中最后的timesteps个数据词啊性)predictx = np.reshape(predictx,(1,timesteps,1))#变换格式,适应LSTM模型#print("predictx"),print(predictx),print(predictx.shape)#预测新值lstm_predict = model.predict(predictx)#predict_list.append(train_predict)#新值y添加进列表,做x#滚动预测#print("lstm_predict"),print(lstm_predict[0])predict_xlist.extend(lstm_predict[0])#将新预测出来的predict_steps个数据,加入predict_xlist列表,用于下次预测# invertlstm_predict = scaler.inverse_transform(lstm_predict)predict_y.extend(lstm_predict[0])#预测的结果y,每次预测的12个数据,添加进去,直到预测288个为止#print("xlist", predict_xlist, len(predict_xlist))#print(lstm_predict, len(lstm_predict))#print(predict_y, len(predict_y))

2.3 结果可视化

计算误差,并保存预测结果

#error
y_ture = np.array(data.values[-192:])
train_score = np.sqrt(mean_squared_error(y_ture,predict_y))
print("train score RMSE: %.2f"% train_score)
y_predict = pd.DataFrame(predict_y,columns=["predict"])
y_predict.to_csv("y_predict_LSTM.csv",index=False)

最后可视化运行结果,发现滚动预测的效果并不好,更换为负荷数据集后预测效果有明显的提升,滚动预测的方法只适合数据比较规律的数据集,对于预测效果不好的数据集,可以通过分解时间序列的方法预测。

 风电预测结果(风电波动过大,预测效果较差)

 负荷预测结果 

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

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

相关文章

JC/T 456-2015 陶瓷马赛克检测

陶瓷马赛克是指可拼接贴成联的或可单独铺贴的小规格陶瓷砖&#xff0c;可用于墙面和地面起保护及装饰作用。 JC/T 456-2015 陶瓷马赛克测试&#xff1a; 测试项目 测试方法 尺寸允许偏差 JC/T 456 外观质量 JC/T 456 吸水率 GB/T 3810.3 耐磨性 GB/T 3810.6 GB/T 381…

编程语言发展史:JavaScript语言的发展和应用

预计更新 第一部分&#xff1a;早期编程语言 1.1布尔代数和机器语言 1.2汇编语言的出现和发展 1.3高级语言的兴起 第二部分&#xff1a;主流编程语言 1.1 C语言的诞生及其影响 1.2 C语言的发展和应用 1.3 Java语言的出现和发展 1.4 Python语言的兴起和特点 1.5 JavaScript语言…

华为OD机试 - 游戏分组(Java JS Python C)

题目描述 部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分为两队,每队 5 人。 每位参与者都有一个评分,代表着他的游戏水平。为了表演赛尽可能精彩,我们需要把 10 名参赛者分为示例尽量相近的两队。 一队的实力可以表示为这一队 5 名队员的评分总和。 现在…

使用Rust开发小游戏

本文是对 使用 Rust 开发一个微型游戏【已完结】[1]的学习与记录. cargo new flappy 在Cargo.toml的[dependencies]下方增加: bracket-lib "~0.8.7" main.rs中: use bracket_lib::prelude::*;struct State {}impl GameState for State { fn tick(&mut self,…

每日一题--相交链表

离思五首-元稹 曾经沧海难为水&#xff0c;除却巫山不是云。 取次花丛懒回顾&#xff0c;半缘修道半缘君。 目录 题目描述&#xff1a; 思路分析&#xff1a; 方法及时间复杂度&#xff1a; 法一 计算链表长度(暴力解法) 法二 栈 法三 哈希集合 法四 map或unordered_map…

【面经八股】搜广推方向:常见面试题(二)

【面经&八股】搜广推方向:常见面试题(二) 文章目录 【面经&八股】搜广推方向:常见面试题(二)1. FTRL 是什么?(Follow The Regularized Leader)2. 梯度下降方法3. 推荐系统中常见的Embedding方法有哪些?4. Embedding与推荐系统有哪些结合5. FM 和 FFM6. FNN7. 深…

一文学会使用React-Router v6

文章目录 基本格式createBrowserRouterType Declarationroutesbasenamefuture and window ... 省略 <RouterProvider>fall上述文本提到 createBrowserRouter 函数的一个特性&#xff1a;在非服务器端渲染应用程序时&#xff0c;当它挂载时会初始化所有匹配的路由加载器。…

解决hbuilder使用android studio模拟器不能热更新

hbuilder使用android studio模拟器编&#xff0c;在编写代码时&#xff0c;不能热更新&#xff0c;总是需要重启虚拟机中的程序&#xff0c;hbuilderx的版本是3.1.22&#xff0c;android studio的版本是4.2.2 同时在hbuilderx中出现如下报错信息&#xff1a; 报错信息&#x…

HuggingFace学习笔记--AutoModel的使用

1--AutoModel的使用 官方文档 AutoModel 用于加载模型&#xff1b; 1-1--简单Demo 测试代码&#xff1a; from transformers import AutoTokenizer, AutoModelif __name__ "__main__":checkpoint "distilbert-base-uncased-finetuned-sst-2-english"t…

java进阶---多态

多态的概述 什么是多态 同一个对象,在不同时刻表现出来的不同形态 多态的前提 要有继承或实现关系要有方法的重写要有父类引用指向子类对象 多态的具体实现 对象的多态是多态的核心和重点 规则: 一个对象的编译类型与运行类型可以不一致编译类型在定义对象时,就确定了,…

三数之和问题

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&…

【笔记 Pytorch 08】深度学习模板 (未完)

文章目录 一、声明二、工程结构三、文件内容main.pymodel.pydataset.pyutils.py 四、问题汇总 一、声明 非常感谢这些资料的作者&#xff1a; 【参考1】、【PyTorch速成教程 (by Sung Kim)】 二、工程结构 ├── main.py&#xff1a;实现训练 (train) 、验证(validation)和…

python pip安装第三方包时报错 error: Microsoft Visual C++ 14.0 or greater is required.

文章目录 1.问题2.原因3.解决办法 1.问题 pip install 的时候报错一大堆&#xff0c;其中有这么一段话 &#x1f447; error: Microsoft Visual C 14.0 or greater is required. Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visua…

rdf-file:读和写

<dependency><groupId>com.alipay.rdf.file</groupId><artifactId>rdf-file-core</artifactId><version>2.2.10</version> </dependency>一&#xff1a;读 一&#xff1a;写 写文件之正常写 协议布局模板 使用内置的布局文…

二分 模板

好久没更新博客了&#xff0c;之前一直在准备比赛&#xff0c;忙着学算法和写题&#xff0c;今天写了一道二分答案的题&#xff0c;发现之前那种二分写法有一丢丢的问题&#xff0c;导致有道题只能过97%的点。 emmm,还是把最经典的二分的板子写在这记录下&#xff08;这里参考…

python每日一题——8无重复字符的最长子串

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串…

精进Beautiful Soup 小技巧(二)---处理多种页面结构

前言: 为了处理多种不同结构的页面&#xff0c;一个灵活的代码基础是至关重要的。一些针对性的技巧和方法&#xff0c;让你能够优雅地解决遇到的页面结构多元化的问题。 使用条件语句适配不同布局 当面对页面布局差异时&#xff0c;选择合适的条件语句至关重要。 认识布局类型…

正则表达式例题-PTA

PTA-7-55 判断指定字符串是否合法-CSDN博客 7-54 StringBuffer-拼接字符串 题目&#xff1a; 输入3个整数n、begin、end。 将从0到n-1的数字拼接为字符串str。如&#xff0c;n12&#xff0c;则拼接出来的字符串为&#xff1a;01234567891011 最后截取字符串str从begin到end(包…

【2023 年终盘点】今年用的最多的 10 款浏览器插件

分享顺哥今年用的最多的 10 款浏览器插件。 排名不分先后,涉及各个方面的应用。 大家有好用的插件也欢迎在评论区留言分享! 视频 YouTube:https://youtu.be/ZpTydUSBwCA 顺哥博客 浏览器扩展篇 注意: 1、以下介绍的均为在 Google Chrome 浏览器适用的小插件,部分插件…

2018年11月8日 Go生态洞察:参与2018年Go用户调查

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…