来源:数据路

本文约3000字,建议阅读7分钟。
通过本文给大家介绍利用LM神经网络算法进行电力窃漏电用户的自动识别。

背景与挖掘目标

背景

  1. 传统的防窃漏电方法主要通过定期巡检、定期校验电表、用户举报窃电等方法来发现窃电或计量装置故障。

  2. 但这种方法对人的依赖性太强,抓窃查漏的目标不明确。

  3. 通过采集电量异常、负荷异常、终端报警、主站报警、线损异常等信息,建立数据分析模型,来实时监测窃漏电情况和发现计量装置的故障。


目标

  1. 归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型。

  2. 利用实时检测数据,调用窃漏电用户识别模型实现实时诊断。

分析方法与过程

分析方法

  1. 窃漏电用户在电力计量自动化系统的监控大用户中只占一小部分,同时某些大用户也不可能存在窃漏电行为,如银行、税务、学校和工商等非居民类别,故在数据预处理时有必要将这些类别用户剔除。

  2. 系统中的用电负荷不能直接体现出用户的窃漏电行为,终端报警存在很多误报和漏报的情况,故需要进行数据探索和预处理,总结窃漏电用户的行为规律,再从数据中提炼出描述窃漏电用户的特征指标。

  3. 最后结合历史窃漏电用户信息,整理出识别模型的专家样本数据集,再进一步构建分类模型,实现窃漏电用户的自动识别。窃漏电用户识别流程如图6.1所示,主要包話以下步骤。

过程整理

  1. 从电力计量自动化系统、营销系统有选择性地抽取部分大用户用电负荷、终端报警及违约窃电处罚信息等原始数据。

  2. 对样本数据探索分析,剔除不可能存在窃漏电行为行业的用户,即白名单用户,初步审视正常用户和窃漏电用户的用电特征。

  3. 对样本数据进行预处理,包括数据清洗、缺失值处理和数据变换。

  4. 构建专家样本集。

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

  6. 在线监测用户用电负荷及终端报警,调用模型实现实时诊断。

数据探索分析

以下代码可以使用Excel直接打开数据集,进行画图分析。


1. 分布分析

2. 周期性分析

3. 窃漏电用电电量分析

数据预处理

1. 数据清洗

  • 非居民不存在透漏电,如学校,邮局等等

  • 结合业务,节假日会比平时偏低,为了达到更好效果,去处掉节假日。

2. 缺失值处理

具体见数据集内容对于缺失值处理,采用拉格朗日插值法补值,具体方法如下。

  • 首先,确定原始数据集中的自变量和因变量,

  • 取出缺失值前后五个数据(空值和不存在,去掉)

  • 取出十个数据为一组,采用拉格朗日多项式差值公式

#-*- coding: utf-8 -*-#拉格朗日插值代码import pandas as pd #导入数据分析库Pandasfrom scipy.interpolate import lagrange #导入拉格朗日插值函数

inputfile = '/home/kesci/input/date14037/missing_data.xls' #输入数据路径,需要使用Excel格式;outputfile = '/home/kesci/work/missing_data_processed.xls' #输出数据路径,需要使用Excel格式,这里在科赛上,所以本地运行需要修改路径

data = pd.read_excel(inputfile, header=None) #读入数据print(data)#自定义列向量插值函数#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5def ployinterp_column(s, n, k=5):  y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数,注意这类()取最左,不取最右。  y = y[y.notnull()] #剔除空值  return lagrange(y.index, list(y))(n) #插值并返回插值结果

#逐个元素判断是否需要插值for i in data.columns:  for j in range(len(data)):    if (data[i].isnull())[j]: #如果为空即插值。      data[i][j] = ployinterp_column(data[i], j)

print(data)data.to_excel(outputfile, header=None, index=False) #输出结果
           0         1         20   235.8333  324.0343  478.32311   236.2708  325.6379  515.45642   238.0521  328.0897  517.09093   235.9063       NaN  514.89004   236.7604  268.8324       NaN5        NaN  404.0480  486.09126   237.4167  391.2652  516.23307   238.6563  380.8241       NaN8   237.6042  388.0230  435.3508

———————————数据处理前后————————————             0           1           20   235.833300  324.034300  478.3231001   236.270800  325.637900  515.4564002   238.052100  328.089700  517.0909003   235.906300  203.462116  514.8900004   236.760400  268.832400  493.3525915   237.151181  404.048000  486.0912006   237.416700  391.265200  516.2330007   238.656300  380.824100  493.3423828   237.604200  388.023000  435.350800
  • 数据变换

