二十八、电力窃漏电案例模型构建
1. 综合案例模型构建
- 构建窃漏电用户识别模型;
- 构建LM神经网络模型;
- 构建CART决策树模型;
- 模型评价
2. 构建窃漏电用户识别模型
2.1 构建专家样本
专家样本准备完成后,需要划分测试样本和训练样本,随机选取20%作为测试样本,剩下的作为训练样本。
2.3 资源
数据集
专家样本数据集的内容包括时间、用户编号、电量趋势下降指标、线损指标、告警类指标和是否窃漏电标签,数据集共有291条样本数据。
数据集详情参考model.xls
工具库
pandas==0.24.2
2.4 步骤
- 导入数据分析库pandas
- 导入随机函数shuffle,用于打乱顺序
- 设置训练数据比例,划分数据
2.5 代码
数据划分实现代码
import pandas as pd #导入数据分析库
from random import shuffle #导入随机函数shuffle,用来打算数据datafile = '../data/model.xls' #数据名
data = pd.read_excel(datafile) #读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix() #将表格转换为矩阵
shuffle(data) #随机打乱数据p = 0.8 #设置训练数据比例
train = data[:int(len(data)*p),:] #前80%为训练集
test = data[int(len(data)*p):,:] #后20%为测试集
3. 构建LM神经网络
3.1 模型搭建
使用Keras库建立神经网络模型。设定LM神经网络有三层模型,输入层为3个节点,隐藏层为10个结点,输出层为1个结点,使用Adam方法求解。
LM神经网络的混淆矩阵
- 通过混淆矩阵可得,模型的分类准确率为(161+58)/(161+58+6+7)=94.4%,正常用户被误判为漏电用户占正常用户对7/(161+7)=4.2%,窃漏电用户被误判为正常用户占窃漏电用户的6/(6+58)=9.4%。
3.2 资源
资源库
pandas==0.24.2
scipy==1.1.0
keras=2.2.0
Tensorflow=1.10
数据集
数据集详情参考model.xls
3.3 步骤
- 导入神经网络初始化函数
- 导入神经网络层函数,激活函数
- 构建模型存储路径
- 建立神经网络
- 编译模型,使用adam方法求解
- 保存模型
- 显示混淆矩阵及可视化结果
3.4 代码
LM神经网络实现代码
#构建LM神经网络模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数netfile = '../tmp/net.model' #构建的神经网络模型存储路径net = Sequential() #建立神经网络
net.add(Dense(input_dim = 3, output_dim = 10)) #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu')) #隐藏层使用relu激活函数
net.add(Dense(input_dim = 10, output_dim = 1)) #添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = "binary") #编译模型,使用adam方法求解net.fit(train[:,:3], train[:,3], nb_epoch=1000, batch_size=1) #训练模型,循环1000次
net.save_weights(netfile) #保存模型predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形
4 构建CART决策树模型
4.1 使用sklearn机器学习库构建决策树模型
通过scikit-learn利用训练样本构建CART决策树模型,得到的混淆矩阵如下图所示,分类准确率为(160+56)/(160+56+3+13)=93.1%,正常用户被误判为窃漏电用户占正常用户的 13/(13+160)=7.5%,窃漏电用户被误判为正常用户占窃漏电用户的3/(3+56)=5.1%。
4. 2代码
决策树构建窃漏电用户识别代码
#构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
treefile = '../tmp/tree.pkl' #模型输出名字
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:,:3], train[:,3]) #训练#保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3], tree.predict(train[:,:3])).show() #显示混淆矩阵可视化结果
#注意到Scikit-Learn使用predict方法直接给出预测结果。
5 综合案例模型评价
5.1 使用测试数据
对于训练样本,LM神经网络和CART决策树的分类准确相差不大,分别为94%和93%,为了进一步评估模型分类的性能,故利用测试样本对两个模型进行评价,采用ROC曲线评价方法进行评估。
6 完成代码
6.1 Cart决策树模型
#-*- coding: utf-8 -*-
#构建并测试CART决策树模型import pandas as pd #导入数据分析库
from random import shuffle #导入随机函数shuffle,用来打算数据datafile = '../data/model.xls' #数据名
data = pd.read_excel(datafile) #读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix() #将表格转换为矩阵
shuffle(data) #随机打乱数据p = 0.8 #设置训练数据比例
train = data[:int(len(data)*p),:] #前80%为训练集
test = data[int(len(data)*p):,:] #后20%为测试集#构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier #导入决策树模型treefile = '../tmp/tree.pkl' #模型输出名字
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:,:3], train[:,3]) #训练#保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3], tree.predict(train[:,:3])).show() #显示混淆矩阵可视化结果
#注意到Scikit-Learn使用predict方法直接给出预测结果。from sklearn.metrics import roc_curve #导入ROC曲线函数fpr, tpr, thresholds = roc_curve(test[:,3], tree.predict_proba(test[:,:3])[:,1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of CART', color = 'green') #作出ROC曲线
plt.xlabel('False Positive Rate') #坐标轴标签
plt.ylabel('True Positive Rate') #坐标轴标签
plt.ylim(0,1.05) #边界范围
plt.xlim(0,1.05) #边界范围
plt.legend(loc=4) #图例
plt.show() #显示作图结果
6.2 LM神经网络模型
#-*- coding: utf-8 -*-import pandas as pd
from random import shuffledatafile = '../data/model.xls'
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)p = 0.8 #设置训练数据比例
train = data[:int(len(data)*p),:]
test = data[int(len(data)*p):,:]#构建LM神经网络模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数netfile = '../tmp/net.model' #构建的神经网络模型存储路径net = Sequential() #建立神经网络
net.add(Dense(input_dim = 3, output_dim = 10)) #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu')) #隐藏层使用relu激活函数
net.add(Dense(input_dim = 10, output_dim = 1)) #添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = "binary") #编译模型,使用adam方法求解net.fit(train[:,:3], train[:,3], nb_epoch=1000, batch_size=1) #训练模型,循环1000次
net.save_weights(netfile) #保存模型predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形
'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3], predict_result).show() #显示混淆矩阵可视化结果from sklearn.metrics import roc_curve #导入ROC曲线函数predict_result = net.predict(test[:,:3]).reshape(len(test))
fpr, tpr, thresholds = roc_curve(test[:,3], predict_result, pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of LM') #作出ROC曲线
plt.xlabel('False Positive Rate') #坐标轴标签
plt.ylabel('True Positive Rate') #坐标轴标签
plt.ylim(0,1.05) #边界范围
plt.xlim(0,1.05) #边界范围
plt.legend(loc=4) #图例
plt.show() #显示作图结果
6.3 混淆矩阵代码
def cm_plot(y, yp):from sklearn.metrics import confusion_matrix #导入混淆矩阵函数cm = confusion_matrix(y, yp) #混淆矩阵import matplotlib.pyplot as plt #导入作图库plt.matshow(cm, cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。plt.colorbar() #颜色标签for x in range(len(cm)): #数据标签for y in range(len(cm)):plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')plt.ylabel('True label') #坐标轴标签plt.xlabel('Predicted label') #坐标轴标签return pltfor x in range(len(cm)): #数据标签for y in range(len(cm)):plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')plt.ylabel('True label') #坐标轴标签plt.xlabel('Predicted label') #坐标轴标签return plt
二十八、电力窃漏电案例模型构建相关推荐
- 2021年大数据Spark(二十八):SparkSQL案例三电影评分数据分析
目录 案例三:电影评分数据分析 代码实现 Shuffle分区数 案例三:电影评分数据分析 使用电影评分数据进行数据分析,分别使用DSL编程和SQL编程,熟悉数据处理函数及SQL使用,业务需求说明: 对 ...
- 大数据Spark(二十八):SparkSQL案例三电影评分数据分析
文章目录 案例三:电影评分数据分析 代码实现 Shuffle分区数 案例三:电影评分数据分析 使用电影评分数据进行数据分析,分别使用DSL编程和SQL编程
- 二十六、数据挖掘电力窃漏电用户自动识别
电力窃漏电用户自动识别 1. 综合案例数据预处理 电力窃漏电用户自动识别的内容 背景与挖掘目标 分析方法与过程 数据探索性分析 综合案例的目标 通过综合案例分析了解数据挖掘的整体流 掌握使用sklea ...
- rstudio拉格朗日插值法_电力窃漏电用户识别案例
一.案例综述 案例编号:102003 案例名称:电力.热力.燃气及水生产和供应业--电力窃漏电用户识别 作者姓名(或单位.或来源):朱江 案例所属行业:D442 电力供应 案例所用软件:R 案例包含知 ...
- 【零基础学Java】—笔记本USB接口案例(二十八)
[零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...
- 收藏:电力窃漏电用户自动识别,可视化全流程这样操作~
过去,大多数的防窃漏电方法主要是通过利用定期的检查.电表校验以及用户自主报告偷盗等手段,去发掘窃电或测量装置故障.不过上述方法的一个弊端是,对人的依赖性太强,且抓窃查漏的目标不甚明确. 目前,许多供电 ...
- 数据挖掘I 电力窃漏电用户自动识别
一.项目背景 传统的防漏电窃电方法主要通过定期巡检.定期校验电表.用户举报窃电等方法来发现窃电或者计量装置故障,对人的依赖性比较强,抓窃查漏的目标不明确. 供电局相关人员利用相关数据构建的基于指标加权 ...
- 电力窃漏电用户自动识别的实验报告
电力窃漏电用户自动识别实验报告 提示 参考书:张良均<Python数据分析与挖掘实战>等. 数据文件:课本自带数据. 使用软件:Pycharm. 类别:实验. 关键字:拉格朗日插值法.CA ...
- 数据挖掘实战:电力窃漏电用户自动识别
案例来自<python数据分析与挖掘实战> 背景 需求:防用户窃漏电 传统方法:定期巡检.定期校验电表.用户举报窃电.计量装置故障 缺陷:对人的依赖性太强,抓窃查漏的目标不明确. 当前方法 ...
最新文章
- OpenStack平台功能性测试工具Tempest安装
- 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
- 使用 Java 配置进行 Spring bean 管理--转
- 《F4+2团队项目系统设计改进》
- 93后阿里P7晒出工资单:原来是狠补了这个~真香
- python24.dll_2_48_python24.dll
- 25利他行为可以学习和模仿吗
- 昨天的一个披扣的问题处理到很晚没搞定的原因
- 技术实践丨列存表并发更新时的锁等待问题原理
- [深度学习]Python/Theano实现逻辑回归网络的代码分析
- 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
- IDEA下Maven多模块项目介绍和搭建
- elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
- 系统性能调优的各个方面
- 计算机系统组成导学案,单元一任务2认识计算机系统的组成导学案.pdf
- Android Github开源项目大集会 真的什么都有啊
- 数据挖掘和数据仓库之间的区别
- 最最简单的几个Mac终端命令
- DDS(Direct Digital Synthesizer)数字频率合成器
- VCC和GND短路,怎么找问题?
热门文章
- html 图片点击查看大图_【神游千年,大美敦煌】北魏-260窟【高清大图】
- Git新建临时分支进行开发后合并至master
- 根据数据库表字段删除所有相关信息(删库)
- string修饰的梦修改吗_Java String 对象,你真的了解了吗?
- 命令行切换到conda环境_Anaconda命令行常用操作
- 编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)
- c# 定位内存快速增长_CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)...
- 基于netty访问WebSocket(java的websocket客户端)(访问远程ws协议)
- python的主要功能_Python的主要功能是什么?
- python3 yield 大文件_详解Python3中yield生成器的用法