您的位置:首页 > 其它

[DM实战]电力窃漏电用户自动识别

2018-01-08 13:10 295 查看
1、从电力计量自动化系统、营销系统有选择性地抽取部分大用户用电负荷、终端报警及违约窃电出发信息等原始数据。

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

      数据探索分析是对数据进行初步研究,发现数据的内在规律特征,有助于选择合适的数据预处理和数据分析技术。本案例主要采用分布分析和周期性分析等方法对电量数据进行数据探索分析。

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

      a 数据清洗的主要目的是从业务以及建模的相关需要方面考虑,筛选出需要的数据。由于原始数据中并不是所有数据都需要进行分析,因此需要在数据处理时,将赘余的数据进行过滤。本案例主要进行如下操作:

      1)通过数据的探索分析发现在用电类别中,非居民用电类别不可能存在漏电窃电的现象,需要将非居民用电类别的用电数据 过滤掉。

      2)结合本案例的业务,节假日用电量与工作日相比,会明显偏低。为了尽可能达到较好的数据效果,过滤节假日的用电数   据。

      b 在原始计量数据,特别是用户电量抽取过程中,发现存在缺失的现象。若将这些值抛弃掉,会严重影响供出电量的计算结   果,最终导致日线损率数据误差很大。为了达到较好的建模效果。需要对缺失值处理。本案例采用拉格朗日插值法对缺失值进行插补。

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

4、构建专家样本集。

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

在专家样本准备完成后,需要划分测试样本和训练样本,随机选取20%作为测试样本,剩下的作为训练样本。窃漏电用户识别  可通过构建分类预测模型来实现,比较常用的分类预测模型有LM神经网络和CART决策树,各个模型都有各自的优点,故采用 这两种方法构建窃漏电用户识别,并从中选择最优的分类模型。构建LM神经网络和CART决策树模型时输出项包括电量趋势下降指标、线损率指标,输出项为窃漏电标识。

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

     利用测试样本对两个模型进行评价,采用ROC曲线评价方法进行评估,要给优秀分类器所对应的ROC曲线应该尽量靠近左上   角。

#coding:utf-8

#拉格朗日插值代码

import pandas as pd    #导入数据分析库Pandas
from scipy.interpolate import lagrange   #导入拉格朗如插值函数
inputfile = './data/missing_data.xls'    #输入数据路径,需要使用Excel格式
outputfile = './tmp/missing_data_processed.xls'   #输出数据路径,需要使用excel格式  需要保证文件夹tmp存在

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

#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_columns(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:               #表格中共有data.columns列
for j in range(len(data)):
if (data[i].isnull())[j]:    #如果为空即插值
print((data[i].isnull())[j])
data[i][j] = ployinterp_columns(data[i],j)

data.to_excel(outputfile, header = None, index = False)   #输出结果

#coding:utf-8

#原始数据分为训练数据测试数据

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

datafile = './data/model.xls'    #数据名
data = pd.read_excel(datafile)    #读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix()    #将表格转换为矩阵

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])    #训练  train[:,:3]为前三列(列标0-2)所有row的数据   train[:,3]为第四列(列标3)所有row的数据

#保存模型
from sklearn.externals import joblib
joblib.dump(tree,treefile)    #持久化任意的python对象为一个文件

#模型评价

from cm_plot import *     #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3],tree.predict(train[:,:3])).show()     #显示混淆矩阵可视化结果

#绘制决策树模型的ROC曲线
from sklearn.metrics import roc_curve    #导入ROC曲线函数
import matplotlib.pyplot as plt

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


#coding:utf-8

#原始数据分为训练数据测试数据

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

datafile = './data/model.xls'    #数据名
data = pd.read_excel(datafile)    #读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix()    #将表格转换为矩阵

p = 0.8    #设置训练数据比例
train = data[:int(len(data)*p),:]    #前80%为训练数据
test = data[int(len(data)*p):,:]     #后20%为测试集

#构建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, units=10))   #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu'))  #隐藏层使用relu激活函数
net.add(Dense(input_dim=10, units=1))  #添加隐藏层(10节点)到输出层(1节点)的连接 输出层使用sigmod激活函数
net.add(Activation('sigmoid'))
net.compile(loss='binary_crossentropy', optimizer='adam')   #编译模型,使用adam方法求解

net.fit(train[:, :3],train[:, 3], nb_epoch=10, batch_size=1)   #训练模型,循环10次
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()     #显示混淆矩阵可视化结果

#绘制决策树模型的ROC曲线
from sklearn.metrics import roc_curve    #导入ROC曲线函数
import matplotlib.pyplot as plt

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


参考自:《python数据分析与挖掘》   --张良均
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