数据分析与挖掘:电力窃漏电用户自动识别

该博客介绍了电力窃漏电用户识别项目,通过拉格朗日插值法处理缺失值,提取电量趋势下降、线损和告警类指标作为特征。构建了LM神经网络和CART决策树模型,模型评估显示CART决策树表现更优,达到94.8%的分类准确率。此外,还探讨了模型在汽车销售行业偷漏税识别的应用。
摘要由CSDN通过智能技术生成

1. 背景与挖掘目标:

  • 项目为《Python 数据分析与挖掘实战》第 6 章:电力窃漏电用户自动识别。
  • 挖掘目标为根据用电记录原始数据,归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型。从而可以利用实时检测数据,调用窃漏电用户识别模型实现实时诊断

2. 分析方法与过程:

  • 主要步骤:
    • 数据预处理
    • 提取特征指标
    • 建立模型

2.1 缺失值处理

  • 原始数据中有很多缺失现象,如下采用拉格朗日差值法对缺失值进行插补:
'''拉格朗日插值'''
import pandas as pd
from scipy.interpolate import lagrange

inputfile = 'chapter6/test/data/missing_data.xls'
outputfile = 'chapter6/test/tmp/missing_data_processed.xls'

data = pd.read_excel(inputfile,header=None)

# 自定义插值函数
def ployinterp_column(series, n, k=5):
    y = series[list(range(n-k, n)) + list(range(n+1, n+k+1))]    # 取 n 的前 5 个数和后 5 个数
    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)

2.2 提取特征指标

  • 由于书中并未提供完整的原始数据,因此直接使用书中给出的数据变换后的专家样本数据进行模型构建。
  • 数据转换的核心思想如下:
  1. 电量趋势下降指标:使用前后几天作为窗口期,统计窗口期间的下降趋势,利用用电量做直线拟合,如果斜率随时间不断下降,那用户的窃漏电嫌疑很大。因此电量趋势下降指标为 11 天窗口期内当天比前一天用电量趋势为递减的天数。
  2. 线损指标:窃漏电用户的线损率一般会明显上升,因此线损指标为后 5 天线损率平均值与前 5 天线损率平均值比较,增长率大于 1% 则为 1,小于 1% 则为 0。
  3. 告警类指标:与窃漏电相关的终端报警次数总和。

2.3 模型构建

  • 构建窃漏电用户识别模型:分别构建 LM 神经网络和 CART 决策树
  1. 数据划分:抽取 20% 为测试样本,80% 为训练样本
'''原始数据分为训练数据和测试数据'''
from random import shuffle

datafile = 'chapter6/test/data/model.xls'
data = pd.read_excel(datafile)
data = data.values
shuffle(data)

p = 0.8
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]
  1. LM 神经网络:输入节点数为 3,输出节点数为 1,隐层节点数为 10,使用 Adam 方法求解。分类准确率为 (162 + 56) / (162 + 56 + 7 + 7) = 94.0%
'''LM 神经网络'''
from keras.models import Sequential
from keras.layers.core import Dense, Activation

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

net = Sequential()
net.add(Dense(input_dim=3, units=10))
net.add(Activation('relu'))
net.add(Dense(input_dim=10, units=1))
net.add(Activation('sigmoid'))
net.compile(loss = 'binary_crossentropy', optimizer='adam')
net.fit(train[:,:3], train[:,3], epochs=1000, batch_size=1)
net.save_weights(netfile)

predict_result = net.predict_classes(train[:, :3]).reshape(len(train))

from cm_plot import *    # 混淆矩阵图模块为随书附带的
%matplotlib notebook
cm_plot(train[:,3], predict_result).show()

LM神经网络

  1. CART 决策树:分类准确率为 (156 + 64) / (156 + 64 + 7 + 5) = 94.8%
'''CART决策树'''
from sklearn.tree import DecisionTreeClassifier

treefile = 'chapter6/test/tmp/tree.pkl'
tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])

from sklearn.externals import joblib
joblib.dump(tree, treefile)

from cm_plot import *
cm_plot(train[:,3], tree.predict(train[:, :3])).show()

CART决策树

  • 模型评价:ROC 曲线,CART 决策树较 LM 神经网络好(书中为 LM 神经网络较好,推测为数据抽取时随机打乱了的原因)
'''ROC曲线'''
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt

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')
fpr2, tpr2, thresholds2 = roc_curve(test[:,3], tree.predict_proba(test[:, :3])[:, 1], pos_label=1)
plt.plot(fpr2, tpr2, linewidth=2, label='ROC of CART', c='r')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.xlim(0, 1.05)
plt.ylim(0, 1.05)
plt.legend(loc=4)
plt.show()

ROC

3. 拓展思考

  • 汽车销售行业偷漏税识别
  1. 读取数据
