您的位置:首页 > 其它

电力窃漏电用户自动识别

2018-04-08 11:41 731 查看
本文是基于《Python数据分析与挖掘实战》学习笔记
 1.背景与挖掘目标
    传统意义上的防止用户窃漏电的方式主要是通过人工的定期进行巡检,定期校验电表等方式,这种方式存在诸多的弊端,我们期望是这些数据提取出窃漏电用户的关键特征,构建窃漏电用户识别模型,就能够自动对其进行检查,判断用户是否存在窃漏电的行为.
   本次数据挖掘建模的目标如下:
(1). 归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型
(2). 利用实时监测数据,调用窃漏电用户识别模型实现实时诊断
2. 分析方法与过程
 在数据挖掘上,针对一个问题的具体分析是非常重要的,往往能够决定我们最终挖掘的成败。这就需要我们对具体的问题进行仔细的分析。
针对于窃漏电的这种行为,它是监控大用户中的很小的一个部分.价值密度是非常低的,同时也应该能分析出,有一些企业用户是完全没有漏电的必要,比如银行,学校的这种机构。因此在分析这一步分的数据时,我们就可以直接将其剔除.




   数据探索分析:
  数据探索分析是对数据进行初步的研究,发现数据的内在的规律性,有助于选择合适的数据预处理与数据分析的技术。本案例主要采用分布分析周期性分析等方法针对我们采集到的数据进行分析.
分布分析: 分布分析用来解释数据的分布特征和分布类型,显示其分布情况。分布分析主要分为两种:对定量数据的分布分析和对定性数据的分布分析。实际上,我们针对数据进行分布分析,就能够大体上感受到我们要处理问题的一个大致的情况.




上图展示的就是用户类别且漏电情况的分布直方图,我们可以从图上比较直观的看出,非居民不存在窃电的情,故可以将这部分数据去除,而窃电最高的是大工业,其次是普通农业,特别是大工业,我们要对这一部分的数据进行重点的关注.
周期性分析:随机抽取一个正常用电用户与窃电用户,采用周期性分析对用电量进行探索。
3. 数据的预处理:
  这个案例主要从数据清洗,缺失值处理和数据变换等方面对数据进行预处理.
  数据清洗:是对数据进行重新审查和校验的过程,目的在于删除重复的信息,纠正存在的错误,并提供数据的一致性.我们刚抽取的数据是不可能没有错误的,因此对数据的清洗是很必要的,比如上面我们对数据的与探索中,我们发现非居民的用户根本就不存在窃电的这种行为,但是我们的处理的数据中,开始是肯定存在这种数据的,因此我们需要对这样的数据进行删除.
 缺失值处理:
   在原始的数据集上,会存在缺失的现象,如果将这些值抛弃掉,会严重化的影响我们的计算结果.为此我们需要对缺失的数据进行处理。我们可以利用拉格朗日插值法对缺失的数据进行增补.
*(在数值分析中,拉格朗日插值法是一个最基本的方法,自行脑补这种方法,实质上就是基于若干个离散点进行画一条连续的曲线)# -*- coding: utf-8 -*-
"""
Created on Sat Apr 7 17:01:41 2018

@author: Administrator
"""
import pandas as pd
from scipy.interpolate import lagrange #导入拉格朗日插值函数
inputfile='E:/missing_data.xls'
outputfile='E:/miss_data_processed.xls'
#读入数据
data=pd.read_excel(inputfile,header=None)
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据的个数
def 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)
data.to_excel(outputfile,header=None,index=False)
  插值前的列表截图:




当调用拉格朗日操作后,其结果变成:




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





专家样本的构建是一个十分复杂的过程,需要对实际问题进行复杂的分析,有需要有实际问题的背景,比如上面的利用线损指标进行考虑用户是否窃电的行为,不仅需要我们对其进行模型的构建,更需要的是我们是否对这个问题进行深入的挖掘,从而能够考虑到这样的一个点.
4.模型的构建
当我们对专家的样本处理完后,接下来的步骤就是构建模型.
<
4000
strong>针对这个实际问题,比较常用的分类与预测模型有LM神经网络和CART决策树,这里我们需要的是分别构造这两个模型,然后对其比较,选取比较好的哪一个,这里注意输入的属性有:电量趋势下降指标,线损指标与告警类指标.输出项为窃电的表示[/b]
代码展示:#-*- coding: utf-8 -*-

import pandas as pd
from random import shuffle

datafile = 'E:/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 = 'E:/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=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'''
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) #显示混淆矩阵的可视化结果

经过1000次迭代后,我们产生的混淆矩阵如下展示:




上图展示的就是我们绘制结果的混淆矩阵,混淆矩阵是我们预测结果的可视化结果,左边是真实的类别,而右边是我们预测的类别,可以看到我们预测的正确率与错误率.
主对角线是正确预测的,副对角线是判断错误的样本数.
CART决策树
通过Scikit-Lrean利用训练样本构建CART决策树模型,得到混淆矩阵的决策树模型。。import pandas as pd
from random import shuffle
datafile='E:/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):,:]
#这里我们导入决策树模型
from sklearn.tree import DecisionTreeClassifier
#输出模型的名字
treefile='E:/tree.pkl'
tree=DecisionTreeClassifier()
tree.fit(train[:,:3],train[:,3])#进行模型的训练
#进行模型的保存
from sklearn.externals import joblib
joblib.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()


其结果具有随机性,每一次的变化都是不一样的.
模型评价:
对于训练样本,LM神经网络与CART决策树的分类准确率相差不大,那么我们要进一步评价模型的性能,故利用测试样本对这两个模型进行评价,采用ROC曲线的方式对模型进行评估。
一个优秀的分类器对应的ROC曲线应该是尽量靠近左上角的。
LM神经网络的ROC曲线:



决策树的神经网络的ROC曲线:



由上图可见,我们的LM神经网络的ROC曲线比决策树的ROC曲线更加接近于该案例的实际情况,因此我们选择利用LM神经网络来实现这个实际的案例..
小结:
本章结合窃漏电用户识别的案例,重点介绍了数据挖掘算法中的LM神经网络与CART决策树算法在实际案例中的应用。研究窃电用户的行为特征,总结出窃漏电用户的特征指标,对比LM神经网络和CART决策树在窃电用户的识别效果,从而选择最优的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