項目來源于《數據分析與挖掘實戰》。
1.背景與挖掘目標
通過電力計量自動化系統以及異常警告信息等數據提取出竊漏電用戶的關鍵特征,構建竊漏電用戶的識別模型,自動檢查、判斷用戶是否存在竊漏電行為。
2.分析方法與過程
- 從電力計量自動化系統、營銷系統有選擇地抽取部分大用戶用電負荷、終端報警及違約竊電處罰信息等原始數據。
- 對樣本進行探索性分析,剔除不可能存在竊漏電行為行業的用戶。
- 對樣本數據進行預處理,包括數據清洗、缺失值處理和數據變換。
- 構建專家樣本集。(構建好的特征,整理好的數據)
- 構建竊漏電用戶模型。
- 在線監測用戶用電負荷及終端報警,調用模型實現實時診斷。
2.3 數據變換
通過數據探索分析并結合實際業務找出三個與用戶竊漏電有關的三個指標。
- 電量趨勢下降指標。 如果電量趨勢不斷下降,則有竊電可能
- 線損指標。若若用戶發生竊漏電,則當天的線損率會上升。考慮前后幾天的線損率平均值,判斷其增長率是否大于1%,若線損率的增長率大于1%則有竊漏電的可能性。
- 告警類指標。與竊漏電相關的終端主要有電壓、電壓斷相、電流煩極性等告警,計算發生與竊漏電相關的終端報警的次數總和。
2.5 建立模型
思路如下:
1 導入數據
2 用訓練數據建立決策樹模型
3 對訓練數據用混淆矩陣評估決策樹模型的預測結果
4 用訓練數據建立神經網絡模型
5 對訓練數據用混淆矩陣評估神經網絡模型的預測結果
6 用學習得到的決策樹模型和神經網絡模型跑測試數據來預測
7 用ROC曲線評估,選出更優的一個模型
代碼如下:
導入數據
import pandas as pd
import numpy as np
data = pd.read_excel('G:/Python_data_analysis/chapter6/chapter6/demo/data/model.xls')
data = data.as_matrix()
from random import shuffle
shuffle(data) #隨機打亂數據
p = 0.8
train = data[:int(len(data)*p),:]
test = data[int(len(data)*p): ,:]
繪制混淆矩陣函數
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) #畫混淆矩陣,配色風格使用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
用數據訓練決策樹模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(train[:,:3],train[:,3])
cm_plot(train[:,3], tree.predict(train[:,:3])).show()
決策樹
決策樹roc曲線
from sklearn.metrics import roc_curve
predict_result = tree.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 CART')
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()
用數據訓練lm神經網絡模型
# 構建LM神經網絡模型代碼
from keras.models import Sequential
from keras.layers.core import Dense, Activation #導入神經網絡層函數、激活函數
net = Sequential() #建立神經網絡
net.add(Dense(input_dim=3, output_dim=10)) #添加輸入層(3節層)到隱藏層(10節點)的連接
net.add(Activation('relu')) #隱藏層使用relu激活函數
net.add(Dense(input_dim=10, output_dim=1)) #添加隱藏層(10節點)到輸出層(1節點)的連接
net.add(Activation('sigmoid')) #輸出層使用sigmoid激活函數
net.compile(loss = 'binary_crossentropy',optimizer = 'adam')
net.fit(train[:,:3],train[:,3],nb_epoch=1000, batch_size=1)
cm_plot(train[:,3],net.predict_classes([train[:,:3].reshape(len(train))
from sklearn.metrics import roc_curve
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')
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()
對比神經網絡和決策樹的ROC曲線,可以發現LM神經網絡曲線效果較好。
比較好的一篇文章:機器學習-淺談模型評估的方法和指標