inputfile = 'chapter6/拓展思考/拓展思考样本数据.xls'
data = pd.read_excel(inputfile)
data.head()
纳税人编号销售类型销售模式汽车销售平均毛利维修毛利企业维修收入占销售收入比重增值税税负存货周转率成本费用利润率整体理论税负整体税负控制数办牌率单台办牌手续费收入代办保险率保费返还率输出
01国产轿车4S店0.06350.32410.08790.00848.52410.00180.01660.01470.40000.020.71550.1500正常
12国产轿车4S店0.05200.25770.13940.02985.2782-0.00130.00320.01370.33070.020.26970.1367正常
23国产轿车4S店0.01730.19650.10250.006719.83560.00140.00800.00610.22560.020.24450.1301正常
34国产轿车一级代理商0.05010.00000.00000.00001.0673-0.3596-0.16730.00000.00000.000.00000.0000异常
45进口轿车4S店0.05640.00340.00660.001712.8470-0.00140.01230.00950.00390.080.01170.1872正常
  1. 数据探索
'''定义分类计算正常率函数'''
def get_rate(data, col):
    table = data.pivot_table('纳税人编号', index=col, columns=['输出'], aggfunc='count')
    table['rate'] = table['正常'] / table.sum(1)
    table = table.sort_values(by='rate', ascending=False)
    return table
  • 销售类型分类:可见商用型(客车、货车等)正常率较低
get_rate(data,'销售类型')
输出异常正常rate
销售类型
进口轿车5120.705882
国产轿车22420.656250
其它460.600000
工程车110.500000
微型面包车330.500000
卡车及轻卡430.428571
商用货车320.400000
大客车1120.153846
  • 销售模式分类:可见代理商正常率较低
get_rate(data,'销售模式')
输出异常正常rate
销售模式
4S店20560.736842
多品牌经营店340.571429
其它320.400000
一级代理商1460.300000
二级及二级以下代理商1330.187500
  • 计算各指标正常与异常平均差值比例,并降序排列,取前三大指标进行建模
def get_mean(data, col):
    return data.groupby('输出').mean()[col]
mean = get_mean(data, data.columns[3:-1])
(mean.diff().abs() / mean.loc['正常',:]).dropna().T.sort_values(by='正常', ascending=False)
输出正常
维修毛利1.149654
整体税负控制数0.908304
汽车销售平均毛利0.904309
代办保险率0.687667
保费返还率0.651494
企业维修收入占销售收入比重0.505450
整体理论税负0.269718
存货周转率0.147804
办牌率0.113657
增值税税负0.046442
成本费用利润率0.031140
单台办牌手续费收入0.024349
  1. 建立模型
  • 选择数据
'''选择维修毛利、整体税负控制数、汽车销售平均毛利三个指标进行建模'''
# 选择数据
chosen = data[['维修毛利', '整体税负控制数', '汽车销售平均毛利', '输出']]
chosen.loc[:, '输出'] = pd.get_dummies(chosen.loc[:, '输出'])['异常']    # 0为正常,1为异常
chosen_data = chosen.values
shuffle(chosen_data)

p = 0.8
train = chosen_data[:int(len(chosen_data * p)), :]
test = chosen_data[int(len(chosen_data) * p):, :]
  • LM 神经网络:训练集正确率为 91.1%,测试集正确率为 84%
'''LM 神经网络'''
from keras.models import Sequential
from keras.layers.core import Dense, Activation

net = Sequential()
net.add(Dense(input_dim=3, units=10))
net.add(Activation('relu'))
net.add(Dense(input_dim=10, units=1))
net.add(Activation('sigmoid'))
net.compile(loss='binary_crossentropy', optimizer='adam')
net.fit(train[:,:3], train[:, 3], epochs=1000, batch_size=10)
predict_result = net.predict_classes(train[:, :3]).reshape(len(train))
cm_plot(train[:, 3], predict_result).show()

LM神经网络训练集

predict_result = net.predict_classes(test[:, :3]).reshape(len(test))
cm_plot(test[:, 3], predict_result).show()

LM神经网络测试集

  • CART 决策树:训练集正确率为 100%,测试集正确率也为 100%
'''CART决策树'''
from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])

cm_plot(train[:, 3], tree.predict(train[:, :3])).show()

CART 决策树训练集

cm_plot(test[:, 3], tree.predict(test[:, :3])).show()

CART 决策树测试集

  • 由混淆矩阵图可以看出 CART 决策树更胜一筹,如下 ROC 曲线也能得出同样的结论
'''ROC曲线'''
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt

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')
fpr2, tpr2, thresholds2 = roc_curve(test[:,3], tree.predict_proba(test[:, :3])[:, 1], pos_label=1)
plt.plot(fpr2, tpr2, linewidth=2, label='ROC of CART', c='r')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.xlim(0, 1.05)
plt.ylim(0, 1.05)
plt.legend(loc=4)
plt.show()

ROC 曲线

4. 总结

  • 本项目完成了拉格朗日插值法、LM 神经网络的模型构建、CART 决策树的模型构建、两种模型的性能评价。最后对拓展项目进行了探索建模,使用 CART 决策树得出了 100% 的正确率,不过由于数据量较少,正确率仅供参考。

项目代码及数据文件地址:https://github.com/Raymone23/Data-Mining

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值