《Python数据分析与挖掘实战》学习笔记——电力漏窃电用户自动识别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29132713/article/details/89396822

目标

通过电力计量自动化系统采集到的各相电流、电压、功率因数等用电负荷数据及用电异常等终端报警信息,和在线稽查系统和现场稽查的记录的漏窃电用户信息

  • 提取漏窃电用户的关键特征,构建识别模型。
  • 利用实时监测数据,调用模型判断用户是否存在漏窃电行为。

分析

1. 数据抽取

  1. 营销系统数据
    用户基本信息、违约窃电记录、计量方法
  2. 计量自动化系统采集的数据
    1. 实时负荷:时间点、计量点、总有功功率、A/B/C相用功功率、A/B/C相电流、A/B/C相电压、A/B/C相功率因数
    2. 终端报警

需要包含不同用电类别的所有漏窃电用户和部分正常用户。样本数据需要包含关键时间节点前后一定范围的数据,并计算用户当天的用电量。

2.探索分析

  1. 分布分析
    统计各个用电类别的漏窃电用户分布情况,结论:非居民不存在漏窃电。
  2. 周期性分析
    结论:正常用户周期内用量平稳,非正常用户用电量明显持续下降。

3.预处理

  1. 数据清洗——》过滤非居民和节假日用电数据。
  2. 缺失值处理——》拉格朗日差值对用电量插补
    import pandas as pd
    from scipy.interpolate import lagrange
    
    inputfile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/missing_data.xls"
    outputfile = r'tmp/missing_data_processed.xls'
    
    data = pd.read_excel(inputfile, header=None)
    
    def 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)
    
    data.to_excel(outputfile, header=None, index=False)
    
    插值前:
    在这里插入图片描述
    插值后:
    在这里插入图片描述
    1. 数据变换
      定义新的指标
      (1)电量趋势下降指标 (2)线损指标 (3)告警类指标
      这里作者通过对原始数据的公式计算,构建了新的指标,新指标均为整数,不明白怎样应该构建指标(根据经验?)及验证构建出的指标的有效性

4.构建专家样本

根据新定义的指标对原始数据处理,得到专家样本数据291个
电量趋势下降指标、线损指标、告警类指标、是否窃漏电
在这里插入图片描述

4.模型构建

数据划分:20%测试样本,80%训练样本

from random import shuffle
datafile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/model.xls"
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)

p = 0.8
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]
  1. 构建模型
    1) LM神经网络
    在window下配置keras库出现各种bug,待尝试在centos下部署python开发环境
    2) CART决策树
from sklearn.tree import DecisionTreeClassifier
from random import shuffle

def cm_plot(y, yp):
   from sklearn.metrics import confusion_matrix

   cm = confusion_matrix(y, yp)

   import matplotlib.pyplot as plt
   plt.matshow(cm, cmap=plt.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

datafile = r"F:/jpt_f/python_data_analysis_all/chapter6/data/model.xls"
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)

p = 0.8
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]

tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])
joblib.dump(tree, 'my_tmp/tree.pkl')
cm_plot(train[:, 3], tree.predict(train[:,:3])).show()

这里,多次测试得到的结果会有变化。
在这里插入图片描述

  1. 模型评价
    LM神经网络待完善
    CART决策树的ROC模型
from sklearn.metrics import roc_curve
fpr, tpr, threshold = roc_curve(test[:, 3], tree.predict_proba(test[:, :3])[:, 1],
                                pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label='ROC OF CART')
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()

ROC OF CART
这里同样多次运行会有不同结果,如何判断LM神经网络效果一定比决策树效果好?

  1. 进行窃漏电诊断
    通过以上的处理,得到模型输入数据,识别用户的窃漏电诊断结果。下一步针对漏判用户,研究其行为优化模型特征。
    这里不明白怎样导入模型数据进行诊断和如何优化模型(先看下几章有没有讲解)
展开阅读全文

没有更多推荐了,返回首页