天天看點

偷稅漏稅行為檢測:Keras庫建構神經網絡模型,scikit-learn庫建構CART決策樹模型print(data)print(data[['銷售模式','銷售類型']])建構CART決策樹模型建構LM神經網絡模型繪制LM神經網絡模型的ROC曲線建構LM神經網絡模型建構CART決策樹模型繪制LM神經網絡模型的ROC曲線繪制決策樹模型的ROC曲線

偷稅漏稅行為檢測

企業做假賬偷稅漏稅的行為普遍存在,汽車行業通過“多開發票”、“做雙份報表”、“減少支出”等方式進行偷漏稅。本任務使用Keras庫來建構神經網絡模型,使用scikit-learn庫建構CART決策樹模型,并建構決策樹模型預測企業是否漏稅。

通過本任務,您将掌握以下内容:

1、建構LM神經網絡模型。

2、建構CART決策樹模型,并建構決策樹模型。

3、學會分析模型的好壞。

4、對比LM神經網絡的ROC曲線比CART決策樹的ROC曲線的好壞。

背景和挖掘目标

企業做假賬偷稅漏稅的行為普遍存在,汽車行業通過“多開發票”、“做雙份報表”、“減少支出”等方式進行偷漏稅。随着企業偷漏稅現在泛濫,也影響國家經濟基礎。通過資料挖掘能自動識别企業偷漏稅行為,提高稽查效率減少經濟損失。汽車銷售行業在稅收上存在少開發票金額、少記收入,上牌、按揭、保險不入賬,不及時确認保修索賠款等情況,導緻政府損失大量稅收。汽車銷售企業的部分經營名額資料能在一定程度上評估企業的偷漏稅傾向。樣本資料提供了汽車銷售行業納稅人的各種屬性和是否偷漏稅辨別,提取納稅人經營特征可以建立偷漏稅行為識别模型。

分析方法和過程

在建立偷漏稅識别模型前需要先整理流程(如下圖),主要包含以下步驟:

從背景業務系統抽取企業經營名額靜态資料,保證模組化樣本資料穩定性。

對樣本資料進行探索性分析,檢視名額分布情況。

對樣本資料進行預處理,包括資料集清洗、缺失值處理和資料規則化。

選取特征建立樣本集和測試集。

建構識别模型對樣本資料進行模型訓練,并對模型進行評價。

使用多種模型并挑選最優模型進行自動識别。

實驗環境

Linux Ubuntu 14.04

Python3.6

實驗步驟

1.首先在Linux上建立/data/python4目錄,并切換到該目錄下。

view plain copy

sudo mkdir -p /data/python4

cd /data/python4

修改/data/python4目錄下的所有檔案及子目錄的所有者和所屬的組為:zhangyu

sudo chown -R zhangyu.zhangyu /data/python4

2.使用wge指令,從網址

http://192.168.1.100:60000/allfiles/python4/

目錄下,将實驗所需資料下載下傳到linux本地/data/python4目錄下。

sudo wget

http://192.168.1.100:60000/allfiles/python4/carsales_data.xls

3.建立一個Python 項目,名為python4

4.在python4項目下,建立一個Python file檔案

命名為explore_analyse。

資料探索分析

5.樣本資料包含15個特征屬性,分别為14個輸入特征和1個輸出特征,有納稅人基本資訊和經營名額資料。資料探索性分析能及早發現樣本資料是否存在較大差異和對資料的整體情況有基本的認識。具體代碼如下:

import matplotlib

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib.font_manager as fm

fontPath ="/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"

font = fm.FontProperties(fname=fontPath, size=10)

inputfile='/data/python4/carsales_data.xls'

data=pd.read_excel(inputfile,index_col='納稅人編号')

fig, axes = plt.subplots(1, 2)

fig.set_size_inches(12, 4, )

ax0, ax1 = axes.flat

a=data['銷售類型'].value_counts().plot(kind='barh', ax=ax0, title='銷售類型分布情況',)

a.xaxis.get_label().set_fontproperties(font)

a.yaxis.get_label().set_fontproperties(font)

a.legend(loc='upper right', prop=font)

for label in ([a.title] + a.get_xticklabels() + a.get_yticklabels()):

label.set_fontproperties(font)  
           

b=data['銷售模式'].value_counts().plot(kind='barh',ax=ax1,title='銷售模式分布情況')

b.xaxis.get_label().set_fontproperties(font)

b.yaxis.get_label().set_fontproperties(font)

b.legend(loc='upper right', prop=font)

for label in ([b.title]+b.get_xticklabels() + b.get_yticklabels()):

label.set_fontproperties(font)             

print(data.describe().T

plt.show()

6.運作結果如下圖所示:

從資料的分布情況上看,銷售類型主要集中在國産轎車和進口轎車,銷售模式主要集中在4S店和一級代理商。

7.數值變量統計描述

統計結果顯示各個資料名額均無缺失值,個别名額資料如(整體稅負控制數、辦牌率、單台辦牌手續費收入等)最小值為零。

8.在python4下建立一個Python file檔案

命名為data_analyse。

建構偷稅漏稅行為識别模型

抽取資料,對資料預處理,在得到預處理資料的樣本資料,需要對資料進行劃分訓練集和測試集,随機選取20%的資料作為測試集,其餘80%的資料作為訓練集。使用分類預測模型來實作偷稅漏稅自動識别,比較常用的分類模型:LM神經網咯和CART決策樹,兩種模型都有優點,故采用兩種模型進行訓練從中選擇最優的分類模型。

9.完整代碼如下:

data=pd.read_excel(inputfile,index_col='納稅人編号')

print(data)

zhfont1 = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc')

data['銷售類型']=data['銷售類型'].map({'國産轎車': 1, '進口轎車': 2, '大客車': 3, '卡車及輕卡': 4, '微型面包車': 5, '商用貨車': 6,'工程車': 7, u'其它': 8})

data['銷售模式']=data['銷售模式'].map({'4S店':1, '一級代理商':2 ,'二級及二級以下代理商':3 ,'其它':5 ,'多品牌經營店':4})

data['輸出']=data['輸出'].map({'正常':1,'異常':0})

print(data[['銷售模式','銷售類型']])

from sklearn.cross_validation import train_test_split

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)

