学习笔记:【案例】电力窃漏用户自动识别

案例来源:《Python数据分析与挖掘实战》第6章

案例背景与挖掘目标

提取窃漏电用户的关键特征,构建窃漏电用户的识别模型,自动检查、判断用户是否存在窃漏电行为。
输入数据:
用电负荷数据
终端报警信息
违约、窃电处理通知书
挖掘目标:

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

分析方法与过程(选择的原则)

数据预处理时的考虑

  1. 剔除大用户,如银行、税务、学校和工商等非居民类别的数据
  2. 进行数据探索和预处理,总结窃漏电用户的行为规律
  3. 从数据中提炼出描述窃漏电用户的特征指标

子任务规划

  1. 有选择性地抽取数据
  2. 数据探索分析,剔除白名单用户,初步审视正常用户与窃漏电用户的用电特征
  3. 数据预处理:数据清洗,缺失值处理,数据变换
  4. 构建专家样本集(有人工标注的“是否窃漏电用户”数据)
  5. 构建窃漏电用户识别模型
  6. 在线监测,调用模型实现实时诊断

实验一

#实验一
#完成缺失数据的插值操作

import os
import pandas as pd
from scipy.interpolate import lagrange

## 输入数据文件完整路径,输出describe
def data_read(dtpath):
    dttype = os.path.splitext(dtpath)
    if dttype[1] == '.xls':
        data = pd.read_excel(dtpath)
    ##desc = data.describe()
    return data # as dataframe

## plot in lagrange value for missing data
def plotinterp_col(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)

def plotinterp_col_n(s, n, k=5):
    y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
    y = y[y.notnull()]
    return pd.Series.interpolate(y.index, list(y))(n)

input_data = data_read('../data/missing_data.xls')
output_data = '../data/fixed.xls'

for i in input_data.columns:
    for j in range(len(input_data)):
        if (input_data[i].isnull())[j]:
            input_data[i][j] = plotinterp_col(input_data[i], j, 20)

input_data.to_excel(output_data)

## 测试使用pandas的interpolate函数进行插值处理,对比两者差异
input_data2 = data_read('../data/missing_data.xls')
output_data2 = '../data/fixed2.xls'

for i in input_data2.columns:
    ##for j in range(len(input_data2)):
    ##if (input_data2[i].isnull()):
    s = pd.Series(input_data2[i])
    input_data2[i] = s.interpolate()

input_data2.to_excel(output_data2)

实验二

## 实验二
## 1、读取数据
## 2、随机分成两部分,80%训练,20%测试
## 3、决策树模型训练及测试
## 4、LM神经网络模型训练及测试
## 5、对比结果交叉验证
import os
import pandas as pd
from random import shuffle
## 输入数据文件完整路径,输出describe
def data_read(dtpath):
    dttype = os.path.splitext(dtpath)
    if dttype[1] == '.xls':
        data = pd.read_excel(dtpath)
    ##desc = data.describe()
    return data # as dataframe

input_data = data_read('../data/model.xls')
input_data = input_data.as_matrix()
shuffle(input_data)

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

## 决策树模型

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)

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(train[:,3], tree.predict(train[:,:3]))
print(cm)

#[[152   7]
#[  7  66]]

# 总体正确率 = (152 + 66) / 232 = 93.97%
# 遗漏窃漏电用户 = 7 / 66 = 9.59%
# 因遗漏检测可能导致的问题更大,故提取以上指标


## LM神经网络模型

from keras.models import Sequential
from keras.layers.core import Dense, Activation

netfile = '../tmp/net.model'

net = Sequential()
net.add(Dense(input_dim=3, output_dim=10))
net.add(Activation('relu'))
net.add(Dense(input_dim=10, output_dim=1))
net.add(Activation('sigmoid'))
net.compile(loss = 'binary_crossentropy', optimizer='adam')

net.fit(train[:,:3], train[:,3], nb_epoch=1000, batch_size=1)
net.save_weights(netfile)

predict_result = net.predict_classes(train[:,:3]).reshape(len(train))
cm_lm = confusion_matrix(train[:,3], predict_result)
print(cm_lm)
#[[140  15]
# [ 16  61]]

# 总体正确率 = (140 + 61) / 232 = 86.64%
# 遗漏窃漏电用户 = 16 / 61 = 20.78%
# 因遗漏检测可能导致的问题更大,故提取以上指标

# Results
# 使用决策树模型的效果更佳
posted @ 2018-08-07 18:14  极客W先森  阅读(1003)  评论(0编辑  收藏  举报