[Python數據挖掘]第6章、電力竊漏電用戶自動識別

1、背景與挖掘目標

相關背景自查數組

2、分析方法與過程

一、EDA(探索性數據分析)

 1.分佈分析網絡

2.週期性分析dom

二、數據預處理

1.數據清洗函數

過濾非居民用電數據,過濾節假日用電數據(節假日用電量明顯低於工做日)測試

 2.缺失值處理spa

#拉格朗日插值代碼
import pandas as pd #導入數據分析庫Pandas
from scipy.interpolate import lagrange #導入拉格朗日插值函數

data = pd.read_excel('data/missing_data.xls', header = None) #讀取數據

#自定義列向量插值函數
#s爲列向量,n爲被插值的位置,k爲取先後的數據個數,默認爲5
def ployinterp_column(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:
  for j in range(len(data)):
    if (data[i].isnull())[j]: #若是爲空即插值。
      data[i][j] = ployinterp_column(data[i], j)

data.to_excel('tmp/missing_data_processed.xls', header=None, index=False) #輸出結果

 3.數據變換3d

 以線損指標爲例,可自定義爲代理

經過這種方式,將上面各類複雜繁多的數據變換爲三項指標的簡單數據excel

結果以下:code

 4.模型構建及模型評價

(1)LM神經網絡

import pandas as pd
from random import shuffle
import matplotlib.pyplot as plt #導入做圖庫
from keras.models import Sequential #導入神經網絡初始化函數
from keras.layers.core import Dense, Activation #導入神經網絡層函數、激活函數
from sklearn.metrics import roc_curve #導入ROC曲線函數
from sklearn.metrics import confusion_matrix #導入混淆矩陣函數

def cm_plot(y, yp):
  cm = confusion_matrix(y, yp) #混淆矩陣
  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


data = pd.read_excel('data/model.xls')
data = data.as_matrix()
shuffle(data)

p = 0.8 #設置訓練數據比例
train = data[:int(len(data)*p),:]
test = data[int(len(data)*p):,:]

#構建LM神經網絡模型
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') #編譯模型,使用adam方法求解

net.fit(train[:,:3], train[:,3], nb_epoch=1000, batch_size=1) #訓練模型,循環1000次
net.save_weights('tmp/net.model') #保存模型

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

cm_plot(train[:,3], predict_result).show() #顯示混淆矩陣可視化結果

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') #做出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() #顯示做圖結果

    

(2)CART決策樹

#構建並測試CART決策樹模型
import pandas as pd
import matplotlib.pyplot as plt #導入做圖庫
from random import shuffle
from sklearn.tree import DecisionTreeClassifier #導入決策樹模型
from sklearn.metrics import roc_curve #導入ROC曲線函數
from sklearn.metrics import confusion_matrix #導入混淆矩陣函數

def cm_plot(y, yp):
  cm = confusion_matrix(y, yp) #混淆矩陣
  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


data = pd.read_excel('data/model.xls')
data = data.as_matrix()
shuffle(data)

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


#構建CART決策樹模型
tree = DecisionTreeClassifier() #創建決策樹模型
tree.fit(train[:,:3], train[:,3]) #訓練

#保存模型
from sklearn.externals import joblib
joblib.dump(tree, 'tmp/tree.pkl')

cm_plot(train[:,3], tree.predict(train[:,:3])).show() #顯示混淆矩陣可視化結果
#注意到Scikit-Learn使用predict方法直接給出預測結果。

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') #做出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() #顯示做圖結果

  

 

 

3、【拓展思考】汽車行業偷漏稅行爲識別

參考自   https://www.jianshu.com/p/5dbb818cd7b5

 一、背景和目標

企業作假帳偷稅漏稅的行爲廣泛存在,汽車行業經過「多開發票」、「作雙份報表」、「減小支出」等方式進行偷漏稅。隨着企業偷漏稅如今氾濫,也影響國家經濟基礎。經過數據挖掘能自動識別企業偷漏稅行爲,提升稽查效率減小經濟損失。

汽車銷售行業在稅收上存在少開發票金額、少記收入,上牌、按揭、保險不入帳,不及時確認保修索賠款等狀況,致使政府損失大量稅收。汽車銷售企業的部分經營指標數據能在必定程度上評估企業的偷漏稅傾向。樣本數據提供了汽車銷售行業納稅人的各類屬性和是否偷漏稅標識,提取納稅人經營特徵能夠創建偷漏稅行爲識別模型

 二、分析過程

  • 從後臺業務系統抽取企業經營指標靜態數據,保證建模樣本數據穩定性。
  • 對樣本數據進行探索性分析,查看指標分佈狀況。
  • 對樣本數據進行預處理,包括數據集清洗、缺失值處理和數據規則化。
  • 選取特徵創建樣本集和測試集。
  • 構建識別模型對樣本數據進行模型訓練,並對模型進行評價。
  • 使用多種模型並挑選最優模型進行自動識別。
1.查看數據

2.EDA

 

3.數據預處理

 

4.構建模型

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd 
from sklearn.cross_validation import train_test_split
from sklearn.metrics import roc_curve  # 導入ROC曲線函數
%matplotlib inline 
plt.rcParams['axes.unicode_minus']=False  #正常顯示負號

#定義混淆矩陣繪圖函數
def cm_plot(y, yp):
  cm = confusion_matrix(y, yp) #混淆矩陣
  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

data = pd.read_excel('data/拓展思考樣本數據.xls', index_col=u'納稅人編號')  # 讀取數據文件,指定索引爲納稅人編號
#查看銷售類型和銷售模式的分佈狀況
fig, axes = plt.subplots(1, 2)  # 建立畫布,一行兩列
fig.set_size_inches(12, 4)  # 設置畫布大小
ax0, ax1 = axes.flat
data[u'銷售類型'].value_counts().plot(kind='barh', ax=ax0, title=u'銷售類型分佈狀況')  # 分類彙總後繪製水平柱狀圖
data[u'銷售模式'].value_counts().plot(kind='barh', ax=ax1, title=u'銷售模式分佈狀況')

#數據變換:將分類型數據轉換成數值型數據,方便建模
data[u'輸出'] = data[u'輸出'].map({u'正常': 0, u'異常': 1})
data[u'銷售類型'] = data[u'銷售類型'].map({u'國產轎車': 1, u'進口轎車': 2, u'大客車': 3,u'卡車及輕卡': 4, u'微型麪包車': 5, u'商用貨車': 6,u'工程車': 7, u'其它': 8})
data[u'銷售模式'] = data[u'銷售模式'].map({u'4S店': 1, u'一級代理商': 2, u'二級及二級如下代理商': 3,u'多品牌經營店': 4, u'其它': 5})
                                           
p = 0.2  # 設置訓練數據比例
data = data.as_matrix()  # 將數據轉化爲矩陣
train_x, test_x, train_y, test_y = train_test_split(data[:, :14], data[:, 14], test_size=p)  # 設置20%的數據爲測試集,其他的爲訓練集


#Model1:LM神經網絡
from keras.models import Sequential  # 導入神經網絡初始函數
from keras.layers.core import Dense, Activation  # 導入神經網絡網絡層函數及激活函數

net = Sequential() #創建神經網絡
net.add(Dense(input_dim = 14, output_dim = 10)) #添加輸入層(14節點)到隱藏層(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') #編譯模型,使用adam方法求解
net.fit(train_x, train_y, nb_epoch=1000, batch_size=10) #訓練模型,循環1000次
net.save_weights('tmp/car_lm.model') #保存模型

predict_result_train = net.predict_classes(train_x).reshape(len(train_x))  # 預測結果
cm_plot(train_y, predict_result_train).show()  # 顯示混淆矩陣可視化圖

#LM模型評估
predict_result = net.predict(test_x).reshape(len(test_x))  # 預測結果
fpr, tpr, thresholds = roc_curve(test_y, predict_result, pos_label=1)

plt.plot(fpr, tpr, linewidth=2, label='ROC of LM')  # 繪製ROC曲線
plt.xlabel('False Positive Rate')  # 座標軸標籤
plt.ylabel('True POstive Rate')
plt.xlim(0, 1.05)  # 設定邊界範圍
plt.ylim(0, 1.05)
plt.legend(loc=4)  # 設定圖例位置
plt.show()  # 顯示繪圖結果



#Model2:CART決策樹
from sklearn.tree import DecisionTreeClassifier  # 導入決策樹模型
from sklearn.externals import joblib

tree = DecisionTreeClassifier(criterion='entropy', max_depth=3)  # 創建決策樹模型
tree.fit(train_x, train_y)  # 訓練模型
joblib.dump(tree, 'car_tree.pkl')  # 保存模型
cm_plot(train_y, tree.predict(train_x)).show()  # 顯示混淆矩陣可視化圖

# 繪製決策樹模型的ROC曲線
fpr, tpr, thresholds = roc_curve(test_y, tree.predict_proba(test_x)[:,1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label='ROC of CHAR')  # 繪製ROC曲線
plt.xlabel('False Positve Rate')  # 座標軸標籤
plt.ylabel('True Postive Rate')
plt.xlim(0, 1.05)  # 設定邊界範圍
plt.ylim(0, 1.05)
plt.legend(loc=4)  # 設定圖例位置
plt.show()  # 顯示繪圖結果

LM結果以下    

    

決策樹結果以下

    

相關文章
相關標籤/搜索