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

一、项目背景

传统的防漏电窃电方法主要通过定期巡检、定期校验电表、用户举报窃电等方法来发现窃电或者计量装置故障,对人的依赖性比较强,抓窃查漏的目标不明确。
供电局相关人员利用相关数据构建的基于指标加权的用电异常分析模型各输入指标需要专家的知识和经验,具有比较大的主观性,存在比较明显的缺陷。
需求更加方便和客观的电力窃漏电用户自动识别模型。

二、项目目标

归纳窃漏电用户的关键特征,构建窃漏电用户的识别模型。
利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。

三、项目流程

3.1 项目流程概览

项目流程图
在这里插入图片描述
数据抽取
从电力计量自动化系统、营销系统有选择性地抽取部分大用户用电负荷、终端报警及违约窃电处罚信息等原始数据。
数据探索
对样本数据探索分析,剔除不可能存在窃漏电行为行业的用户,即白名单用户,初步审视正常用户和窃漏电用户的用电特征。
数据预处理
对样本数据进行预处理,包括数据清洗、缺失值处理和数据变换。
模型构建
利用数据构建模型。

3.2 数据抽取

选择性地抽取历史数据形成历史数据样本,可以从营销系统抽取用户名称、用户编号、用电类别、计量方式、电流电压互感器变化、违约窃电记录等数据,从计量自动化系统抽取实时负荷参数、终端报警记录等数据。(要注意的是,虽然同属历史数据样本,但各类数据的用途是不太一样的,参与了不同的项目流程)

3.3 数据探索

3.3.1 数据质量分析

(对历史数据样本质量进行分析,对不同数据着重点不太一样,比如,在缺失值分析中,对于一些参与建模的核心数据,要详尽分析并尽可能补全或其他处理,对于一些可能在项目中影响基本没有甚至根本没影响的数据就可以稍作分析或不做分析,例如在本例中,用户编号其实对于建模过程影响可以说就没有,主要分析的是用电量)
(数据质量分析以历史样本数据中核心数据 三个用户一个月工作日用电量数据 为例进行分析,数据见数据挖掘项目 I 电力窃漏电用户自动识别 missing_data和model数据

在这里插入图片描述

3.3.1.1缺失值分析
缺失值产生的原因

…(材料给的就是这样,原因就是数据全了还怎么让你练习数据缺失值的处理,手动狗头)

缺失值的影响

1.导致原本就少的数据更显得可怜了
2.数据缺失会影响模型的构建
3.由于原本数据较少,如果将缺失数据的记录删除,可能客观上会导致模型的准确性降低,故考虑采用补全缺失值的办法

缺失值的分析

数据样本较小,经简单统计分析,可知,缺失值一共有9个,涉及到了8行,缺失率约为14.29%

3.3.1.2 异常值分析

数据取值范围合理,无负值

3.3.1.2 一致性分析

本项目用到的数据不需要一致性分析

3.3.2 数据特征分析
3.3.2.1 分布分析

对2009年1月1日至2014年12月31日共5年所有的窃漏用户进行分布分析,统计出各个用电类别的窃漏电用户分布情况,可以发现非居民类别不存在窃漏电情况,这是就可以在接下来的分析中不考虑非居民类别的用电数据。

在这里插入图片描述

3.3.2.2 周期性分析

从历史数据样本中抽取数据分别对窃漏电用户和正常用户进行周期性分析,以下以窃漏电用户和正常用户各一位进行分析。

在这里插入图片描述在这里插入图片描述
正常用电用户电量数据正常用电用户电量趋势图
电脑$1600
窃漏电用户电量数据窃漏电用电用户电量趋势图

结论:正常用电用户用电量一般是周期性规律变化的,这是正常用电用户的重要特征;正常用电到窃漏电过程是用电量持续下降的过程,窃漏电用户从2014年9月1开始用电量下降,并且持续下降,这就是用户开始窃漏电时所表现出来的重要特征。

3.4 数据预处理
3.4.1 数据清洗
3.4.1.1 缺失值处理

在本项目中,核心的数据是三个用户一个月工作日用电量数据,将用于模型构建,主要对其进行缺失值处理,由于数据样本较少,且删除缺失值记录会导致模型的精确性,故对缺失值进行插补。

采用拉格朗日插值法:

#拉格朗日插值代码
import pandas as pd #导入数据分析库Pandas
from scipy.interpolate import lagrange #导入拉格朗日插值函数
def ployinterp_column(s, n, k=5):
  y = s.reindex(list(range(n-k, n)) + list(range(n+1, n+1+k)))
  y = y[y.notnull()] #剔除空值
  return lagrange(y.index, list(y))(n) #插值并返回插值结果
inputfile = 'missing_data.xls' #输入数据路径,需要使用Excel格式;
outputfile = 'missing_data_processed.xls' #输出数据路径,需要使用Excel格式
data = pd.read_excel(inputfile, header=None) #读入数据
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
#逐个元素判断是否需要插值
for i in data.columns:
  for j in range(len(data)):
    if (data[i].isnull())[j]: #如果为空即插值。
      data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile, header=None, index=False) #输出结果
3.4.1.2 异常值处理

在数据探索中,已经分析过,核心数据正常,不许需进行处理

3.4.2 数据集成

本项目设计操作不需要。

3.4.3 数据变换

实际上,在上述核心数据样本中,仅仅有用电量是不够的,但是即使再加入其他数据如负荷等等,其反映用户窃漏电行为的程度也并不高,可以说这样的数据其“能力”不太够,此时,可以进行以这样的数据为源进行数据变换,以增加数据反应用户窃漏电行为的能力。

