【Python】神经网络回归预测模型,Python代码实现

场景描述:基于物联网检测设备,大量采集流量数据和液位高度数据存储在时序数据库(influxdb)中。并采用下面代码对数据进行预测

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author:李智敏
# Wechat:anark919
# Date:2024-01-05 10:17
# Title:
import os.path
import uuidimport pandas as pdclass Neural_networks():def __init__(self,para_fields:list,outcome_fields:list,model_dir:str,model_name:str=uuid.uuid4().hex):''':param para_fields: 自变量:param outcome_fields: 因变量:param model_dir: 模型存储地址:param model_name: 模型名称,不传,以uuid生成唯一识别名称'''self.para_fields=para_fieldsself.outcome_fields=outcome_fieldsself.model_name = model_nameself.model_dir = os.path.join(model_dir,model_name)if not os.path.exists(self.model_dir ):os.makedirs(self.model_dir )def training(self,data:pd.DataFrame,epochs=50000):'''模型训练'''import pandas as pdimport matplotlib.pyplot as pltfrom sklearn.preprocessing import MinMaxScalerfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.optimizers import Adamfrom keras import regularizers# 加载数据df = datarain_dir = os.path.join(self.model_dir ,f"train_{self.model_name}.csv")df.to_csv(rain_dir, index=False)x = df[self.para_fields].valuesy = df[self.outcome_fields].values# 数据归一化x_scaler = MinMaxScaler(feature_range=(-1, 1))y_scaler = MinMaxScaler(feature_range=(-1, 1))x = x_scaler.fit_transform(x)y = y_scaler.fit_transform(y)# 定义神经网络模型model = Sequential()# model.add(Dense(10, activation='relu', input_shape=(3,), kernel_regularizer=regularizers.l2(0.01)))model.add(Dense(10, activation='relu', input_shape=(len(self.para_fields),), kernel_regularizer=regularizers.l2(0.01)))model.add(Dense(16, activation='relu', kernel_regularizer=regularizers.l2(0.01)))model.add(Dense(1, activation='linear'))# 误差记录optimizer = Adam(lr=0.0001)model.compile(optimizer=optimizer, loss='mse')# 训练模型history = model.fit(x, y, epochs=epochs, batch_size=67)# 评估模型mse = model.evaluate(x, y)print('Validation MSE:', mse)# 保存模型的权重和偏差model_dir = os.path.join(self.model_dir ,f"{self.model_name}.h5")model.save(model_dir)# 误差曲线# 设置中文显示和解决负号显示问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.plot(history.history['loss'])plt.title("模型误差")plt.ylabel("误差")plt.xlabel("循环次数")img_dir = os.path.join(self.model_dir ,f"误差曲线_{self.model_name}.png")plt.savefig(img_dir)plt.show()# 预测值输出y_pred = model.predict(x)# 预测值反归一化y = y_scaler.inverse_transform(y)y_pred = y_scaler.inverse_transform(y_pred)print("the prediction is:", y_pred)# 将预测值存储到Excel表中df_out = pd.DataFrame(y_pred, columns=self.outcome_fields)Prediction_dir = os.path.join(self.model_dir ,f"prediction_train_{self.model_name}.xlsx")df_out.to_excel(Prediction_dir, index=False)# 实际值与预测值的对比图# 设置中文显示和解决负号显示问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.scatter(y, y_pred)plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)plt.xlabel("实际值")plt.ylabel("预测值")img_dir = os.path.join(self.model_dir ,f"对比图_{self.model_name}.png")plt.savefig(img_dir)plt.show()return Truedef forecast(self,data:pd.DataFrame):'''模型预测'''import pandas as pdfrom sklearn.preprocessing import MinMaxScalerfrom keras.models import load_model# 数据预处理(归一化)rain_dir = os.path.join(self.model_dir ,f"train_{self.model_name}.csv")df = pd.read_csv(rain_dir)x = df[self.para_fields].valuesy = df[self.outcome_fields].valuesx_scaler = MinMaxScaler(feature_range=(-1, 1))y_scaler = MinMaxScaler(feature_range=(-1, 1))x = x_scaler.fit_transform(x)y = y_scaler.fit_transform(y)# 加载预测数据df_test = datax_test = df_test[self.para_fields].values# 预测数据归一化x_test = x_scaler.transform(x_test)# 加载训练好的神经网络模型# 中文路径会报编码错误model_dir = os.path.join(self.model_dir ,f"{self.model_name}.h5")model = load_model(model_dir)# 对预测数据进行预测y_pred = model.predict(x_test)y_pred = y_scaler.inverse_transform(y_pred)# print(y_pred)# 将预测值存储到Excel表中df_out = pd.DataFrame(y_pred, columns=self.outcome_fields)df_out = pd.merge(df_test,df_out,how='outer',left_index=True,right_index=True)Prediction_dir = os.path.join(self.model_dir ,f"prediction_{self.model_name}.xlsx")df_out.to_excel(Prediction_dir, index=False)return df_out.T.to_dict().values()if __name__ == '__main__':# df = pd.read_csv('train.csv')from 数据库操作 import influxdb_querydata1 = influxdb_query('SELECT para505 FROM "device_YL_315103022220A6D3_1" limit 300')data = influxdb_query('SELECT para168 FROM "device_LD_716001012220A5E8_1" limit 300')# print(data[0]['time'])# print(data1)df = pd.DataFrame([{'time':k['time'],'para505':k['para505'],'para168':v['para168']} for k,v in zip(data1[:100],data[:100])])df1 = pd.DataFrame([{'time':k['time'],'para505':k['para505']} for k,v in zip(data1[100:],data[100:])])# print(df,df1)# # df1 = pd.read_csv('test.csv')os.chdir('D://')# n = Neural_networks(['x1', 'x2', 'x3'],['y'],model_dir='.',model_name='f39e6103681244a5a092ef9e2759b61c')n = Neural_networks(['para505'],['para168'],model_dir='.',model_name='f39e6103681244a5a092ef9e2759b61c')# print(n.training(df,epochs=5000))print(n.forecast(df1))

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

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

