实战一、电力窃漏用户自动识别
取自《Python数据分析与挖掘实战》一书
学会绘制混淆矩阵图、ROC图、使用LM神经网络预测,决策树预测,拉格朗日插值法,下降趋势指标。
一、数据抽取
主要有用电负荷数据、终端报警数据、违约窃电处罚信息以及用户档案资料等。
二、数据探索分析
1、数据的分布分析
查看用电类别切漏电情况,明确哪一些人群、领域窃漏电情况严重。
2、周期性分析
正常用电量周期性用量平稳,没有太大波动;窃漏电用户用电量出现明显下降的趋势
3、数据预处理
从原始用户电量数据抽取,发现存在缺失现象,因此用到拉格朗日插值法对缺失值进行插补!
拉格朗日插值法:
确定因变量、自变量;取出缺失值前后5个数据,去除空值,取10个数据组成一组。采用拉格朗日插值公式
Ln(x)=∑(i:0~n)li(x)yi
li(x)=Ⅱ(j:0-n;j!=i)(x-xj)/(xi-xj)
x为缺失值下标序号;Ln(x)为缺失值插值结果,xi为非缺失值yi的下表。
直到不存在缺失值为止
def lagInterploation(data_col, j, n=5):
dataList = data_col[list(range(j - n, j)) + list(range(j + 1, j + n + 1))]
dataList = dataList[dataList.notnull()]
return lagrange(dataList.index, list(dataList))(j)
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:
data[i][j] = lagInterploation(data[i], j)
传入该列数据,获取该列非空前后10个数据;
lagrange(x,w) x数据点的x轴,传入的是数据的下标索引;w是传入的数据。
例如:dataList=
0 235.8333
1 236.2708
2 238.0521
3 235.9063
4 236.7604
6 237.4167
7 238.6563
8 237.6042
9 238.0313
10 235.0729
Name: 0, dtype: float64
传入的索引里是不含缺失值下标的!!最后获取(j)位置处的值,即是插值
4、数据变换
基于系统采集到的一些数据,来重新构造,进行数据变换得到新的评价指标来表征窃漏电行为所具有的规律。
- 电量趋势下降指标:电量趋势不断下降,则认为具有窃电嫌疑
- 线损指标:若发生窃漏电,线损率会上升。是否1%
- 告警类指标:电压缺相,电流反极性等
5、构建专家样本
所有窃漏电用户和正常用户的电量、告警及线损数据和该用户在当天是否标识。按窃漏电评价指标进行处理,选取样本,得到专家样本库。
时间–用户编号–电量趋势下降指标–线损指标–告警类指标–是否窃漏电
6、模型构建
数据划分–80%训练集,20%测试集
使用LM神经网络进行预测
神经网络:3–10–1 两层,使用Adam方法求解。隐藏层激活函数Relu(x)=max(x,0)
net = Sequential()
net.add(Dense(input_dim=3, activation='relu', units=10))
net.add(Dense(input_dim=10, activation='sigmoid', units=1))
net.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
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))
keras用predict给出预测概率;predict_classes才是给出预测类别。预测结果都是[n,1]维数组!
CART决策树用predict给出预测的类别!
使用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)
plt=cm_plot(test[:,3], tree.predict(test[:,:3]))
plt.show()
7、模型评估
评估模型分类的性能,利用测试样本对模型进行评价,采用ROC曲线评价方法进行评估。
分类器越优秀,其ROC曲线应该尽可能的靠近左上角!
混淆矩阵绘图
def cm_plot(y, yp):
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y, yp)
import matplotlib.pyplot as plt
plt.matshow(cm, cmap=plt.cm.Greens)
plt.colorbar()
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
ROC曲线
from sklearn.metrics import roc_curve
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', color='green')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.ylim(0, 1.05)
plt.xlim(0, 1.05)
plt.legend(loc=4)
plt.show()