返回介绍

1.构建窃漏电用户识别模型

发布于 2024-01-28 21:41:24 字数 2808 浏览 0 评论 0 收藏 0

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

(1)数据划分

对专家样本随机选取20%作为测试样本,剩下的80%作为训练样本。其代码如代码清单6-2所示。

代码清单6-2 原始数据分为训练数据测试数据

#-*- 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() #将表格转换为矩阵
shuffle(data) #随机打乱数据
p = 0.8 #设置训练数据比例
train = data[:int(len(data)*p),:] #前80%为训练集
test = data[int(len(data)*p):,:] #后20%为测试集

(2)LM神经网络

使用Keras库为我们建立神经网络模型。设定LM神经网络的输入节点数为3,输出节点数为1,隐层节点数为10,使用Adam方法求解。对于激活函数,在隐藏层使用Relu(x)=max(x,0)作为激活函数,实验表明该激活函数能够大幅提高模型的准确率。训练样本建模的混淆矩阵见图6-8,可以算得分类准确率为(161+58)/(161+58+6+7)=94.4%,正常用户被误判为窃漏电用户占正常用户的7/(161+7)=4.2%,窃漏电用户被误判为正常用户占正常窃漏电用户的6/(6+58)=9.4%。构建LM神经网络模型的代码如代码清单6-3所示。

代码清单6-3 构建LM神经网络模型代码(接6-2)

#构建LM神经网络模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数
netfile = '../tmp/net.model' #构建的神经网络模型存储路径
net = Sequential() #建立神经网络
net.add(Dense(3, 10)) #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu')) #隐藏层使用relu激活函数
net.add(Dense(10, 1)) #添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = "binary") 
    #编译模型,使用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'''
from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3], predict_result).show() #显示混淆矩阵可视化结果

代码详见:demo/code/lm_model.py

图6-8 利用训练样本构建LM神经网络的混淆矩阵

(3)CART决策树

通过Scikit-Lrean利用训练样本构建CART决策树模型,得到混淆矩阵如图6-9所示,分类准确率为(160+56)/(160+56+3+13)=93.1%,正常用户被误判为窃漏电用户占正常用户的13/(13+160)=7.5%,窃漏电用户被误判为正常用户占正常窃漏电用户的3/(3+56)=5.1%。构建决策树的代码如代码清单6-4所示。

代码清单6-4 构建CART决策树模型代码(接6-2)

#构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
treefile = '../tmp/tree.pkl' #模型输出名字
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:,:3],train[:,3]) #训练
#保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)
from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(train[:,3], tree.predict(train[:,:3])).show() #显示混淆矩阵可视化结果
#注意到Scikit-Learn使用predict方法直接给出预测结果。

完整的代码详见:demo/code/dt_model.py

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文