案例来自《python数据分析与挖掘实战》

背景

需求:防用户窃漏电

传统方法:定期巡检、定期校验电表、用户举报窃电、计量装置故障
缺陷:对人的依赖性太强,抓窃查漏的目标不明确。

当前方法:采集电量异常、负荷异常、终端报警、线损异常等信息,建立数据分析模型。根据有关的电流、电压、负荷数据情况,构建加权的用电异常分析模型,检查客户窃漏电情况。 
缺陷:由于终端误报或漏报过 多,无法快速精确定位窃漏电嫌疑用户。建模时,模型各输入指标权重确定需要用专家的经验,有很大的主观性,实施效果不尽如人意。

目标:将终端报警信息、用电负荷数据,结合窃漏电用户,提取出窃漏电用户的关键特征,构建窃漏电用户的识别模型,自动检查判断用户是否存在窃漏电行为

数据分析

已知数据

某企业大用户用电负荷数据

某企业大用户终端报警信息

某企业大用户违约、窃电处理通知书(此处省略)

建模目标

  1. 归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型;
  2. 利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。

建模步骤

  1. 从系统中抽取有监督数据(用户用电负荷、报警、违约处罚) :营销系统的用户基本信息、用电信息、窃漏电触发记录;计量信息系统的用电负荷、报警信息;在窃漏电开始和结束时间点的数据最能突出变化,因此要包含该时间点前后的数据,窃漏电开始时用户用电量往往会下降。
  2. 剔除白名单用户(不可能存在窃漏电行为):根据不同行业的窃漏电用户数,剔除没有数据的行业的样本
  3. 预处理,包括数据清洗、缺失值处理和数据变换; 本案例节假日用电量会比工作日小,可以过滤节假日数据;有数据缺失的特征,当缺失不多时,用拉格朗日插值法填充;仅根据用电量下降(斜率)判断窃漏电不充分,结合线损指标(窃漏电线损率上升,增长率)和告警(窃漏电相关告警次数)判断。
  4. 构建专家样本集:根据用电量下降斜率、线损增长速率、告警次数的特征,结合是否窃漏电构建样本
  5. 构建窃漏电用户识别模型: LM 神经网络、CART 决策树
  6. 在线监测用户用电负荷及终端报警,调用模型实现实时诊断。

准备工作

数据集下载:python_data_analysis_and_mining_action

代码练习平台:google colab

上传数据到google colab

from google.colab import files
files.upload()

或者直接将数据集导入到 colab中来:github数据导入colab

数据缺失值处理

#-*- coding: utf-8 -*-
# 拉格朗日插值代码
import pandas as pd
from scipy.interpolate import lagrangeinputfile = 'data/missing_data.xls'
outputfile = 'tmp/missing_data_processed.xls'data = pd.read_excel(inputfile, header=None)  # 读入数据# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
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)

3、将数据划分为训练集与测试集

# -*- coding: utf-8 -*-import pandas as pd
from random import shuffledatafile = 'data/model.xls'
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)  # 随机打乱数据# 设置训练数据比8:2
p = 0.8
train = data[:int(len(data) * p), :]
test = data[int(len(data) * p):, :]

定义混淆矩阵可视化函数:

def cm_plot(y, yp):cm = confusion_matrix(y, yp)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

4、构建LM神经网络模型

# -*- coding: utf-8 -*-from keras.layers.core import Activation, Dense
from keras.models import Sequential# 构建LM神经网络模型
netfile = 'tmp/net.model'net = Sequential()  # 建立神经网络
#    net.add(Dense(input_dim = 3, units = 10))
# 添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Dense(10, input_shape=(3, )))
net.add(Activation('relu'))  # 隐藏层使用relu激活函数
#    net.add(Dense(input_dim = 10, units = 1))
#添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Dense(1, input_shape=(10, )))
net.add(Activation('sigmoid'))  # 输出层使用sigmoid激活函数
net.compile(loss='binary_crossentropy',optimizer='adam',sample_weight_mode="binary")  # 编译模型,使用adam方法求解net.fit(train[:, :3], train[:, 3], epochs=100, batch_size=1)
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(train[:, 3], predict_result).show()

5、构建CART决策树模型

