不小心,知乎主页:不小心,微信官方账号: 数据路(shuju_lu)
刚开始写博客,希望能保持关注,继续努力。文章以数据相关为主,互联网为辅。
本文是《Python《数据分析与挖掘实战》一书的实战部分在整理分析后再现。本文是本书第六章的实战:电力盗漏用户自动识别。相关附件代码、数据和PDF,关注微信官方账号数据路,回复:挖掘实战。
在线观看体验更好,Jupyter notebook直接体验科赛平台,点击这里
1.背景与挖掘目标1.1 传统的防盗泄漏方法主要通过定期检查、定期检查电表、用户报告盗窃等方法发现盗窃或测量装置故障。但该方法过于依赖人,盗窃和泄漏检漏的目标尚不清楚。通过收集电力异常、负荷异常、终端报警、主站报警、线路损坏异常等信息,建立数据分析模型,实时监控泄漏情况,发现测量装置故障。.2 目标总结了漏电用户的关键特征,构建了漏电用户的识别模型。利用实时检测数据,调用漏电用户识别模型进行实时诊断。2.分析方法和过程2.1分析方法窃漏电用户只占电力计量自动化系统监控大用户的一小部分。同时,银行、税务、学校、工商等非居民类别等一些大用户不可能窃漏电。因此,有必要在预处理数据时删除这些类别的用户。系统中的用电负荷不能直接反映用户的窃漏电行为。终端报警中存在许多误报和漏报。因此,有必要进行数据探索和预处理,总结盗漏电用户的行为规律,然后从数据中提取描述盗漏电用户的特征指标。最后,结合历史盗漏电用户信息,整理出识别模型的专家样本数据集,进一步构建分类模型,实现盗漏电用户的自动识别。盗漏电用户识别流程如图6.1所示,主要包括以下步骤。2.2.从电力测量自动化系统和营销系统中选择性地提取部分大用户的电力负荷、终端报警和违约盗窃处罚信息等原始数据。探索和分析样本数据,消除不可能的盗窃行业用户,即白名单用户,并初步检查正常用户和盗窃用户的电力特征。预处理样本数据,包括数据清理、缺失值处理和数据变换。建立一个专家样本集。构建盗窃用户识别模型。在线监控用户电力负荷和终端报警,调用模型实现实时诊断。.3.数据探索分析可使用以下代码Excel直接打开数据集进行绘图分析。
2.3.1 分布分析2.3.2 周期性分析见数据集内容处理缺失值,采用拉格朗日插值法补充值,具体方法如下。
首先,确定原始数据集中的自变量和因变量,取出缺失值前后的五个数据(空值和不存在,删除)为一组,拉格朗日多项差值公式#-*- coding: utf-8 -*-#拉格朗日插值代码import pandas as pd #导入数据分析库Pandasfrom scipy.interpolate import lagrange #导入拉格朗日插值函数inputfile = '/home/kesci/input/date14037/missing_data.xls' #需要使用输入数据路径Excel格式;outputfile = '/home/kesci/work/missing_data_processed.xls' #需要使用输出数据路径Excel格式,这里是科赛,所以当地运营需要修改路径data = pd.read_excel(inputfile,header=None) #读入数据print(data)#自定义列向量插值函数#s为列向量,n为 ** 值的位置,k取前后数据的数量,默认为5def 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)print(data)data.to_excel(outputfile,header=None,index=False) #输出结果 20 2355523555 .8333 324.0343 478.32311 236.2708 325.6379 515.45 ** 2 238.0521 328.0897 517.09093 235.9063 NaN 514.89004 236.7604 268.8324 NaN5 NaN 404.0480 486.09126 237.4167 391.2652 516.23307 238.6563 380.8241 NaN8 237.6042 388.0230 435.3508-数据处理前后- 20 20 23555.833300 324.034300 478.3231001 236.270800 325.637900 515.45 ** 002 238.052100 328.089700 517.0909003 235.906300 203.462116 514.8900004 236.760400 268.832400 493.3525915 237.151181 404.048000 486.0912006 237.416700 391.265200 516.2330007 238.656300 380.824100 493.3423828 237.604200 388.023000 435.3508002.4.3数据变换虽然通过电力计量系统收集的电力和负载可以在一定程度上反映用户泄漏行为的一些规律,但作为构建模型的专家样本,特征不明显,需要重建。根据数据变换,获得新的评价指标来表示泄漏行为的规律,其评价指标系统如图6所示。
通过之前的周期性分析,我们可以发现。漏电用户的用电量将继续下降。然后趋于温和。正常用户总体上处于稳定状态。因此,考虑将一段时间的用电量拟合成一条直线,并判断指标计算的斜率。
2. 线损指标综上所述,指标计算方法,获取数据,详情见数据集model.xls你必须问我如何计算数字。我也很困惑。在学习了数学公式计算方法后,我有机会补充相应的代码。然而,我认为它可以使用excel处理这些数据简单快捷。培训专家样本数据见附件中的样本数据model.xls
2.5模型构建2.5.11漏电用户识别模型11. 数据划分20%作为测试样本,80%作为训练样本,代码如下
2. LM神经网络使用Keras库为我们建立了神经网络模型KM神经网络的输入节点为3,输出节点为1,隐藏节点为10,使用Adam方法求解,使用隐藏层Relu(x)= ** x(x,0)作为激活函数,该函数可以大大提高实验表面模型的准确性。
以下代码需要两三分钟才能运行,运行后得到混淆矩阵图。可以算出,分类精度为(161 58)/(161 58 6 7)=94.4%,正常用户被误判为7/(161 7)=4.2%被误判为正常用户占正常用户的6/(6 58)=9.4%。
#-*- coding: utf-8 -*-import ** tplotlib.pyplot as pltimport pandas as pdfrom random import shuffledef cm_plot(y,yp): from sklearn.metrics import confusion_ ** trix #导入混淆矩阵函数 cm = confusion_ ** trix(y,yp) # 。混淆矩阵import ** tplotlib.pyplot as plt #导入图库 plt. ** tshow(cm,c ** p=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 pltdatafile = '/home/kesci/input/date14037/model.xls'data = pd.read_excel(datafile)data = data.as_ ** trix()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 = '/home/kesci/input/date14037/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=100,batch_size=1) #训练模型,循环1000次,不需要书源代码,这里需要删除class这个值才能正常运行net.save_weights(netfile) #保存模型predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''#导入自行编写的混淆矩阵可视化函数,具体见最上代码 cm_plot(y, yp)def cm_plot(y, yp): from sklearn.metrics import confusion_ ** trix #导入混淆矩阵函数 cm = confusion_ ** trix(y, yp) #混淆矩阵 import ** tplotlib.pyplot as plt #导入作图库 plt. ** tshow(cm, c ** p=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 pltcm_plot(train[:,3], predict_result).show() #显示混淆矩阵可视化结果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() #显示作图结果以下是运行结果,可以在科赛上看训练过程。
模型评价与分析:LM神经网络使用Keras库为我们建立神经网络模型,设定KM神经网络的输入节点数为3,输出节点为1,隐藏节点数为10,使用Adam方法求解,隐藏层使用Relu(x)= ** x(x,0)作为激活函数,实验表面该函数能大幅提高模型的准确率。
以上代码运行需要两三分钟时间,运行完毕后,得到混淆矩阵图。可以算得,分类准确率为(161+58)/(161+58+6+7)=94.4%,正常的用户被误判为窃漏电用户占正常的7/(161+7)=4.2%,窃漏电用户被误判为正常用户占正常用户的6/(6+58)=9.4%。
3. CART决策树算法#-*- coding: utf-8 -*-#构建并测试CART决策树模型import pandas as pd #导入数据分析库from random import shuffle #导入随机函数shuffle,用来打算数据datafile = '/home/kesci/input/date14037/model.xls' #数据名data = pd.read_excel(datafile) #读取数据,数据的前三列是特征,第四列是标签data = data.as_ ** trix() #将表格转换为矩阵shuffle(data) #随机打乱数据p = 0.8 #设置训练数据比例train = data[:int(len(data)*p),:] #前80%为训练集test = data[int(len(data)*p):,:] #后20%为测试集#构建CART决策树模型from sklearn.tree import DecisionTreeClassifier #导入决策树模型treefile = '/home/kesci/work/tree.pkl' #模型输出名字tree = DecisionTreeClassifier() #建立决策树模型tree.fit(train[:,:3], train[:,3]) #训练#保存模型from sklearn.externals import joblibjoblib.dump(tree, treefile)#导入自行编写的混淆矩阵可视化函数def cm_plot(y, yp): from sklearn.metrics import confusion_ ** trix #导入混淆矩阵函数 cm = confusion_ ** trix(y, yp) #混淆矩阵 import ** tplotlib.pyplot as plt #导入作图库 plt. ** tshow(cm, c ** p=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 pltcm_plot(train[:,3], tree.predict(train[:,:3])).show() #显示混淆矩阵可视化结果#注意到Scikit-Learn使用predict方法直接给出预测结果。from sklearn.metrics import roc_curve #导入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() #显示作图结果运行结果如下:
模型评价与分析:分类的准确率为(160+56)/(160+56+3+13)=93.1%,得到的混淆矩阵如上。因为每次随机的样本不同,随意准确率是在一定区间内浮动。
模型对比评价采用OCR曲线评价方法进行评估,一个优秀的分类器所对应的ROC曲线应该是尽量靠近左上角的。
通过对比,可以比较容易得出,LM神经网络的ROC曲线更加符合优秀的定义。说明LM神经网络模型的分类性能较好,能应用于窃漏电用户识别。
3.进行窃漏电诊断在线监测用户用电负荷及终端报警数据,并利用经过2.3节的处理所得到模型,输入在线实时数据,再利用前面代码构建好的窃漏电用户识别模型计算用户的窃漏电诊断结果,实现了窃漏电用户实时诊断。
三、小结了解了数据挖掘算法中LM神经网络和CART决策树算法的实际应用场景但是还未深刻理解,这个两个算法背后原理,往后在学习《数据挖掘导论》时要理解。了解了识别模型优劣中的ROC比较方法,但是应该还会有更好的方式。这个案例,可以类推到汽车相关的偷漏税项目上。但是,自己实战时发现,目标原始数据很难去发现有效指标与建立评价指标,业务的理解转换能力不足目前,还在同步学习秦路的《七周数据分析师》希望能获得一些业务能力,帮助项目进行。扫码咨询与免费使用
申请免费使用