Pyhton数据挖掘-电力窃漏电用户的自动识别

电力窃漏电用户的自动识别的笔记:

目标:

1、归纳漏电用户的关键特征,构建漏电用户的model

2、利用事实监控的数据,懂所有的用户进行实时诊断

注意的点:

1、某一些大用户不可能存在漏电行为,例如银行、学校和工商等。

2、漏电用户的窃电开始时间和结束时间是表征其漏电的关键节点,在这些节点上,用户的用电负荷和终端报警数据会有一定的变化。

样本数据抽取是务必包含一定范围的数据,并通过用户的负荷数据计算出当天的用户的用电量。

数据探索分析:

1、分布分析: 所有漏电用户的分布分析,显示每个类别的漏电用户的分布。

2、周期性分析:随机抽取正常用电用户额窃电用户,采用周期性分析对用电量进行探索。

#-*- conding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

# 正常显示中文和正负号
plt.rcParams["font.serif"] = ["SimHei"]
plt.rcParams[‘axes.unicode_minus‘] = False

normalUser = pd.read_csv("data/normalUser.csv")
unnormalUser = pd.read_csv("data/unnormalUser.csv")

normalUser.plot(title=u"正常用电用户的电量趋势",x=normalUser["日期"],figsize=(8,6))
unnormalUser.plot(title=u"漏电用电用户的电量趋势",x=unnormalUser[‘日期‘],figsize=(8,6))                

plt.show()

数据预处理

1、数据清洗:目的是从业务和建模的相关方面考虑,筛选出需要的数据。

1、通过数据探索发现非居民用电类别中不存在漏电的现象,故将非居民类别过滤掉。

2、结合本案例,节假日用电量与工作相比,明显偏低,为了尽可能达到较好的效果,过滤掉节假日的用电数据

2、缺失值处理

1、缺失值少的情况下,一般情况下不会直接去掉数据,而是对缺失值进行填充,这里选择拉格朗日插值法进行补充。

from scipy.interpolate import lagrange #导入lagrange函数

inputfile = "data/missing_data.xls"
outputfile = "data/missing_data_processed.xls"

data = pd.read_excel(inputfile)

# 自定义列向量差值函数
# s为列向量,n是被插值的位置,k是前后的取的个数 默认是5

def polyinterp_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] = polyinterp_column(data[i],j)

data.to_excel(outputfile,header=None, index=False)

数据变换:

1、电量趋势下降指标: 用电量的趋势

考虑第i天前后5天的用电量的斜率, k[i] = sum[i-5,i+5]{(f-mean(f))(l-mean(l))} / sum[i-5,i+5]{(l-mean(j))^2}

mean(f) = 1/11 sumi-5, i+5 ; mean(l) = 1/11 sumi-5, i+5

如果用电趋势,不断下滑,则认为有窃电嫌疑,计算这11天内的,当天比前一天用电量趋势递减的天数
if(k[i] < k[i-1]) D[i] = 1
else k[i] >= k[i-1] D[i] = 0

T = sum[i-5, i+5](D[j])

2、线损指标: 线损增长率

线损率用来衡量供电线路的损失比例,线损率是总电量s与实际用电量sum(f)的差除以总电量s。

以天为单位进行计算。

t = s / sum(f)

如果用户发生窃电,则当天的线损率会上升,用户每天用电量存在波动,以天为单文,误差较大,

所以考虑前后几天(5天)的线损率的平均值,判断增长率是否大于1%,若大于1%,则认为是窃电。

前5天的线损率平均值V[i1],后5天的平均值v[i2],若v[i1]比v[i2]的增长率大于1%,认为有窃电嫌疑。

if((v[i1] - v[i2]) / v[i2] > 1%) E[i] = 1

else E[i] = 0

3、告警类指标: 与窃电相关的终端告警数

计算发生与漏电相关的报警的总次数。

得到训练的数据。

1、进行模型的构建:

1、数据划分,0.8作为训练集,0.2作为测试集

2、LM神经网络模型:

输入节点:3

输出节点:1

隐藏节点:10

优化函数:Adam

激活函数:Relu(x)

3、CART决策树模型

# 分割数据作为训练数据和测试数据

from random import shuffle # 用来打乱数据

datafile = "data/model.xls"

data = pd.read_excel(datafile)
data = data.as_matrix()

shuffle(data) #打乱数据

p = 0.8 #训练数据的比例
train = data[0:int(len(data)*p)]
test = data[int(len(data)*p):]
# 构建LM神经网络模型
from keras.models import Sequential
from keras.layers import Dense, Activation

modelfile = ‘tmp/net.model‘ #存储训练好的神经网络

model = Sequential() #初始化

model.add(Dense(3,10))

# 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) 

2、模型的评价

采用ROC曲线进行评估,一个优秀的分类器所对应的ROC曲线应该尽量靠近左上角。

# LM神经网络模型的ROC曲线
from sklearn.metrics import roc_curve #导入ROC曲线

predict_result = model.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 LS‘)
plt.xlabel(‘False Position Rate‘)
plt.ylabel(‘True Position Rate‘)

