金融风控实战—模型可解释之shap
shap.plots.waterfall瀑布圖-展示單個(gè)用戶變量影響
shap.explainer:
This is the primary explainer interface for the SHAP library. It takes any combination of a model and masker and returns a callable subclass object that implements the particular estimation algorithm that was chosen.
這是 SHAP 庫的主要解釋器接口。它采用模型和掩碼的任意組合,并返回一個(gè)可調(diào)用的子類對(duì)象,該對(duì)象實(shí)現(xiàn)所選的特定估計(jì)算法。
SHAP瀑布圖
可視化第一個(gè)預(yù)測的解釋:
shap公式
基本值(base_value) ,即E[f(x)]是我們傳入數(shù)據(jù)集上模型預(yù)測值的均值,可以通過自己計(jì)算來驗(yàn)證:
現(xiàn)在我們知道每個(gè)特征對(duì)第一次預(yù)測的貢獻(xiàn)。對(duì)上圖的解釋: X軸是log-odds對(duì)數(shù)值
y軸是各個(gè)變量的數(shù)值
藍(lán)色條顯示某一特定特征在多大程度上降低了預(yù)測的值。 紅條顯示了一個(gè)特定的特征在多大程度上增加了預(yù)測值。 例如當(dāng)total_pymt=639.85時(shí),大大增加壞客戶概率;當(dāng)int_rate=0.103時(shí),大大減少壞客戶概率
我們應(yīng)該期望總貢獻(xiàn)等于預(yù)測與均值預(yù)測的差值。我們來驗(yàn)證一下: f(x)-E(f(x))=-3.161+5.599=2.438
0.97+0.81+0.76+0.52-0.37-0.31+0.25-0.16+0.15-0.19=2.4299999999999997
0.97是total_pymt=639.85時(shí)的shap值,當(dāng)shap值>0時(shí),表示該特征提升了預(yù)測值,也正向作用;反之,說明該特征使得預(yù)測值降低,有反作用。
由于瀑布圖只顯示一個(gè)樣本值的數(shù)據(jù),我們無法看到變量的動(dòng)態(tài)變化帶來的影響
我們用散點(diǎn)圖scatter來觀察變量的動(dòng)態(tài)變化
例如installment分期付款金額,整體趨勢(shì)是這個(gè)值越大,shap value更高,壞客戶概率越高
shap.plots.scatter(shap_values1[:,"installment"])shap.TreeExplainer
Tree SHAP is a fast and exact method to estimate SHAP values for tree models and ensembles of trees, under several different possible assumptions about feature dependence. It depends on fast C++ implementations either inside an externel model package or in the local compiled C extention.Tree SHAP是一種快速而精確的方法,用于估計(jì)樹模型和樹集合的SHAP值,在關(guān)于特征依賴性的幾種不同的可能假設(shè)下。它依賴于快速的C++實(shí)現(xiàn),既可以在外部模型包內(nèi),也可以在本地編譯的C擴(kuò)展中實(shí)現(xiàn)。Tree SHAP 方法在數(shù)學(xué)上等效于對(duì)特征的所有可能排序的預(yù)測差異進(jìn)行平均,而不僅僅是由它們?cè)跇渲械奈恢弥付ǖ呐判颉V挥?Tree SHAP 既一致又準(zhǔn)確,這并非巧合。
explainer = shap.TreeExplainer(model) # 最新版本的shap對(duì)于LGBMClassifier得到的shap_values為兩個(gè)數(shù)組的列表,即兩個(gè)分類的結(jié)果,這里使用分類1的結(jié)果 shap_values = explainer.shap_values(X) shap_values #array([[ 0.12214637, 0.5763162 , 0.09239966, ..., 0.05956555, # -0.08578542, 0.00583912], # [-3.3557818 , 1.981333 , 0.589741 , ..., 0.00633732, # -0.07526105, -0.11162438], # [-0.33665466, 1.1700472 , 0.24532834, ..., 0.04161756, # -0.02426036, -0.1627982 ], # ..., # [-2.7578328 , -0.5021786 , -0.2805183 , ..., -0.04732708, # 0.02320154, -0.00695255], # [-0.68766063, -1.0604968 , -0.34821302, ..., 0.27330098, # 0.30684933, 0.27966177], # [-1.0541837 , -0.6048023 , 0.13503188, ..., -0.03302696, # -0.11473337, -0.08085796]], dtype=float32)force plot是針對(duì)單個(gè)樣本預(yù)測的解釋,它可以將shap values可視化為force,每個(gè)特征值都是一個(gè)增加或減少預(yù)測的force,預(yù)測從基線開始,基線是解釋模型的常數(shù),每個(gè)歸因值是一個(gè)箭頭,增加(正值)或減少(負(fù)值)預(yù)測。
紅色的為正貢獻(xiàn),藍(lán)色為負(fù)貢獻(xiàn),對(duì)于第一個(gè)樣本,由上圖可以解釋為特征total_pymnt=639.9的正貢獻(xiàn)第一,total_pymnt_inv=639.9的正貢獻(xiàn)第二,但是int_rate=0.1033的負(fù)貢獻(xiàn)最大
個(gè)圖是直接由shap values繪成的,可以比較第一個(gè)樣本的shap values具體數(shù)值:所以就算不繪制force plot,直接獲取樣本的shap values,就可以知道每個(gè)特征值是如何貢獻(xiàn)得到模型預(yù)測值的。
shap.plots.bar
#繪圖feature importance shap.summary_plot(shap_values, X, plot_type="bar")匯總:installment分期金額,total_rec_prncp迄今收到金額,int_rate貸款利率為前三最重要變量
其實(shí)如果要查看特征值大小與預(yù)測影響之間的關(guān)系的話,第二種圖還是不夠清楚,所以這里主要講第一種圖,第一種圖其實(shí)就是對(duì)shap values按照特征維度聚合計(jì)算平均絕對(duì)值,也就是?,使用該公式去計(jì)算shap values,可得到下表:
feature_importance = pd.DataFrame() feature_importance['feature'] = X.columns feature_importance['importance'] = np.abs(shap_values).mean(0) feature_importance.sort_values('importance', ascending=False)summary_plot
summary plot 為每個(gè)樣本繪制其每個(gè)特征的SHAP值,這可以更好地理解整體模式,并允許發(fā)現(xiàn)預(yù)測異常值。每一行代表一個(gè)特征,橫坐標(biāo)為SHAP值。一個(gè)點(diǎn)代表一個(gè)樣本,顏色表示特征值(紅色高,藍(lán)色低)。比如,這張圖表明installment分期付款金額值越高,會(huì)降提升壞客戶概率
shap.summary_plot(shap_values, X)
Interaction Values
interaction value是將SHAP值推廣到更高階交互的一種方法。樹模型實(shí)現(xiàn)了快速、精確的兩兩交互計(jì)算,這將為每個(gè)預(yù)測返回一個(gè)矩陣,其中主要影響在對(duì)角線上,交互影響在對(duì)角線外。這些數(shù)值往往揭示了有趣的隱藏關(guān)系(交互作用)
#當(dāng)數(shù)據(jù)量大時(shí),shap_interaction_values函數(shù)調(diào)用時(shí)非常耗時(shí),建議關(guān)閉電腦其他應(yīng)用,加速計(jì)算。 shap_interaction_values = explainer.shap_interaction_values(X) shap.summary_plot(shap_interaction_values, X)dependence_plot
如果要看特征值大小與預(yù)測影響之間的關(guān)系使用dependence plot更合適,dependence plot清楚地展示了單個(gè)特征是如何影響模型的預(yù)測結(jié)果的,dependence plot同樣有多種使用方式,一種是查看某個(gè)特征是如何影響到模型預(yù)測結(jié)果的,另一種是一個(gè)特征是如何和另一個(gè)特征交互影響到模型預(yù)測結(jié)果的。
shap.dependence_plot('installment', shap_values, X, interaction_index=None)
總結(jié):installment分期金額越大,壞客戶概率越高
此圖和scatter散點(diǎn)圖繪制效果一致
匯總:installment分期金額越大,int_rate貸款利率越高,壞客戶風(fēng)險(xiǎn)越大;但不絕對(duì)
迄今收到的本金total_rec_prncp和installment分期金額交互明顯
匯總:installment分期金額越大,emp_length對(duì)installment分期金額影響不明顯,紅色藍(lán)色點(diǎn)幾乎均勻混雜在一起
總結(jié)
以上是生活随笔為你收集整理的金融风控实战—模型可解释之shap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lesson 16.1016.1116.
- 下一篇: Lesson 16.1416.15 Go