【决策树】预测用户用电量

news2025/2/28 6:45:13

决策树预测用户用电量

文章目录

  • 决策树预测用户用电量
    •   👉引言💎
    • 一、 数据预处理
        • 数据预处理
        • 初步数据分析
    • 二、 机器学习算法
      • 决策树回归预测用电量
        • 决策树模型介绍:
        • 回归预测
    • 三、 可视化结果
    • 四、 数据分析与结论
    • 代码如下

  👉引言💎

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
热爱写作,愿意让自己成为更好的人…


在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

一、 数据预处理

数据预处理

通过pandas的read_csv()方法将表格数据读入到内存中,同时对原始数据进行统计分析,发现有许多缺失数据,首先进行数据预处理。

对原始数据使用pandas库DataFrame类的groupby()以及apply()方法进行分组聚合,以用户为关键点进行分组,可以得到每个用户的各方面用电数据,随后对缺失数据以及对应的用电属性进行统计并可视化,舍弃有效数据少的属性,保留剩余的属性进行进一步分析。

部分属性图分布趋势如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

x轴表示用电属性,y轴表示具备该数据的用户数量,将中点线绘制到图中进行对比分析,从中取出有效用户数据超过用户量一半的属性进行下一步分析

在这里插入图片描述

通过数据处理得到不同属性情况下用户用电数据的有效数量(即多少位用户在具备该属性下的时段数据),同时进行倒序排序,。由此可得前五项(由于leg1v与leg2v的属性意义对用电量预测关系不大,故舍去)

在这里插入图片描述

故选取kitchenapp1,grid, drye1,以及clotheswasher1 对数据较全的用户进行相关分析

初步数据分析

由于数据量比较大,取出一个用户的数据进行相关性分析,首先取出第一个用户,也就是编号为25的用户的用电数据进行回归预测,其用电数据主要是grid以及kitchenapp1,drye1,clotheswasher1 。

数据意义解释:

grid:每个时间段仪表数据目前测量从电网或馈电到电网的功率 。

kitchenapp1:第一厨房小家电电路仪表数据呈现。这种类型的电路只包括厨房里的壁式插座,因此可能包括烤面包机、咖啡机、搅拌机等。

drye1:电动干衣机(240V电路)仪表数据呈现

clotheswasher1:单机洗衣机仪表数据呈现

分别数据可视化为折线图与热力图如下:

在这里插入图片描述
在这里插入图片描述

由上图相关性分析可得,drye1 的影响比其他因素更大

二、 机器学习算法

决策树回归预测用电量

决策树模型介绍:

决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法。决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树型的分类模型。树中的每个非叶子节点记录了使用哪个特征来进行类别的判断,每个叶子节点则代表了最后判断的类别。根节点到每个叶子节点均形成一条分类的路径规则。而对新的样本进行测试时,只需要从根节点开始,在每个分支节点进行测试,沿着相应的分支递归地进入子树再测试,一直到达叶子节点,该叶子节点所代表的类别即是当前测试样本的预测类别。

机器学习中,决策树是一个预测模型。它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分支叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。从数据产生决策树的机器学习技术叫做决策树学习,通俗说就是决策树。

回归预测

接下里通过构建决策树回归模型预测用户的时段用电量,这里使用python的sklearn机器学习库进行相关的分析

sklearn是机器学习中一个常用的python第三方模块,里面对一些常用的机器学习方法进行了封装,比如SVM、KNN、贝叶斯、线性回归、逻辑回归、决策树、随机森林、xgboost、GBDT、boosting、神经网络NN;statsmodels 用于拟合多种统计模型,比如方差分析、ARIMA、线性回归等,执行统计测试以及数据探索和可视化。

在本次模型构建过程中主要使用的相关的库版本为:

python版本为3.9

numpy版本为 1.23.4

matplotlib版本为3.5.3

pandas版本为 1.5.1

sklearn版本为:0.0

运用sklearn.model_selection的train_test_split进行数据集划分,也可以用k折交叉验证(KFold)
在使用sklearn对数据集进行划分后,得到训练集与测试集,自变量即grid列的数据,表示用户在不同时间段的用电量,同时将其他三个变量设置为自变量,得到训练集与测试集的统计描述

在这里插入图片描述

进行初步的训练与评估后得到特征重要性,并可视化如下所示

在这里插入图片描述

三、 可视化结果

可视化结果及相关分析在上文

四、 数据分析与结论