相关文章

【C语言】16.动态内存管理

文章目录 1.为什么要有动态内存分配2.malloc和free2.1 malloc2.2 free 3.calloc和realloc3.1 calloc3.2 realloc 4.常见的动态内存的错误4.1 对NULL指针的解引⽤操作4.2 对动态开辟空间的越界访问4.3 对⾮动态开辟内存使⽤free释放4.4 使⽤free释放⼀块动态开辟内存的⼀部分4.5…

Golang - 连接MySQL执行查询脚本

脚本如下,简单易用: package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm" )type BaseID struct {ID int64 gorm:"primaryKey" json:"id" }type Tasks struct {BaseIDUUID string…

初识 GPT-4 和 ChatGPT

文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界:在这个世界里,你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验?你可以创造出什么样的应用程序?这正是…

【PS】提取手写签名

准备工具: 纸张:用于承载签名; 笔:用于签名; 手机:用于拍摄签名; Adobe Photoshop 版本: 12.0.3 (12.0.3x20101211 [20101211.r.1222 2010/12/11:02:00:00 cutoff; r branch]) x32:用…

亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗?

亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗? 今天亚足联官方宣布了世预赛18强赛分组抽签仪式时间,本次抽签仪式将于6月27日15点在马来西亚吉隆坡举行。除了抽签时间之外,足联还…

IMU用于飞行坐姿校正

为了提升长途飞行的舒适度并预防乘客因不良坐姿导致的身体不适,来自荷兰上海两所大学的研究团队携手开发出一种创新的“舒适穿戴”设备,专为识别飞行中的坐姿设计。 研究团队制作了两种原型设备:一种追求极致舒适,另一种为紧身设…

FFmpeg源码:AV_RB32宏定义分析

一、AV_RB32宏定义的作用 AV_RB32是FFmpeg源码中经常出现的一个宏,其定义如下: #ifndef AV_RB32 # define AV_RB32(p) AV_RB(32, p) #endif 该宏定义有多层。把它简化为函数,其函数声明可以等价于: uint32_t AV_RB32(uint…

windows下 nodejs升级版本

使用n升级node,需要安装git或安装linux支撑组件,后来在网上找资料 直接下载node.exe覆盖原文件即可。 升级步骤如下: 1.查看当前node版本 node -v 2.下载相应版本的nodejs,网址是nodejs下载,找个你想要的版本下载node.exe 3.找到你node的安装…

