实战一、电力窃漏用户自动识别

2019-04-13 20:35发布

实战一、电力窃漏用户自动识别

取自《Python数据分析与挖掘实战》一书
学会绘制混淆矩阵图、ROC图、使用LM神经网络预测,决策树预测,拉格朗日插值法,下降趋势指标。

一、数据抽取

主要有用电负荷数据、终端报警数据、违约窃电处罚信息以及用户档案资料等。

二、数据探索分析

1、数据的分布分析

查看用电类别切漏电情况,明确哪一些人群、领域窃漏电情况严重。

2、周期性分析

正常用电量周期性用量平稳,没有太大波动;窃漏电用户用电量出现明显下降的趋势

3、数据预处理

从原始用户电量数据抽取,发现存在缺失现象,因此用到拉格朗日插值法对缺失值进行插补!

拉格朗日插值法:
确定因变量、自变量;取出缺失值前后5个数据,去除空值,取10个数据组成一组。采用拉格朗日插值公式
Ln(x)=∑(i:0~n)li(x)yi
li(x)=Ⅱ(j:0-n;j!=i)(x-xj)/(xi-xj)
x为缺失值下标序号;Ln(x)为缺失值插值结果,xi为非缺失值yi的下表。

直到不存在缺失值为止 def lagInterploation(data_col, j, n=5): dataList = data_col[list(range(j - n, j)) + list(range(j + 1, j + n + 1))] dataList = dataList[dataList.notnull()] return lagrange(dataList.index, list(dataList))(j) #寻找缺失值,执行拉格朗日插值公式 for i in data.columns: for j in range(len(data)): if (data[i].isnull())[j]: data[i][j] = lagInterploation(data[i], j) 传入该列数据,获取该列非空前后10个数据;
lagrange(x,w) x数据点的x轴,传入的是数据的下标索引;w是传入的数据。
例如:dataList=
0 235.8333
1 236.2708
2 238.0521
3 235.9063
4 236.7604
6 237.4167
7 238.6563
8 237.6042
9 238.0313
10 235.0729
Name: 0, dtype: float64
传入的索引里是不含缺失值下标的!!最后获取(j)位置处的值,即是插值

4、数据变换

基于系统采集到的一些数据,来重新构造,进行数据变换得到新的评价指标来表征窃漏电行为所具有的规律。
  1. 电量趋势下降指标:电量趋势不断下降,则认为具有窃电嫌疑
  2. 线损指标:若发生窃漏电,线损率会上升。是否1%
  3. 告警类指标:电压缺相,电流反极性等

5、构建专家样本

所有窃漏电用户和正常用户的电量、告警及线损数据和该用户在当天是否标识。按窃漏电评价指标进行处理,选取样本,得到专家样本库。
时间–用户编号–电量趋势下降指标–线损指标–告警类指标–是否窃漏电

6、模型构建

数据划分–80%训练集,20%测试集

使用LM神经网络进行预测

神经网络:3–10–1 两层,使用Adam方法求解。隐藏层激活函数Relu(x)=max(x,0) #特别注意keras版本和底层tensorflow的版本问题,导致代码不匹配。keras2.0.9,tensorflow-1.2.1 net = Sequential() # 建立神经网络 net.add(Dense(input_dim=3, activation='relu', units=10)) # 输入3---隐藏10 net.add(Dense(input_dim=10, activation='sigmoid', units=1)) #隐藏10---输出1 net.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 编译模型,使用adam方法求解;因版本不同,修改。与原代码不同 net.fit(train[:, :3], train[:, 3], epochs=1000, batch_size=1) # 训练模型 net.save_weights(netfile) # 保存模型 predict_result = net.predict_classes(train[:, :3]).reshape(len(train)) # 获取预测结果 keras用predict给出预测概率;predict_classes才是给出预测类别。预测结果都是[n,1]维数组!
CART决策树用predict给出预测的类别!

使用CART决策树进行预测

#构建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)#保存模型 plt=cm_plot(test[:,3], tree.predict(test[:,:3]))#将测试集输入到模型中 plt.show() #显示混淆矩阵可视化结果 #注意到Scikit-Learn使用predict方法直接给出预测结果。

7、模型评估

评估模型分类的性能,利用测试样本对模型进行评价,采用ROC曲线评价方法进行评估。
分类器越优秀,其ROC曲线应该尽可能的靠近左上角!

混淆矩阵绘图

# 编写的混淆矩阵的可视化函数 #y:测试集实际的类别 yp:测试集的测试结果 def cm_plot(y, yp): from sklearn.metrics import confusion_matrix # 导入混淆矩阵函数 cm = confusion_matrix(y, yp) # 混淆矩阵 #[[39 8] # [ 1 11]] import matplotlib.pyplot as plt # 导入作图库 plt.matshow(cm, cmap=plt.cm.Greens)#画混淆矩阵图,配 {MOD}使用cm.Greens。 plt.colorbar() # 颜 {MOD}标签 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 plt

ROC曲线

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