通过决策树回归得到, 电动干衣机(240V电路)的使用对Y时段用户用电量影响最大,其重要性系数为0.6396,远高于其他因素,与相关系数分析结果一致

随后分别以训练集以及验证集展开对决策树模型的评估

在这里插入图片描述

发现评估效果良好

决策树回归模型构建过程图:

在这里插入图片描述

代码如下

import warnings

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
warnings.filterwarnings('ignore')

plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'



data = pd.read_csv('15minute_data_newyork.csv')
data[data.columns[1]] = data[data.columns[1]].apply(lambda x: x[5:-6])

#数据预分析
User = data.groupby(data.columns[0]).count()
# 用户数量及编号列表
name = User.index
namef = len(list(name))//2
sum = len(User.index)
filed = User.apply(lambda x: x != 0).apply(np.sum, axis=0)

filed.plot( style=['r'])
plt.plot(filed.index,[namef]*len(filed.index),'b')
plt.show(block=True)

# User=User.loc[:,(filed>namef//2).values]
# User.apply(lambda x: x != 0).apply(np.sum, axis=0).sort_values(ascending=False)

nowData=data[['dataid','local_15min','grid','kitchenapp1','drye1','clotheswasher1']].dropna(how='any').set_index('dataid')

#得到一个用户的三方面用电数据
User=nowData.groupby(['dataid'])
userSiggle=list(User)[0][1]
User.apply(lambda x: x != 0).apply(np.sum, axis=0).sort_values(ascending=False)
userSiggle.apply(lambda x: x != 0).apply(np.sum, axis=0).sort_values(ascending=False)
userSiggle.set_index(userSiggle.columns[0],inplace=True)
userSiggle.plot()
plt.show(block=True)

userScorr=userSiggle.corr()
f,fig = plt.subplots(nrows=1,ncols=1,figsize=(12,9))
sns.heatmap(userScorr,cmap='rainbow',annot=True, vmax=1 , square=True , fmt='.2g')
label_y = fig.get_yticklabels()
plt.setp(label_y , rotation = 360)
plt.show(block=True)


# userSiggle.to_csv("userSiggle.csv")
from sklearn.model_selection import train_test_split
house_train,house_test=train_test_split(userSiggle,test_size=0.3, random_state=0)
print ('训练集描述性统计:')
print (house_train.describe().round(2))
print ('验证集描述性统计:')
print (house_test.describe().round(2))


X_train=house_train.loc[:,userSiggle.columns[1:]]
y_train=house_train.loc[:,userSiggle.columns[0]]

X_test=house_test.loc[:,userSiggle.columns[1:]]
y_test=house_test.loc[:,userSiggle.columns[0]]



##决策树模型训练、评估
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import export_graphviz
#tree = DecisionTreeRegressor(criterion='mse' ,max_depth=4,max_features='sqrt',min_samples_split=2,min_samples_leaf=1,random_state=0).fit(X_train,y_train)
tree = DecisionTreeRegressor(criterion='mse' ,max_depth=None,max_features='sqrt',min_samples_split=2,min_samples_leaf=1,random_state=0).fit(X_train,y_train)
y_tree=tree.predict(X_train)

export_graphviz(tree, out_file = 'house_tree.dot',max_depth=None,feature_names = userSiggle.columns[1:],rounded = True, precision = 1)


##特征重要性
print(userSiggle.columns[1:])
print ("指标重要性:",tree.feature_importances_)
plt.barh(range(len(tree.feature_importances_)), tree.feature_importances_, color='b',tick_label = userSiggle.columns[1:])
list(map(lambda x:plt.text( x[1]+0.02,x[0], x[1]),enumerate(tree.feature_importances_)))
plt.show(block=True)

from sklearn.metrics import mean_squared_error,explained_variance_score,mean_absolute_error,r2_score
print ("决策树模型评估--训练集:")
print ('训练r^2:',tree.score(X_train,y_train))
print ('均方差',mean_squared_error(y_train,tree.predict(X_train)))
print ('绝对差',mean_absolute_error(y_train,tree.predict(X_train)))
print ('解释度',explained_variance_score(y_train,tree.predict(X_train)))

print ("决策树模型评估--验证集:")
print ('验证r^2:',tree.score(X_test,y_test))
print ('均方差',mean_squared_error(y_test,tree.predict(X_test)))
print ('绝对差',mean_absolute_error(y_test,tree.predict(X_test)))
print ('解释度',explained_variance_score(y_test,tree.predict(X_test)))


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

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