通过电力计量系统采集的电量、负荷,虽然在一定程度上能反映用户窃漏电行为的某些规律,但要作为构建模型的专家样本,特征不明显,需要进行重新构造。基于数据变换,得到新的评价指标来表征窃漏电行为所具有的规律,其评价指标体系如图6巧所示。

  • 用电量趋势下降指标

由之前的周期性分析,可以发现。窃漏电用户的用电量,会不断呈下降态势。然后趋于平缓。正常用户,整体上呈平稳态势。所以,考虑用一段时间的用电量拟合成一条直线,判断斜率进行指标计算。

  • 线损指标

综上指标计算方法,得出数据,详情看数据集中的model.xls你要问我怎么数字计算。我也很懵呀,找个机会把数学公式计算办法学习完后,再来补充相应的代码但是,我觉得可以用excel比较简单的较快处理这些数据。训练用的专家样本数据看附件中的model.xls

模型构建

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

  • 数据划分

对专家样本,随机选取20%作为测试样本,80%作为训练样本,代码如下

  • LM神经网络

使用Keras库为我们建立神经网络模型,设定KM神经网络的输入节点数为3,输出节点为1,隐藏节点数为10,使用Adam方法求解,隐藏层使用Relu(x)=max(x,0)作为激活函数,实验表面该函数能大幅提高模型的准确率。

以下代码运行需要两三分钟时间,运行完毕后,得到混淆矩阵图。可以算得,分类准确率为(161+58)/(161+58+6+7)=94.4%,正常的用户被误判为窃漏电用户占正常的7/(161+7)=4.2%,窃漏电用户被误判为正常用户占正常用户的6/(6+58)=9.4%。

#-*- coding: utf-8 -*-import matplotlib.pyplot as pltimport pandas as pdfrom random import shuffle

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 plt

datafile = '/home/kesci/input/date14037/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 = '/home/kesci/input/date14037/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') #编译模型,使用adam方法求解

net.fit(train[:,:3], train[:,3], nb_epoch=100, batch_size=1) #训练模型,循环1000次,不用于书籍源代码,这里需要删除class这个值才能正常运行net.save_weights(netfile) #保存模型

predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''

#导入自行编写的混淆矩阵可视化函数,具体见最上代码 cm_plot(y, yp)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 plt

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() #显示作图结果

以下是运行结果,可以在科赛上看训练过程。

模型评价与分析:LM神经网络使用Keras库为我们建立神经网络模型,设定KM神经网络的输入节点数为3,输出节点为1,隐藏节点数为10,使用Adam方法求解,隐藏层使用Relu(x)=max(x,0)作为激活函数,实验表面该函数能大幅提高模型的准确率。

以上代码运行需要两三分钟时间,运行完毕后,得到混淆矩阵图。可以算得,分类准确率为(161+58)/(161+58+6+7)=94.4%,正常的用户被误判为窃漏电用户占正常的7/(161+7)=4.2%,窃漏电用户被误判为正常用户占正常用户的6/(6+58)=9.4%。

CART决策树算法


#-*- coding: utf-8 -*-#构建并测试CART决策树模型

import pandas as pd #导入数据分析库from random import shuffle #导入随机函数shuffle,用来打算数据

datafile = '/home/kesci/input/date14037/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 = '/home/kesci/work/tree.pkl' #模型输出名字tree = DecisionTreeClassifier() #建立决策树模型tree.fit(train[:,:3], train[:,3]) #训练

#保存模型from sklearn.externals import joblibjoblib.dump(tree, treefile)

#导入自行编写的混淆矩阵可视化函数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 plt

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() #显示作图结果

运行结果如下:

模型评价与分析:分类的准确率为(160+56)/(160+56+3+13)=93.1%,得到的混淆矩阵如上。因为每次随机的样本不同,随意准确率是在一定区间内浮动。


模型对比评价

采用OCR曲线评价方法进行评估,一个优秀的分类器所对应的ROC曲线应该是尽量靠近左上角的。

通过对比,可以比较容易得出,LM神经网络的ROC曲线更加符合优秀的定义。说明LM神经网络模型的分类性能较好,能应用于窃漏电用户识别。


进行窃漏电诊断

在线监测用户用电负荷及终端报警数据,并利用经过2.3节的处理所得到模型,输入在线实时数据,再利用前面代码构建好的窃漏电用户识别模型计算用户的窃漏电诊断结果,实现了窃漏电用户实时诊断。


