1. 综合案例模型构建

  • 构建窃漏电用户识别模型;
  • 构建LM神经网络模型;
  • 构建CART决策树模型;
  • 模型评价

2. 构建窃漏电用户识别模型

2.1 构建专家样本

专家样本准备完成后,需要划分测试样本和训练样本,随机选取20%作为测试样本,剩下的作为训练样本。

2.3 资源

数据集

  • 专家样本数据集的内容包括时间、用户编号、电量趋势下降指标、线损指标、告警类指标和是否窃漏电标签,数据集共有291条样本数据。

    数据集详情参考model.xls

工具库

pandas==0.24.2

2.4 步骤

  1. 导入数据分析库pandas
  2. 导入随机函数shuffle,用于打乱顺序
  3. 设置训练数据比例,划分数据

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 步骤

  1. 导入神经网络初始化函数
  2. 导入神经网络层函数,激活函数
  3. 构建模型存储路径
  4. 建立神经网络
  5. 编译模型,使用adam方法求解
  6. 保存模型
  7. 显示混淆矩阵及可视化结果

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

二十八、电力窃漏电案例模型构建相关推荐

  1. 2021年大数据Spark(二十八):SparkSQL案例三电影评分数据分析

    目录 案例三:电影评分数据分析 代码实现 Shuffle分区数 案例三:电影评分数据分析 使用电影评分数据进行数据分析,分别使用DSL编程和SQL编程,熟悉数据处理函数及SQL使用,业务需求说明: 对 ...

  2. 大数据Spark(二十八):SparkSQL案例三电影评分数据分析

    文章目录 案例三:电影评分数据分析 代码实现 Shuffle分区数 案例三:电影评分数据分析 使用电影评分数据进行数据分析,分别使用DSL编程和SQL编程

  3. 二十六、数据挖掘电力窃漏电用户自动识别

    电力窃漏电用户自动识别 1. 综合案例数据预处理 电力窃漏电用户自动识别的内容 背景与挖掘目标 分析方法与过程 数据探索性分析 综合案例的目标 通过综合案例分析了解数据挖掘的整体流 掌握使用sklea ...

  4. rstudio拉格朗日插值法_电力窃漏电用户识别案例

    一.案例综述 案例编号:102003 案例名称:电力.热力.燃气及水生产和供应业--电力窃漏电用户识别 作者姓名(或单位.或来源):朱江 案例所属行业:D442 电力供应 案例所用软件:R 案例包含知 ...

  5. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

  6. 收藏:电力窃漏电用户自动识别,可视化全流程这样操作~

    过去,大多数的防窃漏电方法主要是通过利用定期的检查.电表校验以及用户自主报告偷盗等手段,去发掘窃电或测量装置故障.不过上述方法的一个弊端是,对人的依赖性太强,且抓窃查漏的目标不甚明确. 目前,许多供电 ...

  7. 数据挖掘I 电力窃漏电用户自动识别

    一.项目背景 传统的防漏电窃电方法主要通过定期巡检.定期校验电表.用户举报窃电等方法来发现窃电或者计量装置故障,对人的依赖性比较强,抓窃查漏的目标不明确. 供电局相关人员利用相关数据构建的基于指标加权 ...

  8. 电力窃漏电用户自动识别的实验报告

    电力窃漏电用户自动识别实验报告 提示 参考书:张良均<Python数据分析与挖掘实战>等. 数据文件:课本自带数据. 使用软件:Pycharm. 类别:实验. 关键字:拉格朗日插值法.CA ...

  9. 数据挖掘实战:电力窃漏电用户自动识别

    案例来自<python数据分析与挖掘实战> 背景 需求:防用户窃漏电 传统方法:定期巡检.定期校验电表.用户举报窃电.计量装置故障 缺陷:对人的依赖性太强,抓窃查漏的目标不明确. 当前方法 ...

最新文章

  1. OpenStack平台功能性测试工具Tempest安装
  2. 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
  3. 使用 Java 配置进行 Spring bean 管理--转
  4. 《F4+2团队项目系统设计改进》
  5. 93后阿里P7晒出工资单:原来是狠补了这个~真香
  6. python24.dll_2_48_python24.dll
  7. 25利他行为可以学习和模仿吗
  8. 昨天的一个披扣的问题处理到很晚没搞定的原因
  9. 技术实践丨列存表并发更新时的锁等待问题原理
  10. [深度学习]Python/Theano实现逻辑回归网络的代码分析
  11. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
  12. IDEA下Maven多模块项目介绍和搭建
  13. elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
  14. 系统性能调优的各个方面
  15. 计算机系统组成导学案,单元一任务2认识计算机系统的组成导学案.pdf
  16. Android Github开源项目大集会 真的什么都有啊
  17. 数据挖掘和数据仓库之间的区别
  18. 最最简单的几个Mac终端命令
  19. DDS(Direct Digital Synthesizer)数字频率合成器
  20. VCC和GND短路,怎么找问题?

热门文章

  1. html 图片点击查看大图_【神游千年,大美敦煌】北魏-260窟【高清大图】
  2. Git新建临时分支进行开发后合并至master
  3. 根据数据库表字段删除所有相关信息(删库)
  4. string修饰的梦修改吗_Java String 对象,你真的了解了吗?
  5. 命令行切换到conda环境_Anaconda命令行常用操作
  6. 编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)
  7. c# 定位内存快速增长_CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)...
  8. 基于netty访问WebSocket(java的websocket客户端)(访问远程ws协议)
  9. python的主要功能_Python的主要功能是什么?
  10. python3 yield 大文件_详解Python3中yield生成器的用法