1. 程式人生 > >python資料分析與挖掘實戰 第六章 拓展思考

python資料分析與挖掘實戰 第六章 拓展思考

企業偷漏稅識別模型

  • 1、資料探索
    • 偷漏稅企業分佈

首先生成data

import pandas as pd
inputfile = r'E:\Download\百度雲\圖書配套資料、程式碼\chapter6\拓展思考\tax.xls'
data = pd.read_excel(inputfile,index_col=0)

通過以下程式碼獲得各類銷售模式中異常比率:

t = pd.DataFrame(data.groupby([data['銷售模式'],data['輸出']]).size()).unstack()[0]
t['異常比率']=t['異常']/t.sum(axis=1)
t.sort_values('異常比率'
,ascending=False)

可以得出如下結果:

銷售模式 異常 正常 異常比率
二級及二級以下代理商 13 3 0.812500
一級代理商 14 6 0.700000
其它 3 2 0.600000
多品牌經營店 3 4 0.428571
4S店 20 56 0.263158

做個圖看看:

import matplotlib.pyplot as plt

plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'
] = ['SimHei'] plt.bar(range(len(t.index)),t['異常比率'],tick_label=t.index) plt.xticks(rotation=90) plt.show()

結果如下:

  • 2 模型構建

再看看錶,發現好像我也沒有什麼可以做的了,那麼不如直接把整個表塞進模型裡面進行訓練吧。

先對錶中的文字進行處理,全部變成值型別。

data['輸出']=data['輸出'].replace('正常',1)
data['輸出']=data['輸出'].replace('異常',0)
for m,n in enumerate(set(data['銷售型別'])):
data['銷售型別'] = data['銷售型別'].replace(n, m+1) for m,n in enumerate(set(data['銷售模式'])): data['銷售模式'] = data['銷售模式'].replace(n, m+1)

好了,現在我們的表變成這樣的了。

這裡寫圖片描述

現在按照老辦法建立一下訓練集和測試集。

from random import shuffle
data=data.as_matrix()
shuffle(data)
p=0.8
train=data[:int(len(data)*p),:]
test = data[int(len(data)*p):,:]
  • 開始做LM神經網路模型:
from keras.models import Sequential
from keras.layers.core import Dense, Activation

net = Sequential()
net.add(Dense(input_dim=14, units=10))
net.add(Activation('relu'))
net.add(Dense(input_dim=10, units=1))
net.add(Activation('sigmoid'))

net.compile(loss="binary_crossentropy", optimizer='adam', metrics=['accuracy']) 

hist = net.fit(train[:, :14], train[:, 14], epochs=1000, batch_size=1)

net.save_weights('E:\\ch06model.h5')

好了,用模型來預測一下結果吧!

predict_result = net.predict_classes(train[:, :14]).reshape(len(train)) # 用訓練集預測下
predict_result_test = net.predict_classes(test[:, :14]).reshape(len(test)) # 用測試集預測下

然後也用混淆矩陣來看下結果吧,程式碼還是和書上一樣的。

cm_plot(train[:, 14], predict_result).show()
cm_plot(test[:, 14], predict_result_test).show()

訓練集模型
訓練集的判定正確率居然是100%。

測試集模型
測試集的判定正確率22/25,88%,看起來好像也不錯。

  • 那麼,再來做CART模型看看
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()  # 建立模型
tree.fit(train[:, :14], train[:, 14])  # 訓練模型

感覺決策樹實在比神經網路用起來方便好多啊,訓練速度也很快。

好了,也做兩個混淆矩陣看下

cm_plot(train[:, 14], tree.predict(train[:,:14])).show()
cm_plot(test[:, 14], tree.predict(test[:,:14])).show()

訓練集
訓練集依然還是100%的正確率。
測試集
測試集更加可怕,居然24/25, 96%的正確率。

  • 那麼做一個ROC評價對比一下。
from sklearn.metrics import roc_curve
from matplotlib import pyplot as plt

# LM模型
predict_result_test = net.predict(test[:, :14]).reshape(len(test))
fpr1, tpr1, thresholds1 = roc_curve(test[:, 14], predict_result_test, pos_label=1)
plt.plot(fpr1, tpr1, linewidth=2, label='ROC OF LM')

# CART模型
predict_result_test = tree.predict_proba(test[:, :14])[:, 1]
fpr, tpr, thresholds = roc_curve(test[:, 14], predict_result_test, 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()

ROC
看看這結果,這次是CART模型好一些。
但實際上這個結果我另外跑過一次,那一次是LM模型的效果相對好一些。畢竟無論是訓練集還是測試集的數量都太少了,其實不是太準確的。
如果你跑出來的結果和我的不一樣,那也並不奇怪。