from sklearn.tree import DecisionTreeClassifier# 构建CART决策树模型
treefile = 'tmp/tree.pkl'
tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])joblib.dump(tree, treefile)cm_plot(train[:, 3], tree.predict(train[:, :3])).show()  # 显示混淆矩阵可视化结果
# 注意到Scikit-Learn使用predict方法直接给出预测结果。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')
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()
print(thresholds)

完整代码如下:

#-*- coding: utf-8 -*-
# pylint: disable=E1101
from random import shuffleimport matplotlib.pyplot as plt
import pandas as pd
from keras.layers.core import Activation, Dense
from keras.models import Sequential
from scipy.interpolate import lagrange
from sklearn.externals import joblib
from sklearn.metrics import confusion_matrix, roc_curve
from sklearn.tree import DecisionTreeClassifier
"""
cm_plot-->自定义混淆矩阵可视化
programmer_1-->使用拉格朗日插值法进行插值
programmer_2-->构建CART决策树模型,进行预测给出训练结果,并且绘制ROC曲线
programmer_3-->使用神经网络模型,进行预测给出训练结果,并且绘制ROC曲线
"""def cm_plot(y, yp):cm = confusion_matrix(y, yp)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 pltdef programmer_1():inputfile = 'data/missing_data.xls'outputfile = 'tmp/missing_data_processed.xls'data = pd.read_excel(inputfile, header=None)  # 读入数据# 自定义列向量插值函数# 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)data.to_excel(outputfile, header=None, index=False)def programmer_2():datafile = 'data/model.xls'data = pd.read_excel(datafile)data = data.as_matrix()shuffle(data)  # 随机打乱数据# 设置训练数据比8:2p = 0.8train = data[:int(len(data) * p), :]test = data[int(len(data) * p):, :]# 构建CART决策树模型treefile = 'tmp/tree.pkl'tree = DecisionTreeClassifier()tree.fit(train[:, :3], train[:, 3])joblib.dump(tree, treefile)cm_plot(train[:, 3], tree.predict(train[:, :3])).show()  # 显示混淆矩阵可视化结果# 注意到Scikit-Learn使用predict方法直接给出预测结果。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')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()print(thresholds)def programmer_3():datafile = 'data/model.xls'data = pd.read_excel(datafile)data = data.as_matrix()shuffle(data)p = 0.8train = data[:int(len(data) * p), :]test = data[int(len(data) * p):, :]# 构建LM神经网络模型netfile = 'tmp/net.model'net = Sequential()  # 建立神经网络#    net.add(Dense(input_dim = 3, units = 10))# 添加输入层(3节点)到隐藏层(10节点)的连接net.add(Dense(10, input_shape=(3, )))net.add(Activation('relu'))  # 隐藏层使用relu激活函数#    net.add(Dense(input_dim = 10, units = 1))#添加隐藏层(10节点)到输出层(1节点)的连接net.add(Dense(1, input_shape=(10, )))net.add(Activation('sigmoid'))  # 输出层使用sigmoid激活函数net.compile(loss='binary_crossentropy',optimizer='adam',sample_weight_mode="binary")  # 编译模型,使用adam方法求解net.fit(train[:, :3], train[:, 3], epochs=100, batch_size=1)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(train[:, 3], predict_result).show()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')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()print(thresholds)if __name__ == "__main__":programmer_1()programmer_2()programmer_3()

扩展应用

问题:汽车销售行业存在少开发票、少计收入、不及时确认保修索赔款等偷漏税行为

目标:对汽车销售业纳税人属性建模,识别偷漏税的人

参考:数据挖掘实战:汽车销售业偷漏税识别

参考:

Python数据挖掘—电力窃漏电用户自动识别

python数据分析与挖掘实战

部分问题解决参考:
https://blog.csdn.net/braveheartm/article/details/81591833

