机器学习算法实战案例:LSTM实现多变量多步负荷预测

news2025/1/10 21:17:27

文章目录

      • 1 数据处理
        • 1.1 数据集简介
        • 1.2 数据集处理
      • 2 模型训练与预测
        • 2.1 模型训练
        • 2.2 模型多步预测
        • 2.3 结果可视化
      • 答疑&技术交流
      • 机器学习算法实战案例系列

1 数据处理

1.1 数据集简介

实验数据集采用数据集6:澳大利亚电力负荷与价格预测数据,包括数据集包括日期、小时、干球温度、露点温度、湿球温度、湿度、电价、电力负荷特征,时间间隔30min。

单独查看部分负荷数据,发现有较强的规律性。

1.2 数据集处理

首先检查数据的缺失值情况,通过统计数据可以看到,数据比较完整,不存在缺失值。其他异常值和数据处理可以自行处理。

计划预测后一天的数据48个,将要预测的数据保留(也就是未来未知的数据),单独提取出前面训练的数据(也就是历史数据),并对数据集进行滚动划分。跟前面文章的划分方式不同,因为是多变量,特征和标签分开划分,不然后面处理会有很多问题。

dataf = data.values[0:-48]
def create_dataset(datasetx,datasety,timesteps=36,predict_size=6):

    for each in range(len(datasetx)-timesteps - predict_steps):

        x = datasetx[each:each+timesteps,0:6]

        y = datasety[each+timesteps:each+timesteps+predict_steps,0]

    return datax, datay#np.array(datax),np.array(datay)

接着设置预测的时间步、每次预测的步长、最后总的预测步长,参数可以根据需要更改。跟前面文章不同的是,这里没有滚动预测,因为没有持续的特征传入,在实际运用有特征传入时可以滚动预测。

timesteps = 48 #构造x,为48个数据,表示每次用前48个数据作为一段

predict_steps = 48 #构造y,为48个数据,表示用后12个数据作为一段

length = 48 #预测多步,预测48个数据,每次预测48个

接着对数据进行归一化处理,跟前面文章的处理方式不同,特征和标签分开划分,并分开进行归一化处理。

datafy = dataf[:,5].reshape(25872,1)

scaler1 = MinMaxScaler(feature_range=(0,1))

scaler2 = MinMaxScaler(feature_range=(0,1))

datafx = scaler1.fit_transform(datafx)

datafy = scaler2.fit_transform(datafy)

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

trainx, trainy = create_dataset(datafx,datafy,timesteps, predict_steps)

trainx = np.array(trainx)

trainy = np.array(trainy)

2 模型训练与预测

2.1 模型训练

首先搭建模型的常规操作,然后使用训练数据trainx和trainy进行训练,进行20个epochs的训练,每个batch包含200个样本。此时input_shape划分数据集时每个x的形状。

model.add(LSTM(128,input_shape=(timesteps,5),return_sequences= True))

model.add(LSTM(128,return_sequences=True))

model.add(LSTM(64,return_sequences=False))

model.compile(loss="mean_squared_error",optimizer="adam")

model.fit(trainx,trainy, epochs= 20, batch_size=200)
2.2 模型多步预测

下面介绍文章中最重要,也是真正没有未来特征的情况下预测未来标签的方法。整体的思路也就是,前面通过前48个数据训练后面的48个未来数据,预测时取出前48个数据预测未来的48个未来数据。这里与单变量预测不同,没有进行滚动预测,因为单变量预测的结果可以作为历史数据进行滚动,这里多变量只产生了预测值,并没有预测标签,不能进行滚动预测,在实际有数据源源不断时可以采用滚动预测。(里面的数据可以根据需求进行更改)

首先提取需要带入模型的数据,也就是预测前的timesteps行特征。

predict_xlist.extend(dataf[dataf.shape[0]-timesteps:dataf.shape[0],0:5].tolist())

predictx = np.array(predict_xlist[-timesteps:])

predictx = np.reshape(predictx,(1,timesteps,5))#变换格式,适应LSTM模型

准备好数据后,接着进行预测,并对预测结果进行反归一化。

lstm_predict = model.predict(predictx)

lstm_predict = scaler2.inverse_transform(lstm_predict)

predict_y.extend(lstm_predict[0])
2.3 结果可视化

计算误差,并保存预测结果,并进行可视化。

y_ture = np.array(data.values[-48:,5])

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)
from itertools import cycle

plt.figure(dpi=100,figsize=(14,5))

plt.plot(y_ture,c=next(cycol),markevery=5)

plt.plot(y_predict,c=next(cycol),markevery=5)

plt.legend(['y_ture','y_predict']) 

最后可视化运行结果,发现预测的效果大致捕捉了趋势,预测值存在一定程度的波动。

答疑&技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

​方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
方式②、添加微信号:dkl88194,备注:来自CSDN + 技术交流

机器学习算法实战案例系列

  • 机器学习算法实战案例:确实可以封神了,时间序列预测算法最全总结!

  • 机器学习算法实战案例:时间序列数据最全的预处理方法总结

  • 机器学习算法实战案例:GRU 实现多变量多步光伏预测

  • 机器学习算法实战案例:LSTM实现单变量滚动风电预测

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

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

相关文章

FFmpeg 入门

1. 编译 参考文档:FFmpeg编译和集成(FFmpeg开发基础知识),重点注意这句话: 在MSYS2 Packages可以查到云仓库有哪些包,直接安装可节约大量时间。 注意:这个路径可自定义 吐槽 在看到这篇文章之前,花了大…

