学习笔记:【案例】电力窃漏用户自动识别
案例来源:《Python数据分析与挖掘实战》第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
# 使用决策树模型的效果更佳
欢迎密切关注微信公众号:【mindhackerw】