日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python机器学习实践:决策树判别汽车金融违约用户

發(fā)布時間:2023/12/13 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python机器学习实践:决策树判别汽车金融违约用户 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

文章發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。