print(train_x)

print(train_y)

from cm_plot import cm_plot

建構CART決策樹模型

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

from sklearn.externals import joblib

tree_file = 'tree.pkl' # 模型輸出路徑

tree = DecisionTreeClassifier(criterion='entropy', max_depth=3) # 建立決策樹模型

tree.fit(train_x, train_y) # 訓練模型

joblib.dump(tree, tree_file) # 儲存模型

cm_plot(train_y, tree.predict(train_x)).show() # 顯示混淆矩陣可視化圖

from sklearn.metrics import roc_curve

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神經網絡模型

from keras.models import Sequential # 導入神經網絡初始函數

from keras.layers.core import Dense, Activation # 導入神經網絡網絡層函數及激活函數

net_file = 'net.model' #建構的神經網絡模型存儲路徑

net = Sequential() # 建立神經網絡

net.add(Dense(10, input_shape=(14))) # 添加輸入層(14節點)到隐藏層(10節點)的連接配接

net.add(Activation('relu')) # 隐藏層使用relu激活函數

net.add(Dense(1, input_shape=(10))) # 添加隐藏層(10節點) 到輸出層(1節點)的連接配接

net.add(Activation('sigmoid')) # 輸出層使用sigmoid激活函數

net.compile(loss='binary_crossentropy', optimizer='adam') # 編譯模型,使用adam方法求解

net.fit(train_x, train_y, epochs=1000, batch_size=10) # 訓練模型循環一千次

net.save_weights(net_file) # 儲存模型

predict_result = net.predict_classes(train_x).reshape(len(train_x)) # 預測結果

from cm_plot import cm_plot # 導入 混淆矩陣可視化函數

cm_plot(train_y, predict_result).show() # 顯示混淆矩陣可視化圖

繪制LM神經網絡模型的ROC曲線

from sklearn.metrics import roc_curve # 導入ROC曲線函數

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.show() # 顯示繪圖結果

10.在python4項目下,建立一個Python file,

命名為cm_plot.

11.将以下用于建構混淆矩陣可視圖的代碼寫入到cm_plot檔案中

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             

12.在data_analyse檔案下,右鍵點選Run "data_analyse",運作data_analyse.py程式,可以在下面對完整代碼的分部描述中,檢視運作結果(注意:當出來圖檔以後,必須點選關閉該圖,才能執行後續代碼)。

資料抽取

13.由于已經有現成的資料集可供使用,故這裡省略從背景系統抽取資料集的過程。先用pandas庫讀取Excel檔案的原始資料,具體代碼如下:

print(data)

資料預處理

14.考慮模組化的需要,前面樣本資料中類别型特征需要進行轉換成數值型特征,故對銷售類型和銷售模式進行重編碼處理,輸出特征進行二值化處理。由于資料中并無缺失值,則不需要進行缺失值處理。

data['輸出']=data['輸出'].map({'正常':1,'異常':0})

資料劃分

15.使用scikit_learn交叉驗證随機将資料集劃分為訓練集與測試集。具體代碼如下

LM神經網絡

16.使用Keras庫可以來建構神經網絡模型,設定LM神經網絡的輸入節點數為14,輸出節點數為1,隐藏層節點數為10,使用Adam方法求解。在隐藏層使用Relu(x) = max(x, 0) 做為激活函數。建構LM神經網絡模型的代碼如下:

net.compile(loss='binary_crossentropy', optimizer='adam', class_mode='binary') # 編譯模型,使用adam方法求解

net.fit(train_x, train_y, nb_epoch=1000, batch_size=10) # 訓練模型循環一千次

cm_plot(train_y, predict_result).show() # 顯示混淆矩陣可視化圖

17.運作結果如下圖所示

由上圖的訓練集模組化混淆矩陣,算出分類準确率為(56+38) / (56+38+1+4) = 91.9%。

CART決策樹

18.使用scikit-learn庫建構CART決策樹模型,并建構決策樹模型,具體的代碼如下:

from cm_plot import cm_plot

19.運作結果如下圖所示:

訓練模型後得到混淆矩陣如下圖,分類的準确率為 (57+36) / (57+36+2+4) = 94.9%

模型評價

對于訓練集,LM神經網絡模型和CART決策樹的分類準确率都比較好,分别為91.9%和94.9%。為了進一步評估模型分類的效果,需要使用測試集對兩個模型進行評價,采用ROC線評價方法進行評估,優秀的分類器所對應的ROC曲線應該經曆靠近左上角。分别畫出LM神經網絡和CART決策樹在測試集下的ROC曲線。

20.LM神經網絡對測試集資料的ROC曲線代碼如下:

21.運作結果如下圖所示:

22.CART決策樹模型測試集資料的ROC曲線代碼如下:

繪制決策樹模型的ROC曲線

23.運作結果如下所示:

CART決策樹模型ROC曲線圖對比兩個模型的ROC曲線可以發現LM神經網絡的ROC曲線比CART決策樹的ROC曲線更加靠近左上角,LM神經網絡的ROC曲線下的面積更大,說明LM神經網絡模型的分類性能更好,能用來識别偷漏稅行為。