在C#中对 JSON进行序列化和反序列化处理

概述:在现代软件开发领域,不同系统和平台之间的数据交换是不可或缺的方面。JSON(JavaScript 对象表示法)因其轻量级、人类可读和易于解析的特性而成为一种无处不在的数据格式。使用 C# 🚀编程的 JSON 序列化和反序列化…

Scala学习笔记14: 模式匹配和样式类

目录 第十四章 模式匹配和样式类1- 模式匹配2- 模式中的变量3- 类型模式4- 匹配数组、列表和元组等集合5- 样例类6- 守卫7- 提取器8- 变量声明中的模式9- for推导式中的模式end 第十四章 模式匹配和样式类 在Scala中, 模式匹配和样例类是强大的功能, 用于处理复杂的数据结构和…

虚拟现实(VR)游戏与增强现实(AR)游戏的区别

随着科技的飞速发展,沉浸式游戏体验已经成为现代娱乐的重要组成部分。虚拟现实(VR)游戏和增强现实(AR)游戏是这类体验中的两大主流,但它们在技术实现、用户体验和应用场景上有显著的区别。本文将详细探讨VR…

Java 从 6 到 21 的重要变动回顾

Java 从 6 到 21 的重要变动回顾 Java 自从发布以来,一直是全球最受欢迎的编程语言之一。其不断发展的特性和功能,使得它在各种应用程序中得以广泛应用。从 Java 6 到 Java 21,Java 语言和平台经历了许多重要的变动。本文将深入探讨这些变动…

可信启动Trusted Board Boot

TBB Trusted Board Boot(TBB)对所有固件镜像(包括普通世界的bootloader)进行身份验证,以防止恶意固件在平台上运行。TBB使用公钥加密标准 (PKCS)来建立信任链(Chain of Trust&#…

EtherCAT扫盲,都是知识点

1. 什么是EtherCAT EtherCAT,全称Ethernet for Control Automation Technology,字面意思就是用于控制自动化技术的以太网。它是一种基于以太网的实时工业通信协议,简单说,就是让机器们通过网线互相聊天的高级方式。 EtherCAT 是最…

项目训练营第三天

项目训练营第三天 注册登录测试 前面我们编写了用户注册、登录的逻辑代码,每编写完一个功能模块之后,我们都要对该模块进行单元测试,来确保该功能模块的正确性。一般情况下使用快捷键Ctrl Shift Insert,鼠标左击类名可以自动生…

全新的会声会影2024最新官方免费永久破解版本下载

大家好!🌟 今天要跟大家分享一个超级棒的视频编辑软件,它就是全新的会声会影2024最新永久破解版本。作为视频创作爱好者的我,真的被这款软件的强大功能和便利性彻底征服了!🎉🎉🎬 【…

Aidlux 1.4 部署Nextcloud 2024.6实录 没成功

Aidux阉割版Debain10,坑很多,比如找不到实际的系统日志,有知道的大神吗? 1 Apache2安装 # 测试Apache2 sudo apt update && sudo apt upgrade sudo apt install apache2 -y80端口疑似被禁止只能换端口 rootlocalhost:/…

网络爬虫requests库使用指南

目录 引言 安装requests库 基本用法 发送GET请求 发送POST请求 处理请求头和Cookies 设置请求头 使用Cookies 会话管理 异常处理 流式上传和下载 结语 引言 在Python中进行HTTP请求时,requests库是一个强大且易于使用的第三方库。它允许你发送各种HTTP请…

Java中如何处理异常?

在Java中处理异常是确保软件健壮性和提高代码质量的重要手段。以下是Java异常处理的一些关键点和最佳实践: 1:理解异常类型: Java中的异常分为检查异常( checked exceptions)和非检查异常(un-checked exc…

RK3568技术笔记十六 QT5开发

背景知识 在阅读本章前,如果对下面所列举的知识点有一定的了解,将有助于更好的理解本章内容。 C基础知识,了解简单的类,继承,重载等面向对象概念;Linux基础知识,了解基本的Shell命令&#xff…