#边界范围
plt.xlim(0,1.05)
plt.ylim(0,1.05)
plt.legend(loc=4)
plt.show()
# 决策树模型的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‘)
plt.xlabel(‘False Position Rate‘)
plt.ylabel(‘True Position Rate‘)

#边界范围
plt.xlim(0,1.05)
plt.ylim(0,1.05)
plt.legend(loc=4)
plt.show()

时间: 2024-10-09 19:44:30

Pyhton数据挖掘-电力窃漏电用户的自动识别的相关文章

[Python数据挖掘]第6章、电力窃漏电用户自动识别

一.背景与挖掘目标 相关背景自查 二.分析方法与过程 1.EDA(探索性数据分析) 1.分布分析 2.周期性分析 2.数据预处理 1.数据清洗 过滤非居民用电数据,过滤节假日用电数据(节假日用电量明显低于工作日)  2.缺失值处理 #拉格朗日插值代码 import pandas as pd #导入数据分析库Pandas from scipy.interpolate import lagrange #导入拉格朗日插值函数 data = pd.read_excel('data/missing_dat

(数据挖掘-入门)基于用户的协同过滤之最近邻

主要内容: 1.什么是基于用户的协同过滤 2.python实现 1.什么是基于用户协同过滤: 协同过滤:Collaborative Filtering,一般用于推荐系统,如京东,亚马逊等电商网站上的“购买该物品的用户还喜欢/购买”之类的栏目都是根据协同过滤推荐出来的. 基于用户的协同过滤:User-based CF,通过不同用户对item(物品)的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐. 这里介绍一种最简单的过滤方法:最近邻,即找到与某用户最相似的用户,将该用户喜欢的物品(而某

【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识

前面几篇文章采用的案例的方法进行介绍的,这篇文章主要介绍Python常用的扩展包,同时结合数据挖掘相关知识介绍该包具体的用法,主要介绍Numpy.Pandas和Matplotlib三个包.目录:        一.Python常用扩展包        二.Numpy科学计算包        三.Pandas数据分析包        四.Matplotlib绘图包 前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.K

顶尖数据挖掘教学案例库(TipDM-C10)产品白皮书

      顶尖数据挖掘教学案例库 (TipDM-C10)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: http://www.tipdm.com 邮箱: [email protected] 热线: 40068-40020 企业QQ:40068-40020 邮编: 510663 电话: (020)82039399 目  录 1                     概述..................

文章集合--作者篇--下【转】

强哥: 50行代码实现人脸检测 基于face_recognition实现人脸识别 Python 2与Python 3的区别 Python也能聊微信   射命丸咲: Python · 神经网络(零)· 简介 第一个机器学习样例 Python:numba 的基本应用 Kenny: 挑战年薪百万-自然语言处理入门一 四毛: 免登录新浪微博爬虫系列之第一篇 单博主微博及评论数据 免登录新浪微博爬虫系列之第二篇 获取关注用户数据,实现递增爬取 获取知乎问题答案并转换为MarkDown文件 Genius:

顶尖数据挖掘开发平台(TipDM-D2)产品白皮书

      顶尖数据挖掘开发平台 (TipDM-D2)           产  品  白  皮  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: http://www.tipdm.com 邮箱: [email protected] 热线: 40068-40020 邮编: 510663 电话: (020)82039399 目  录 第1章 引言.......................................................

数据分析与数据挖掘概述

1.什么是数据分析与数据挖掘技术? 所谓数据分析,即对已知的数据进行分析,然后提出一些有价值的信息.比如统计出平均数.标准差等信息,数据分析的数据量有可能不会太大.而数据挖掘,是指对大量的数据进行分析和挖掘,得到一些未知的有价值的信息等,比如从网站的用户或用户行为数据中挖掘出潜在需求信息,从而对网站进行改善等.数据分析与数据挖掘密不可分,数据挖掘是数据分析的提升. 2.数据分析与挖掘技术能做什么事情? 数据挖掘技术能够帮助我们更好的发现事物之间的规律.所以,我们可以利用数据挖掘技术实现数据规律的

7款优秀的开源数据挖掘工具

7款优秀的开源数据挖掘工具 IDMer说道:本文只对几种流行的开源数据挖掘平台进行了检视,比如Weka和R等.如果您想找寻更多的开源数据挖掘软件,可以到KDnuggets和Open Directory上查看.为了评测这些软件,我们用了UCI Machine Learning Repository上的心脏病诊断数据集. Tanagra Tanagra (http://eric.univ-lyon2.fr/wricco/tanagra/) 是使用图形界面的数据挖掘软件,采用了类似Windows资源管

数据挖掘学习笔记一:引论

数据挖掘(又称从数据中发现知识,KDD) 例1.1 数据挖掘把大型数据集转换成知识.Google的Flu Trends(流感趋势)使用特殊的搜索项作为流感活动的指示器.它发现了搜索流感相关信息的人数与实际具有流感症状的人数之间的紧密联系.当与流感相关的所有搜索都聚集在一起时,一个模式就出现了.使用聚集的搜索数据,Google的Flu Trends可以比传统的系统早两周对流感活动作出评估. 数据挖掘 == 数据中的知识发现.只是发现的过程由一下步骤的迭代序列组成: 数据清理(消除噪声和删除不一致数