数据挖掘实战:电力窃漏电用户自动识别相关推荐

  1. Python 数据挖掘之电力窃漏电用户自动识别

    Python 数据挖掘之电力窃漏电用户自动识别 综述 拉格朗日插值 决策树模型 LM神经网络模型 结果 决策树模型结果图 LM神经网络模型结果图 综述 对电力公司数据进行挖掘分析,首先使用拉格朗日插值 ...

  2. 数据挖掘I 电力窃漏电用户自动识别

    一.项目背景 传统的防漏电窃电方法主要通过定期巡检.定期校验电表.用户举报窃电等方法来发现窃电或者计量装置故障,对人的依赖性比较强,抓窃查漏的目标不明确. 供电局相关人员利用相关数据构建的基于指标加权 ...

  3. 数据挖掘项目---电力窃漏电用户自动识别

    1.挖掘目标 1) 归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型 2) 利用实时监测数据,调用窃漏电用户识别模型,实现实时诊断 2.分析方法与过程 1) 从电力计量自动化系统.营销系统有选择性 ...

  4. 二十六、数据挖掘电力窃漏电用户自动识别

    电力窃漏电用户自动识别 1. 综合案例数据预处理 电力窃漏电用户自动识别的内容 背景与挖掘目标 分析方法与过程 数据探索性分析 综合案例的目标 通过综合案例分析了解数据挖掘的整体流 掌握使用sklea ...

  5. matlab fitctree 原理,电力窃漏电用户自动识别.PDF

    电力窃漏电用户自动识别 <MATLAB 数据分析与挖掘实战>第 6 章 第6章 电力窃漏电用户 自动识别 6.1背景与挖掘目标 传统的防窃漏电方法主要通过定期巡检.定期校验电表.用户举报窃 ...

  6. 电力窃漏电用户自动识别的实验报告

    电力窃漏电用户自动识别实验报告 提示 参考书:张良均<Python数据分析与挖掘实战>等. 数据文件:课本自带数据. 使用软件:Pycharm. 类别:实验. 关键字:拉格朗日插值法.CA ...

  7. 收藏:电力窃漏电用户自动识别,可视化全流程这样操作~

    过去,大多数的防窃漏电方法主要是通过利用定期的检查.电表校验以及用户自主报告偷盗等手段,去发掘窃电或测量装置故障.不过上述方法的一个弊端是,对人的依赖性太强,且抓窃查漏的目标不甚明确. 目前,许多供电 ...

  8. 【数据挖掘实战】——电力窃漏电用户自动识别(LM神经网络和决策树)

    目录 一.背景和挖掘目标 二.分析方法与过程 1.初步分析 2.数据抽取 3.探索分析 4.数据预处理 5.构建专家样本 三.构建模型 1.构建窃漏电用户识别模型 2.模型评价 3.进行窃漏电诊断 拓 ...

  9. 数据分析系列之电力窃漏电用户自动识别

      在线监测用户用电负荷数据,经过数据预处理,得到模型输入数据,利用构建好的识别模型计算用户窃漏电诊断结果,实现窃漏电用户的实时诊断,并与实际稽查结果对比 背景与挖掘目标   传统的防窃漏电方法主要是 ...

最新文章

  1. cenots6 系统服务优化
  2. python中矩阵拼接_numpy实现合并多维矩阵、list的扩展方法
  3. 从Zero到Hero,一文掌握Python关键代码
  4. geany搭建python环境_第一章:搭建Python的开发环境
  5. linux 搭建gradle android jenkins打包机器,gradle 依赖 jar问题
  6. python计算PR曲线sklearn.metrics.precision_recall_curve
  7. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形
  8. 解决浏览器跨域加载本地文件报错 Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy
  9. 腾讯安全发布十大产业互联网安全议题:聚焦5G、数据加密等
  10. Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
  11. 预训练模型的技术演进:乘风破浪的PTM
  12. vue二维码生成与图片下载
  13. NC18979 毒瘤xor
  14. 【ACWing】3626. 三元一次方程
  15. 使用jquery.validate.js,当onfocusout: true,同时focus验证失败元素时会导致$(#form).valid()总是返回true?...
  16. MYSQL事务原理分析
  17. Python操作Excel的Xlwings教程(五)
  18. Java直接内存回收
  19. 自动驾驶学习过程(Apollo)
  20. 燕山大学高数AⅡ资料

热门文章

  1. 【RocketMQ】Broker服务注册
  2. Openwrt DHCP服务设置其他IP做网关
  3. cuppy的用户pp:1234无法登陆的原因
  4. WalkRE--套图流程
  5. BMP文件格式分析(zz)
  6. Qt 集成miniblink浏览器库之1编译使用
  7. APIJSON(一:综述)
  8. 基于MATLAB的飞蛾扑火算法在多目标优化问题中的应用
  9. python psutil 简介
  10. nodejs+vue+elementui高校毕业生离校管理系统java-python-php