相关文章

日期问题---算法精讲

前言 今天讲讲日期问题,所谓日期问题,在蓝桥杯中出现众多,但是解法比较固定。 一般有判断日期合法性,判断是否闰年,判断日期的特殊形式(回文或abababab型等) 目录 例题 题2 题三 总结 …

docker 子网

当需要给容器分配指定 ip ,为避免ip 冲突,指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…

跑马灯样式

这里的公告是要做成&#xff0c;跑马灯的样式&#xff0c;文字是会移动并且隐藏掉的。 HTML&#xff1a; <div class"notice"><div class"yrr"><img src"./img/ia_100000018.png" alt"" /></div><div …

(关键点检测)YOLOv8实现多类人体姿态估计的输出格式分析

&#xff08;关键点检测&#xff09;YOLOv8实现多类人体姿态估计的输出格式分析 任务分析 所使用的数据配置文件 网络结构 导出模型 用 netron 可视化 输出格式分析 参考链接 1. 任务分析 判断人体关键点时一并给出关键点所属的类别&#xff0c;比如男人&#xff0c;女…

使用Tokeniser估算GPT和LLM服务的查询成本

将LLM集成到项目所花费的成本主要是我们通过API获取LLM返回结果的成本&#xff0c;而这些成本通常是根据处理的令牌数量计算的。我们如何预估我们的令牌数量呢&#xff1f;Tokeniser包可以有效地计算文本输入中的令牌来估算这些成本。本文将介绍如何使用Tokeniser有效地预测和管…

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

golang实现正向代理和反向代理

文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

LCR 131. 砍竹子 I

解题思路&#xff1a;&#xff08;与砍竹子II的区别是&#xff0c;这里的竹子长度数量级较小&#xff09; 数学推导或贪心 切分规则&#xff1a; 等长&#xff0c;且尽量为3 b0时&#xff0c;pow(3,a) b1时&#xff0c;pow(3,a-1)*4 少一段3&#xff0c;并入b生成一…

T2 小美的平衡矩阵(25分) - 美团编程题 题解

考试平台&#xff1a; 牛客网 题目类型&#xff1a; 30道单选题&#xff08;60分&#xff09; 2 道编程题 &#xff08;15分 25分&#xff09; 考试时间&#xff1a; 2024-03-09 &#xff08;两小时&#xff09; 题目描述 小美拿到了一个n*n的矩阵&#xff0c;其中每个元素是…

HTML 学习笔记(五)超链接

HYperText 超文是用超链接的方式&#xff0c;将不同空间的文字信息组合在一起的网状文其就像一个桥梁&#xff0c;建立了不同页面中的联系&#xff0c;实现了访问不同网站中页面的功能 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

HarmonyOS NEXT应用开发之MpChart图表实现案例

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

Linux多线程之初识多线程

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、线程概念 1.vm_area_struct 2.页帧与页…

在Blender中清理由Instant-NGP等几何学习技术生成的网格

使用布尔运算: 创建一个大的立方体或其他简单几何体包裹住全部网格。使用布尔修改器对两个网格进行“差集”运算。这将移除超出包裹体之外的多余网格部分。 手动选择并删除: 进入编辑模式&#xff08;按Tab键&#xff09;。按A键取消选择所有顶点。按B键并拖动以选择您想要删除…

❤ Vue3项目搭建系统篇(二)

❤ Vue3项目搭建系统篇&#xff08;二&#xff09; 1、安装和配置 Element Plus&#xff08;完整导入&#xff09; yarn add element-plus --savemain.ts中引入&#xff1a; // 引入组件 import ElementPlus from element-plus import element-plus/dist/index.css const ap…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁&#xff1a;共享锁&#xff08;读&#xff09;、排他锁&#xff08;写&#xff09;、表锁、行锁、意向锁、间隙锁 共享锁&#xff08;读锁&#xff09;、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制&#xff0c;它们确保数据的一致性…

系统安全保证措施-word

【系统安全保证措施-各支撑材料直接套用】 一、 身份鉴别 二、 访问控制 三、 通信完整性、保密性 四、 抗抵赖 五、 数据完整性 六、 数据保密性 七、 应用安全支撑系统设计 软件全套资料下载进主页。

JAVA后端开发面试基础知识(八)——Spring

Spring 1. 什么是 Spring 框架 Spring是一个轻量级Java开发框架 我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发&#xff0c;比如说 Spring 支持 IoC&#xff08;Inverse of Control:控…