[DM實戰]電力竊漏電用戶自動識別

1、從電力計量自動化系統、營銷系統有選擇性地抽取部分大用戶用電負荷、終端報警及違約竊電出發信息等原始數據。

2、對樣本數據探索分析,剔除不可能存在竊漏電行爲行業的用戶,即白名單用戶,初步審視正常用戶和竊漏電用戶的用電特徵。

      數據探索分析是對數據進行初步研究,發現數據的內在規律特徵,有助於選擇合適的數據預處理和數據分析技術。本案例主要採用分佈分析和週期性分析等方法對電量數據進行數據探索分析。

3、對樣本數據進行預處理,包括數據清洗、缺失值處理和數據變換。

      a 數據清洗的主要目的是從業務以及建模的相關需要方面考慮,篩選出需要的數據。由於原始數據中並不是所有數據都需要進行分析,因此需要在數據處理時,將贅餘的數據進行過濾。本案例主要進行如下操作:

      1)通過數據的探索分析發現在用電類別中,非居民用電類別不可能存在漏電竊電的現象,需要將非居民用電類別的用電數據 過濾掉。

      2)結合本案例的業務,節假日用電量與工作日相比,會明顯偏低。爲了儘可能達到較好的數據效果,過濾節假日的用電數   據。

      b 在原始計量數據,特別是用戶電量抽取過程中,發現存在缺失的現象。若將這些值拋棄掉,會嚴重影響供出電量的計算結   果,最終導致日線損率數據誤差很大。爲了達到較好的建模效果。需要對缺失值處理。本案例採用拉格朗日插值法對缺失值進行插補。

       c 通過電力計量系統採集的電量、負荷,雖然在一定程度上能反映用戶竊漏電行爲的某些規律,但要作爲構建模型的專家樣   本,特徵不明顯,需要進行重新構造。基於數據變換,得到新的評價指標來表徵竊漏電行爲所具有的規律。

4、構建專家樣本集。

5、構建竊漏電用戶識別模型。

在專家樣本準備完成後,需要劃分測試樣本和訓練樣本,隨機選取20%作爲測試樣本,剩下的作爲訓練樣本。竊漏電用戶識別  可通過構建分類預測模型來實現,比較常用的分類預測模型有LM神經網絡和CART決策樹,各個模型都有各自的優點,故採用 這兩種方法構建竊漏電用戶識別,並從中選擇最優的分類模型。構建LM神經網絡和CART決策樹模型時輸出項包括電量趨勢下降指標、線損率指標,輸出項爲竊漏電標識。

6、在線監測用戶用電負荷及終端報警,調用模型實現實施診斷。

     利用測試樣本對兩個模型進行評價,採用ROC曲線評價方法進行評估,要給優秀分類器所對應的ROC曲線應該儘量靠近左上   角。

#coding:utf-8

#拉格朗日插值代碼

import pandas as pd    #導入數據分析庫Pandas
from scipy.interpolate import lagrange   #導入拉格朗如插值函數
inputfile = './data/missing_data.xls'    #輸入數據路徑,需要使用Excel格式
outputfile = './tmp/missing_data_processed.xls'   #輸出數據路徑,需要使用excel格式  需要保證文件夾tmp存在

data = pd.read_excel(inputfile, header=None)   #讀入數據  無表頭

#自定義列向量插值函數
#s爲列向量,n爲被插值的位置,k爲取前後的數據個數,默認爲5
def ployinterp_columns(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)    #插值並返回插值結果

#逐個元素判斷是否需要插值
for i in data.columns:               #表格中共有data.columns列
    for j in range(len(data)):
        if (data[i].isnull())[j]:    #如果爲空即插值
            print((data[i].isnull())[j])
            data[i][j] = ployinterp_columns(data[i],j)

data.to_excel(outputfile, header = None, index = False)   #輸出結果
#coding:utf-8

#原始數據分爲訓練數據測試數據

import pandas as pd    #導入數據分析庫
from random import shuffle     #導入隨機函數shuffle,用來打散數據

datafile = './data/model.xls'    #數據名
data = pd.read_excel(datafile)    #讀取數據,數據的前三列是特徵,第四列是標籤
data = data.as_matrix()    #將表格轉換爲矩陣

p = 0.8    #設置訓練數據比例
train = data[:int(len(data)*p),:]    #前80%爲訓練數據
test = data[int(len(data)*p):,:]     #後20%爲測試集

#構建cart決策樹模型

from sklearn.tree import DecisionTreeClassifier    #導入決策樹模型

treefile = './tmp/tree.pkl'   #模型輸出名字
tree = DecisionTreeClassifier()     #建立決策樹模型
tree.fit(train[:,:3],train[:,3])    #訓練  train[:,:3]爲前三列(列標0-2)所有row的數據   train[:,3]爲第四列(列標3)所有row的數據

#保存模型
from sklearn.externals import joblib
joblib.dump(tree,treefile)    #持久化任意的python對象爲一個文件

#模型評價

from cm_plot import *     #導入自行編寫的混淆矩陣可視化函數
cm_plot(train[:,3],tree.predict(train[:,:3])).show()     #顯示混淆矩陣可視化結果

#繪製決策樹模型的ROC曲線
from sklearn.metrics import roc_curve    #導入ROC曲線函數
import matplotlib.pyplot as plt

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')   #作出ROC曲線
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()            #顯示作圖結果

#coding:utf-8

#原始數據分爲訓練數據測試數據

import pandas as pd    #導入數據分析庫
from random import shuffle     #導入隨機函數shuffle,用來打散數據

datafile = './data/model.xls'    #數據名
data = pd.read_excel(datafile)    #讀取數據,數據的前三列是特徵,第四列是標籤
data = data.as_matrix()    #將表格轉換爲矩陣

p = 0.8    #設置訓練數據比例
train = data[:int(len(data)*p),:]    #前80%爲訓練數據
test = data[int(len(data)*p):,:]     #後20%爲測試集

#構建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, units=10))   #添加輸入層(3節點)到隱藏層(10節點)的連接
net.add(Activation('relu'))  #隱藏層使用relu激活函數
net.add(Dense(input_dim=10, units=1))  #添加隱藏層(10節點)到輸出層(1節點)的連接 輸出層使用sigmod激活函數
net.add(Activation('sigmoid'))
net.compile(loss='binary_crossentropy', optimizer='adam')   #編譯模型,使用adam方法求解


net.fit(train[:, :3],train[:, 3], nb_epoch=10, batch_size=1)   #訓練模型,循環10次
net.save_weights(netfile)   #保存模型

predict_result = net.predict_classes(train[:,:3]).reshape(len(train))   #預測結果變形
'''這裏要提醒的是,keras用predict給出預測概率,predict_classes纔是給出預測類別,而且
兩者的預測結果都是n x 1維數組,而不是通常的1 x n'''

#模型評價

from cm_plot import *     #導入自行編寫的混淆矩陣可視化函數
cm_plot(train[:,3],predict_result).show()     #顯示混淆矩陣可視化結果

#繪製決策樹模型的ROC曲線
from sklearn.metrics import roc_curve    #導入ROC曲線函數
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 CART')   #作出ROC曲線
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()            #顯示作圖結果


參考自:《python數據分析與挖掘》   --張良均








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章