电力窃漏电用户自动识别
2017-12-02 13:39
381 查看
1.挖掘目标
1)归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型;
2)调用模型进行实时监测
2 分析方法与过程
获取原始数据
数据探索分析
数据预处理
构建专家样本
构建识别模型
调用模型进行实时诊断
3.获取原始数据
数据内容:偷窃漏电用户有关数据和不同用户类别的正常用电数据,同时包含窃漏电标识;
4.数据探索分析
(1)通过柱状图及用户标识得出非居民用户类别不存在窃漏电情况,所以在数据挖掘时将其排除;
(2)周期性分析可得:正常用户用电比较平稳,而窃漏电用户呈现明显下降趋势;
5.数据预处理
(1)数据清洗:
a.根据数据探索分析结果,将非居民用户类别数据过滤,减少其对掌握数据特征准确度的影响;
b.经过观察,节假日的用电明显少于正常时间的用电,故将其过滤,以免在数据分析时影响判断是否为偷窃漏电用户;
(2)缺失值处理
考虑可否抛弃,如果不能抛弃,就考虑将缺失值补全,采用拉格朗日插值法补全缺失数据;
拉格朗日插值法
(3)数据变换
a.电量趋势下降指标
统计当天设定前后5天为统计窗口期,第i天的用电量趋势是考虑前后5天期间的用电量斜率(使用最下二乘法求斜率)
其中涉及的f为用电量,
为用电量均值,
设当天与前一天比较函数为:
其中
为第i天用电趋势
电视下降指标最后通过统计在统计器窗口内的下降天数和,即:
b.线损指标
第l天的线路供电量为:
,线路上各个用户的总用电量为
,线路的线损率为:
,由于一天的线损率无法准确表现窃漏电情况,所以用前5天和后5天线损率平均值进行准确衡量,即:
其中,
为前5天线损率均值,
为后5天线损率均值
c.告警类指标
统计终端报警次数和
6.构建专家样本
将三种指标进行统计后得出专家数据如:https://pan.baidu.com/s/1nuCvy2X
7.构建识别模型
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.调用模型进行实时诊断
相关文章推荐
- Python数据挖掘—电力窃漏电用户自动识别
- 电力窃漏电用户自动识别
- Pyhton数据挖掘-电力窃漏电用户的自动识别
- 第6章 电力窃漏电用户自动识别
- [DM实战]电力窃漏电用户自动识别
- 电力窃漏电用户自动识别
- Pyhton数据挖掘-电力窃漏电用户的自动识别
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- Web搜索中的用户意图的自动识别
- java自动识别用户上传的文本文件编码
- java自动识别用户上传的文本文件编码
- java自动识别用户上传的文本文件编码(未测试)
- Web搜索中的用户意图的自动识别
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- iOS 7新的API允许拍照类应用自动识别用户面部表情
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- 《Python数据分析与挖掘实战》第六章学习—CART决策树+神经网络(窃漏电用户识别)
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)