小结

  1. 了解了数据挖掘算法中LM神经网络和CART决策树算法的实际应用场景

  2. 但是还未深刻理解,这个两个算法背后原理,往后在学习《数据挖掘导论》时要理解。

  3. 了解了识别模型优劣中的ROC比较方法,但是应该还会有更好的方式。

  4. 这个案例,可以类推到汽车相关的偷漏税项目上。但是,自己实战时发现,目标原始数据很难去发现有效指标与建立评价指标,业务的理解转换能力不足

  5. 目前,还在同步学习秦路的《七周数据分析师》希望能获得一些业务能力,帮助项目进行。

手把手实战:利用LM神经网络算法自动识别窃电用户(附代码)相关推荐

  1. 利用LM神经网络算法自动识别窃电用户

    背景与挖掘目标 背景 传统的防窃漏电方法主要通过定期巡检.定期校验电表.用户举报窃电等方法来发现窃电或计量装置故障. 但这种方法对人的依赖性太强,抓窃查漏的目标不明确. 通过采集电量异常.负荷异常.终 ...

  2. 《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别

    目标 通过电力计量自动化系统采集到的各相电流.电压.功率因数等用电负荷数据及用电异常等终端报警信息,和在线稽查系统和现场稽查的记录的漏窃电用户信息 提取漏窃电用户的关键特征,构建识别模型. 利用实时监 ...

  3. 大数据挖掘建模案例分析:利用BP神经网络算法进行用户行为分析(一)

    泰迪智能科技(数据挖掘平台:TipDM数据挖掘平台)最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合,可以让大家获得真实的数据挖掘学习与实践环境,更快.更好的学习数据挖掘知识与积累职 ...

  4. 深度学习实战——利用卷积神经网络对手写数字二值图像分类(附代码)

    系列文章目录 深度学习实战--利用卷积神经网络对手写数字二值图像分类(附代码) 目录 系列文章目录 前言 一.案例需求 二.MATLAB算法实现 三.MATLAB源代码 参考文献 前言 本案例利用MA ...

  5. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...

  6. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...

  7. 利用神经网络识别窃电用户

    目标: 识别用户是否存在窃电行为 分析思路与流程: 识别用户是否存在窃电行为是预测模型中的分类问题,故采用分类模型 确定模型之后,需要根据模型的要求,归纳窃电用户的关键特征 关键特征的获取,可能需要对 ...

  8. 基于灰狼算法优化的lssvm回归预测-附代码

    基于灰狼算法优化的lssvm回归预测 - 附代码 文章目录 基于灰狼算法优化的lssvm回归预测 - 附代码 1.数据集 2.lssvm模型 3.基于灰狼算法优化的LSSVM 4.测试结果 5.Mat ...

  9. 遗传算法_粒子群算法优化支持向量机分类预测-附代码

    遗传算法/粒子群算法优化支持向量机分类预测-附代码 文章目录 遗传算法/粒子群算法优化支持向量机分类预测-附代码 1. 支持向量机简介与参数优化的原理 1.1 支持向量机SVM简介 1.2 优化参数的 ...

最新文章

  1. NCBI SRA数据库使用详解
  2. 使用Visual Studio Code配合TypeScript增强SAP UI5开发的语法检查
  3. 如何查看服务器并发请求连接数
  4. java logout session_会话跟踪技术--session的使用
  5. 论文用impact、effect、influence 什么区别
  6. 学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么
  7. openv Mat 之 forEach 操作
  8. 读书笔记——实时渲染(一)
  9. java技术简介英文_JAVA技术人员英文简历模板
  10. 【Python爬虫】懂车帝_车型库页面
  11. layui实际项目使用过程中遇到的兼容性问题
  12. vscode 中怎么打开资源管理器?
  13. 一款开源计算机代数系统(CAS)Maxima
  14. java.time.ZoneId类详解
  15. 跳棋游戏利用树构建合法路径出现循环的解决办法
  16. 推荐系统的常用算法,选择,漫谈,推荐系统开源软件汇总
  17. GB、GB/T等含义
  18. opencv亚像素边缘精度_opencv 亚像素 算法
  19. mac pro系统升级导致的黑屏解决方案
  20. 【合宙ESP32C3】MPU6500六轴姿态传感器

热门文章

  1. 蓝牙扫描工具btscanner修复暴力扫描模式
  2. MyEclipse图表工具Birt的使用技巧(三)--连接webservice数据源
  3. WebLogic集群配置
  4. 用鼠标拖动图片的JS代码
  5. PowerPoint中如何插入MP3歌曲
  6. Openssl自签名证书
  7. 在FreeBSD下安装mysql+apache+php
  8. mysql 报错10614_golang使用go-sql-driver实现mysql增删改操作-Go语言中文社区
  9. Snowball 关系提取,2篇知乎博客
  10. np.random.choice()用法