您的位置:首页 > 其它

电力窃漏电用户自动识别

2017-12-02 13:39 381 查看
1.挖掘目标

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

2)调用模型进行实时监测

2 分析方法与过程

获取原始数据

数据探索分析

数据预处理

构建专家样本

构建识别模型

调用模型进行实时诊断

3.获取原始数据

数据内容:偷窃漏电用户有关数据和不同用户类别的正常用电数据,同时包含窃漏电标识;

4.数据探索分析

(1)通过柱状图及用户标识得出非居民用户类别不存在窃漏电情况,所以在数据挖掘时将其排除;

(2)周期性分析可得:正常用户用电比较平稳,而窃漏电用户呈现明显下降趋势;

5.数据预处理

(1)数据清洗:

a.根据数据探索分析结果,将非居民用户类别数据过滤,减少其对掌握数据特征准确度的影响;

b.经过观察,节假日的用电明显少于正常时间的用电,故将其过滤,以免在数据分析时影响判断是否为偷窃漏电用户;

(2)缺失值处理

考虑可否抛弃,如果不能抛弃,就考虑将缺失值补全,采用拉格朗日插值法补全缺失数据;

拉格朗日插值法

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

inputfile = "E:/MachineLearning-data/Electric_01/missing_data.xls"#输入文件路径
outputfile = "E:/MachineLearning-data/Electric_01/missing_data_processed.xls"#输出文件路径

data = pd.read_excel(inputfile,header=None)#读入数据

#自定义列向量插值函数
#其中s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s,n,k=5):
y = s[list(range(n-k,n))+list(range(n+1,n+k+1))]#取10个数
y = y[y.notnull()]#剔除空值
#拉格朗日函数调用:所取数据(10个值)的下标、所取的数据值以及最终要插入的数据位置
#返回该位置的插入值
return lagrange(y.index,list(y))(n)
#i取值为0-2
for i in data.columns:
#j取值0-20
for j in range(len(data)):
#data[i],判断这一列是否有空值出现(有空值才进行插值操作),将Boolean判断结果按列表排列
if(data[i].isnull())[j]:
data[i][j] = ployinterp_column(data[i],j)
data.to_excel(outputfile,header=None,index=False)#输出结果至Excel表格


插值前的数据为:https://pan.baidu.com/s/1c20IDfq
插值后的数据为:https://pan.baidu.com/s/1qYsmGES


(3)数据变换

a.电量趋势下降指标

统计当天设定前后5天为统计窗口期,第i天的用电量趋势是考虑前后5天期间的用电量斜率(使用最下二乘法求斜率)



其中涉及的f为用电量,

为用电量均值,

设当天与前一天比较函数为:



其中

为第i天用电趋势

电视下降指标最后通过统计在统计器窗口内的下降天数和,即:



b.线损指标

第l天的线路供电量为:

,线路上各个用户的总用电量为

,线路的线损率为:


,由于一天的线损率无法准确表现窃漏电情况,所以用前5天和后5天线损率平均值进行准确衡量,即:



其中,

为前5天线损率均值,

为后5天线损率均值

c.告警类指标

统计终端报警次数和

6.构建专家样本

将三种指标进行统计后得出专家数据如:https://pan.baidu.com/s/1nuCvy2X

7.构建识别模型

1)构建神经网络模型

import pandas as pd
from random import shuffle

#1.原始数据划分
datafile = 'E:/MachineLearning-data/Electric_01/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%位测试集

#2.构建神经网络模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数

netfile = 'E:/MachineLearning-data/Electric_01/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节点)
cf27
的连接
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) #保存模型

#3.绘制混淆矩阵
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() #显示作图结果

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






错误分析:

错误1:
( 01 )TypeError: Dense can accept only 1 positional arguments (‘units’,),
but you passed the following positional arguments: [11, 17]

解决:就是在Dense中写好参数名称:
Dense(input_dim=11,output_dim=17)

错误2:
Keras TypeError: run() got an unexpected keyword argument 'class_mode'
解决:
找到model.compile(loss='categorical_crossentropy', optimizer=sgd,
class_mode='categorical')这一行,去掉class_mode='categorical',再执行model.fit即可


keras库安装参考 http://blog.csdn.net/qq_36890572/article/details/78673368[/code] 
2)构建CART模型

#构建并测试CART决策树模型

import pandas as pd #导入数据分析库
from random import shuffle #导入随机函数shuffle,用来打算数据
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
from sklearn.externals import joblib
import matplotlib.pyplot as plt #导入作图库
from sklearn.metrics import roc_curve #导入ROC曲线函数

#1.将数据集进行打乱后形成80%的训练集和20%的测试集
datafile = 'E:/MachineLearning-data/Electric_01/model.xls' #数据名
treefile = 'E:/MachineLearning-data/Electric_01/tree.pkl' #模型输出名字
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%为测试集

#2.构建CART决策树模型
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:,:3],train[:,3]) #训练
#保存模型
joblib.dump(tree, treefile)

#3.做混淆模型图
cm = confusion_matrix(train[:,3], tree.predict(train[:,:3])) #混淆矩阵
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() #显示作图结果

#4.绘制决策树模型的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)模型比较

在理论上LM神经网络的ROC曲线应该比CART决策树的ROC曲线更加靠近单位方形左上方,其曲线下的面积更大,意味着预测的准确率越高,但由于数据量太少,所以LM神经网络表现比较差,在该实验中分类性能没有CART好。

8.调用模型进行实时诊断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据分析模型
相关文章推荐