窃漏电评价指标体系主要采用三类指标进行度量。
在这里插入图片描述
电量趋势下降指标

由周期性分析可以发现,正常用户的用电量较为平稳,窃漏电用户的用电量呈现下降的趋势,然后趋于平缓,因此可考虑前后几天作为统计窗口期,考虑期间的下降趋势,利用电量做直线拟合得到的斜
率作为衡量,如果斜率随时间不断下降,那该用户的窃漏电可能性就很大。对统计当天设定前后5天为统计窗口期,计算这11天内的电量趋势下降情况。首先计算这11天中每天的电量趋势,其中
第i天的用电量趋势是考虑前后5天期间的用电量斜率,即
在这里插入图片描述若电量趋势为不断下降的,则认为具有一定的窃电嫌疑,故计算这11天内,当天比前一天用电量趋势为递减的天数,即设有
在这里插入图片描述则这11天内的电量趋势下降指标为
在这里插入图片描述
线损率

在这里插入图片描述在这里插入图片描述在这里插入图片描述
告警类指标
与窃漏电相关的终端报警主要有电压缺相、电压断相、电流反极性等告警,计算发生与窃漏电相关的终湍报警的次数总和,作为告警类指标。

构建专家样本
缺失值数据补全后经由上述数据变换后汇集形成了专家样本。
(形成的专家数据如下,这里只是阐述了一个变化过程,原来的数据比较少,这里专家样本的数据要更多一点,下图只是一部分,数据见数据挖掘项目 I 电力窃漏电用户自动识别 missing_data和model数据
在这里插入图片描述

3.5 模型构建
3.5.1 数据划分

专家样本构建完成之后,需要划分测试样本和训练样本,随机选取20%的数据作为测试样本,剩下的80%作为训练样本。
数据划分操作详见代码(附加注释)

3.5.2 模型选取

窃漏电用户识别可通过构建分类预测模型来实现,将选取LM神经网络和CART决策树进行窃漏电用户识别模型构建。
LM神经网络

#LM神经网络模型

#数据划分
import pandas as pd#导入数据分析库
from random import shuffle#导入随机函数shuffle,用来打乱数据
datafile = 'model.xls'#文件
data = pd.read_excel(datafile)#读入文件,前三列是特征,第四列是标签
data = data.values#将表格式转换为矩阵
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 = 'net.model' #构建的神经网络模型存储路径
net = Sequential() #建立神经网络
net.add(Dense(input_dim = 3, units = 10)) #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu')) #隐藏层使用relu激活函数
net.add(Dense(input_dim = 10, units = 1)) #添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics=['accuracy']) #编译模型,使用adam方法求解
net.fit(train[:, :3], train[:, 3], epochs=1000, batch_size=1) #训练模型,循环1000次
net.save_weights(netfile)#保存模型


#LM神经网络模型的混淆矩阵
from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形
'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''
cm = confusion_matrix(train[:,3], predict_result) #混淆矩阵
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') #坐标轴标签
plt.show() #显示作图结果


#LM神经网络模型的ROC曲线
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() #显示作图结果

CART决策树

#CART决策树模型

#数据划分
import pandas as pd #导入数据分析库
from random import shuffle #导入随机函数shuffle,用来打算数据
datafile = 'model.xls' #数据名
treefile = 'tree.pkl' #模型输出名字
data = pd.read_excel(datafile) #读取数据,数据的前三列是特征,第四列是标签
data = data.values #将表格转换为矩阵
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 #导入决策树模型
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:,:3],train[:,3]) #训练
#保存模型
#from sklearn.externals import joblib
import joblib
joblib.dump(tree, treefile) 


#CART决策树模型的混淆矩阵
from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
cm = confusion_matrix(train[:,3], tree.predict(train[:,:3])) #混淆矩阵
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') #坐标轴标签
plt.show() #显示作图结果

#CART决策树模型的ROC曲线
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() #显示作图结果
3.5.3 模型评价
在这里插入图片描述在这里插入图片描述
LM神经网络模型混淆矩阵CART决策树混淆矩阵

对于LM神经网络模型,分类准确率为(153+64)/(153+64+6+9)=93.53%,正常用户被误判为窃漏电用户占正常用户的6/(6+153)=3.77%,窃漏电用户被误判为正常用户占实际窃漏电用户的9/(9+64)=12.33%。

对于CART决策树混淆矩阵,分类准确率为(154+59)/(154+59+8+11)=91.81%,正常用户被误判为窃漏电用户占正常用户的11/(11+154)=6.67%,窃漏电用户被误判为正常用户占实际窃漏电用户的8/(8+59)=11.94%。

以上比较,两者相差并不多。

故再用ROC曲线进行评价:

在这里插入图片描述在这里插入图片描述
LM神经网络模型ROC曲线CART决策树ROC曲线

以上显然可见,LM神经网络模型ROC曲线下的面积比CART决策树ROC曲线下的面积大一些,故电力窃漏电用户自动识别将基于LM神经网络模型建立。

接受者操作特性曲线(ROC曲线)是指在特定刺激条件下,以被试在不同判断标准下所得的虚报概率P(y/N)为横坐标,以击中概率P(y/SN)为纵坐标,画得的各点的连线。

至此,流程完毕,项目完成。(当然实际过程中某些环节还需要多次进行优化)

恳请斧正

  • 9
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值