赋值运算符和关系运算符

赋值运算符和关系运算符 赋值运算符 分类 符号作用说明赋值int a 10, 将10赋值给变量a加后赋值a b,将a b的值赋值给a-减后赋值a - b,将a - b的值赋值给a*乘后赋值a * b,将a b的值赋值给a/除后赋值a / b,将a b的…

Java Chassis 3技术解密:注册中心分区隔离

原文链接:Java Chassis 3技术解密:注册中心分区隔离-云社区-华为云 注册中心负责实例的注册和发现,对微服务可靠运行起到举足轻重的作用。实例变更感知周期是注册中心最重要的技术指标之一。感知周期代表提供者的实例注册或者下线后&#xf…

uni书写TP6,环境7.3,随意二开,源码交付。APP小程序H5都有,UI美观

随着数字技术的迅猛发展和教育信息化的推进,智慧校园教务管理系统软件设计开发定制成为教育管理的重要举措。这样的系统可以利用先进的技术手段,提供全面的教务管理功能,提高教育管理的效率和质量。 课程管理:智慧校园教务管理系…

人力资源智能化管理项目(day01:基础架构拆解)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈 一、基础架构拆解 1.拉取模板代码 git clone GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template 项目名 2.core-js…

js 回文串

思路: 判断一个字符串是否为回文字符串的基本思路是比较字符串的正序和倒序是否相同。 两者相同,则该字符串是回文字符串,否则不是。 要实现这一思路,我们可以使用 JavaScript 字符串的一些方法。我是忽略了所有的空格和符号&…

岛屿问题(DFS)

DFS的基本结构 网格结构比二叉树结构稍微复杂一点,它其实是一种简化版的图的结构。要写好网格上的DFS遍历,我们首先要理解二叉树上的DFS遍历方法,再类比写出网格结构上的DFS遍历。我们写的二叉树DFS遍历一般是: public void tra…

我自己总结记忆的23种设计模式

1, 对23种设计模式,大家的第一个印象就是抽象繁琐,记不住!!不常用?? 其实设计模式是非常有用的,大家只要理解设计模式了,思想上就能有质的飞跃! 但是&#…

有哪些好用的视频剪辑工具?这几款剪辑必备

有哪些好用的视频剪辑工具?随着社交媒体的兴起,视频内容已经成为人们获取信息、娱乐和交流的重要方式。对于许多内容创作者来说,选择一款合适的视频剪辑工具是至关重要的。今天,我们就来介绍几款视频剪辑工具,它们各具…

uniapp中,子组件给父页面传值(父组件)

前言 最近在做的一个小程序项目中,有一个身份切换的功能,点击切换按钮时,子组件向父组件传递身份信息,父页面依据这个身份信息对页面进行显示与隐藏。 具体实现 子组件中定义一个点击事件,在这里是identitySwitching()方法 &l…

flink1.15 维表join guava cache和mysql方面优化

优化前 mysql响应慢,导致算子中数据输出追不上输入,导致显示cpu busy:100% 优化后效果两个图对应两个时刻: - - -- 优化前 select l.id,JSON_EXTRACT(r.msg,$$.key1) as msgv (select id,uid from tb1 l where id?) join (select uid,msg from tb2) r on l.uidr.uid;-- 优化…

@Transactional注解导致@DS切换数据源失效

原因 spring 的Transactional声明式事务管理时通过动态代理实现的。 删除事物的注解 增加其他数据库的事务注解 Transactional(rollbackFor Exception.class, propagation Propagation.REQUIRES_NEW)

YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过DiverseBranchBlock(DBB)模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时…

基于apriori关联规则的商品推荐系统

项目背景: 随着电子商务的快速发展,用户在购物平台上面临了海量商品选择的问题。为了帮助用户更好地找到自己感兴趣的商品,提供个性化的推荐服务变得至关重要。基于Apriori关联规则的商品推荐系统可以根据用户的历史购买记录进行分析&#x…

分布式限流要注意的问题

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 为什么需要匀速限流 同学们回想一下在Guava小节里…

如何部署Wagtail CMS并结合cpolar内网穿透实现远程访问管理界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS,建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

电商新趋势:解析养号的必要性及海外云手机运用攻略

在电商领域,什么最为关键?答案无疑是流量!然而,如何以较低成本获取大量流量成为了许多电商从业者头疼的问题。虽然直接投放广告是一种方式,但在内卷的情况下效果越来越难以令人满意,高昂的广告费用也原来越…

编译与链接(C/C++)

在C/C中关于代码的运行需要经过.c文件到.exe文件,而其中走过这些步骤这需要对原始的.c文件进行编译与链接。对于编译与链接主要构成了翻译环境,经过翻译环境之后生成.exe文件,然后在通过运行环境输出对应的结果。本篇主要讲解编译与链接。 以…

动手搓一个kubernetes管理平台(1)-需求和框架

先拍个脑袋 市面上对于kubernetes集群的管理平台其实不算少,但常用的就那么几个,比如厚重的rancher,比如老而弥坚的kube-dashboard,以及集成了很多其他功能的kubeSphere等,但和其他开源项目一样,为了满足大…

火爆!大厂流出的接口版本号规约,速度收藏

在实际项目开发中,API的版本号控制不仅仅是一个数字游戏,它的使用需遵循语义版本控制(Semantic Versioning)原则,确保代码的每一次更改都能通过版本号的变化得到准确的体现,本篇文章对版本号如何使用做了详…