案例-自动识别窃漏电用户
目前防窃漏电方法主要有两种:1,通过定期巡检、定期校验电表、用户举报窃电等手段来发现窃电或计量装置故障。2,利用计量异常报警功能和电能量数据查询功能实现在线监控工作,通过采集电量异常、负荷异常、终端报警、主站报警、线损异常等信息,来实时监测窃漏电情况和发现计量装置的故障。根据报警事件发生前后客户计量点有关的电流、电压、负荷数据情况等,实现用电故障及类型的甄别。弊端:对人的依赖性太强,抓窃查漏的目标不明确;由于终端误报或漏报过多,无法达到真正快速精确定位窃漏电嫌疑用户的目的。
构建自动识别模型:
- 采集各相电流、电压、功率因数等用电负荷数据以及用电异常等终端报警信息(业务);
- 异常告警信息和用电负荷数据能够反映用户的用电情况(数据);
- 稽查工作人员也会通过在线稽查系统和现场稽查来查找出窃漏电用户(业务),并录入系统;
- 从数据信息提取出窃漏电用户的关键特征(数据),达到自动识别窃漏电用户的目的;
- 达到自动检查判断用户是否存在窃漏电行为。
我们将业务问题进行理解,从数据分析的角度进行阐述。建模目标为: 归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型;利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。(我们只做数据分析与挖掘部分的详细论述,其他部分一带而过)。
构建指标体系如下:
1,电量趋势下降指标(用电量趋势):正常用户的用电量较为平稳;窃漏电用户的用电量呈现下降的趋势,然后趋于平缓。
2,线损指标(线损增长率):在输送和分配电能过程中,电力网中各个元件所产生的电能损失以及其他损失,统称为线路损失(线损)。
3,告警类指标(终端报警数):与窃漏电相关的终端报警主要有电压缺相、电压断相、电流反极性等告警,计算发生与窃漏电相关的终端报警的次数总和。
python实现
导入所需的库
#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
导入并查看数据
data_lr = pd.read_excel('D:\python原始数据\logist_model.xlsx','logist_model')
print(data_lr.shape)
print(data_lr.head(10))
将数据分为训练数据和测试数据
array = data_lr.values
X_train =array[0:200,2:5]
Y_train = array[0:200, 5]
X_test =array[200:291,2:5]
Y_test = array[200:291,5]
构建逻辑回归及查看
model = LogisticRegression()
model.fit(X_train, Y_train)
print("截距项",model.intercept_)
print("系数",model.coef_)
效果评估
#准确率
scores = cross_val_score(model, X_train, Y_train, cv=10)
print("准确率", np.mean(scores), scores)
#混淆矩阵
from sklearn.metrics import confusion_matrix
predicted = model.predict(X_test)
matrix = confusion_matrix(Y_test, predicted)
classes = ['0', '1']
dataframe = pd.DataFrame(data=matrix,
index=classes,
columns=classes)
print(dataframe)
#AUC图
from sklearn.metrics import roc_curve, auc
predictions = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(Y_test, predictions[:,1])
roc_auc = auc(fpr, tpr)
import matplotlib.pyplot as plt
plt.plot(fpr, tpr,'b', label='auc=%0.2f' % roc_auc)
plt.legend(loc ='lower right')
plt.plot([0, 1],[0,1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel("fpr")
plt.ylabel("tpr")
plt.show()
数据链接:https://pan.baidu.com/s/140Z1jxivcOjucaQtU7PaZQ 密码:xz58