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

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

取自《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)#画混淆矩阵图,配色使用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 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()  # 显示作图结果
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值