Python机器学习实践:决策树判别汽车金融违约用户
?
文章發(fā)布于公號【數(shù)智物語】 (ID:decision_engine),關(guān)注公號不錯過每一篇干貨。
?
?
?
轉(zhuǎn)自 | 法納斯特(公眾號ID:walker398)
作者 | 小F
?
決策樹呈樹形結(jié)構(gòu),是一種基本的回歸和分類方法。
?
決策樹模型的優(yōu)點在于可讀性強、分類速度快。
?
下面通過從「譯學(xué)館」搬運的兩個視頻,來簡單了解下決策樹。
?
?
?
最后來實戰(zhàn)一波,建立一個簡單的決策樹模型。
?
01決策樹算法
?
本次主要涉及兩類決策樹,Quinlan系列決策樹和CART決策樹。
?
前者涉及的算法包括ID3算法、C4.5算法及C5.0算法,后者則是CART算法。
?
前者一系列算法的步驟總體可以概括為建樹和剪樹。
?
在建樹步驟中,首先選擇最有解釋力度的變量,接著對每個變量選擇最優(yōu)的分割點進行剪樹。
?
剪樹,去掉決策樹中噪音或異常數(shù)據(jù),在損失一定預(yù)測精度的情況下,能夠控制決策樹的復(fù)雜度,提高其泛化能力。
?
在剪樹步驟中,分為前剪枝和后剪枝。
?
前剪枝用于控制樹的生成規(guī)模,常用方法有控制決策樹最大深度、控制樹中父結(jié)點和子結(jié)點的最少樣本量或比例。
?
后剪枝用于刪除沒有意義的分組,常用方法有計算結(jié)點中目標(biāo)變量預(yù)測精度或誤差、綜合考慮誤差與復(fù)雜度進行剪樹。
?
此外在ID3算法中,使用信息增益挑選最有解釋力度的變量。
?
其中信息增益為信息熵減去條件熵得到,增益越大,則變量的影響越大。
?
C4.5算法則是使用信息增益率作為變量篩選的指標(biāo)。
?
CART算法可用于分類或數(shù)值預(yù)測,使用基尼系數(shù)(gini)作為選擇最優(yōu)分割變量的指標(biāo)。
?
02Python實現(xiàn)
?
對一份汽車違約貸款數(shù)據(jù)集進行讀取數(shù)據(jù)、數(shù)據(jù)清洗。(數(shù)據(jù)來源于《python數(shù)據(jù)科學(xué):技術(shù)詳解與商業(yè)實踐》一書)
?
import?os
import?pydotplus
import?numpy?as?np
import?pandas?as?pd
import?sklearn.tree?as?tree
import?matplotlib.pyplot?as?plt
from?IPython.display?import?Image
import?sklearn.metrics?as?metrics
from?sklearn.tree?import?DecisionTreeClassifier
from?sklearn.model_selection?import?train_test_split,?ParameterGrid,?GridSearchCV
#?消除pandas輸出省略號情況
pd.set_option('display.max_columns',?None)
#?設(shè)置顯示寬度為1000,這樣就不會在IDE中換行了
pd.set_option('display.width',?1000)
#?讀取數(shù)據(jù),skipinitialspace:忽略分隔符后的空白
accepts?=?pd.read_csv('accepts.csv',?skipinitialspace=True)
#?dropna:對缺失的數(shù)據(jù)進行刪除
accepts?=?accepts.dropna(axis=0,?how='any')
#?因變量,是否違約
target?=?accepts['bad_ind']
#?自變量
data?=?accepts.ix[:,?'bankruptcy_ind':'used_ind']
#?業(yè)務(wù)處理,loan_amt:貸款金額,tot_income:月均收入
data['lti_temp']?=?data['loan_amt']?/?data['tot_income']
data['lti_temp']?=?data['lti_temp'].map(lambda?x:?10?if?x?>=?10?else?x)
#?刪除貸款金額列
del?data['loan_amt']
#?替換曾經(jīng)破產(chǎn)標(biāo)識列
data['bankruptcy_ind']?=?data['bankruptcy_ind'].replace({'N':?0,?'Y':?1})
?
接下來使用scikit-learn將數(shù)據(jù)集劃分為訓(xùn)練集和測試集。
?
#?使用scikit-learn將數(shù)據(jù)集劃分為訓(xùn)練集和測試集
train_data,?test_data,?train_target,?test_target?=?train_test_split(data,?target,?test_size=0.2,?train_size=0.8,?random_state=1234)
?
初始化一個決策樹模型,使用訓(xùn)練集進行訓(xùn)練。
?
采用基尼系數(shù)作為樹的生長依據(jù),樹的最大深度為3,每一類標(biāo)簽的權(quán)重一樣。
?
#?初始化一個決策樹模型
clf?=?DecisionTreeClassifier(criterion='gini',?max_depth=3,?class_weight=None,?random_state=1234)
#?輸出決策樹模型信息
print(clf.fit(train_data,?train_target))
?
輸出的模型信息如下。
?
?
對生成的決策樹模型進行評估。
?
#?輸出決策樹模型的決策類評估指標(biāo)
print(metrics.classification_report(test_target,?clf.predict(test_data)))
#?對不同的因變量進行權(quán)重設(shè)置
clf.set_params(**{'class_weight':?{0:?1,?1:?3}})
clf.fit(train_data,?train_target)
#?輸出決策樹模型的決策類評估指標(biāo)
print(metrics.classification_report(test_target,?clf.predict(test_data)))
#?輸出決策樹模型的變量重要性排序
print(list(zip(data.columns,?clf.feature_importances_)))
?
輸出如下。
?
?
可以看出對因變量標(biāo)簽進行權(quán)重設(shè)置后,模型對違約用戶的f1-score(精確率和召回率的調(diào)和平均數(shù))提高了,為0.46。
?
違約用戶被識別的靈敏度也從0.24提高到了0.46。
?
此外決策樹模型的變量重要性排序為「FICO打分」、「信用卡授權(quán)額度」、「貸款金額/建議售價*100」。
?
通過安裝graphviz和相應(yīng)的插件,便能實現(xiàn)決策樹的可視化輸出,具體安裝過程不細(xì)說。
?
#?設(shè)置graphviz路徑
os.environ["PATH"]?+=?os.pathsep?+?'C:/Program?Files?(x86)/Graphviz2.38/bin/'
#?決策樹的可視化
dot_data?=?tree.export_graphviz(clf,?out_file=None,?feature_names=data.columns,?class_names=['0',?'1'],?filled=True)
graph?=?pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
#?將決策樹模型輸出為圖片
graph.write_png(r'pang.png')
#?將決策樹模型輸出為PDF
graph.write_pdf('tree.pdf')
?
可視化結(jié)果如下。
?
?
可以看見決策樹根節(jié)點以fico_score <= 683.5為分割標(biāo)準(zhǔn)。
?
全體樣本的基尼系數(shù)為0.483,在3284個樣本中,被預(yù)測變量為0的有2671個,為1的有1839個。
?
使用scikit-learn提供的參數(shù)搜索進行調(diào)優(yōu)(GridSearchCV)。
?
#?設(shè)置樹的最大深度
max_depth?=?[None,?]
#?設(shè)置樹的最大葉節(jié)點數(shù)
max_leaf_nodes?=?np.arange(5,?10,?1)
#?設(shè)置樹的類標(biāo)簽權(quán)重
class_weight?=?[{0:?1,?1:?2},?{0:?1,?1:?3}]
#?設(shè)置參數(shù)網(wǎng)格
param_grid?=?{'max_depth':?max_depth,
??????????????'max_leaf_nodes':?max_leaf_nodes,
??????????????'class_weight':?class_weight}
#?對參數(shù)組合進行建模和效果驗證
clf_cv?=?GridSearchCV(estimator=clf,
??????????????????????param_grid=param_grid,
??????????????????????cv=5,
??????????????????????scoring='roc_auc')
#?輸出網(wǎng)格搜索的決策樹模型信息
print(clf_cv.fit(train_data,?train_target))
?
輸出網(wǎng)格搜索的決策樹模型信息。
?
?
使用得到的“最優(yōu)”模型對測試集進行評估。
?
#?輸出優(yōu)化后的決策樹模型的決策類評估指標(biāo)
print(metrics.classification_report(test_target,?clf_cv.predict(test_data)))
#?輸出優(yōu)化后的決策樹模型的參數(shù)組合
print(clf_cv.best_params_)
?
輸出結(jié)果。
?
?
計算模型在不同閾值下的靈敏度和特異度指標(biāo),繪制ROC曲線。
?
#?使用模型進行預(yù)測
train_est?=?clf_cv.predict(train_data)
train_est_p?=?clf_cv.predict_proba(train_data)[:,?1]
test_est?=?clf_cv.predict(test_data)
test_est_p?=?clf_cv.predict_proba(test_data)[:,?1]
#?繪制ROC曲線
fpr_test,?tpr_test,?th_test?=?metrics.roc_curve(test_target,?test_est_p)
fpr_train,?tpr_train,?th_train?=?metrics.roc_curve(train_target,?train_est_p)
plt.figure(figsize=[3,?3])
plt.plot(fpr_test,?tpr_test,?'b--')
plt.plot(fpr_train,?tpr_train,?'r-')
plt.title('ROC?curve')
plt.show()
#?計算AUC值
print(metrics.roc_auc_score(test_target,?test_est_p))
?
ROC曲線圖如下,其中訓(xùn)練集的ROC曲線(實線)與測試集的ROC曲線(虛線)很接近,說明模型沒有過擬合。
?
?
模型的ROC曲線下面積為0.7358,模型效果一般。
?
推薦閱讀:
?
?
?
星標(biāo)我,每天多一點智慧
?
轉(zhuǎn)載于:https://www.cnblogs.com/shuzhiwuyu/p/10716968.html
總結(jié)
以上是生活随笔為你收集整理的Python机器学习实践:决策树判别汽车金融违约用户的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页布局基础 第三次(浮动布局)
- 下一篇: Python打卡第四周