金融风控实战—模型可解释之shap
shap.plots.waterfall瀑布圖-展示單個用戶變量影響
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 庫的主要解釋器接口。它采用模型和掩碼的任意組合,并返回一個可調用的子類對象,該對象實現所選的特定估計算法。
SHAP瀑布圖
可視化第一個預測的解釋:
shap公式
基本值(base_value) ,即E[f(x)]是我們傳入數據集上模型預測值的均值,可以通過自己計算來驗證:
現在我們知道每個特征對第一次預測的貢獻。對上圖的解釋: X軸是log-odds對數值
y軸是各個變量的數值
藍色條顯示某一特定特征在多大程度上降低了預測的值。 紅條顯示了一個特定的特征在多大程度上增加了預測值。 例如當total_pymt=639.85時,大大增加壞客戶概率;當int_rate=0.103時,大大減少壞客戶概率
我們應該期望總貢獻等于預測與均值預測的差值。我們來驗證一下: 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時的shap值,當shap值>0時,表示該特征提升了預測值,也正向作用;反之,說明該特征使得預測值降低,有反作用。
由于瀑布圖只顯示一個樣本值的數據,我們無法看到變量的動態變化帶來的影響
我們用散點圖scatter來觀察變量的動態變化
例如installment分期付款金額,整體趨勢是這個值越大,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是一種快速而精確的方法,用于估計樹模型和樹集合的SHAP值,在關于特征依賴性的幾種不同的可能假設下。它依賴于快速的C++實現,既可以在外部模型包內,也可以在本地編譯的C擴展中實現。Tree SHAP 方法在數學上等效于對特征的所有可能排序的預測差異進行平均,而不僅僅是由它們在樹中的位置指定的排序。只有 Tree SHAP 既一致又準確,這并非巧合。
explainer = shap.TreeExplainer(model) # 最新版本的shap對于LGBMClassifier得到的shap_values為兩個數組的列表,即兩個分類的結果,這里使用分類1的結果 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是針對單個樣本預測的解釋,它可以將shap values可視化為force,每個特征值都是一個增加或減少預測的force,預測從基線開始,基線是解釋模型的常數,每個歸因值是一個箭頭,增加(正值)或減少(負值)預測。
紅色的為正貢獻,藍色為負貢獻,對于第一個樣本,由上圖可以解釋為特征total_pymnt=639.9的正貢獻第一,total_pymnt_inv=639.9的正貢獻第二,但是int_rate=0.1033的負貢獻最大
個圖是直接由shap values繪成的,可以比較第一個樣本的shap values具體數值:所以就算不繪制force plot,直接獲取樣本的shap values,就可以知道每個特征值是如何貢獻得到模型預測值的。
shap.plots.bar
#繪圖feature importance shap.summary_plot(shap_values, X, plot_type="bar")匯總:installment分期金額,total_rec_prncp迄今收到金額,int_rate貸款利率為前三最重要變量
其實如果要查看特征值大小與預測影響之間的關系的話,第二種圖還是不夠清楚,所以這里主要講第一種圖,第一種圖其實就是對shap values按照特征維度聚合計算平均絕對值,也就是?,使用該公式去計算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 為每個樣本繪制其每個特征的SHAP值,這可以更好地理解整體模式,并允許發現預測異常值。每一行代表一個特征,橫坐標為SHAP值。一個點代表一個樣本,顏色表示特征值(紅色高,藍色低)。比如,這張圖表明installment分期付款金額值越高,會降提升壞客戶概率
shap.summary_plot(shap_values, X)
Interaction Values
interaction value是將SHAP值推廣到更高階交互的一種方法。樹模型實現了快速、精確的兩兩交互計算,這將為每個預測返回一個矩陣,其中主要影響在對角線上,交互影響在對角線外。這些數值往往揭示了有趣的隱藏關系(交互作用)
#當數據量大時,shap_interaction_values函數調用時非常耗時,建議關閉電腦其他應用,加速計算。 shap_interaction_values = explainer.shap_interaction_values(X) shap.summary_plot(shap_interaction_values, X)dependence_plot
如果要看特征值大小與預測影響之間的關系使用dependence plot更合適,dependence plot清楚地展示了單個特征是如何影響模型的預測結果的,dependence plot同樣有多種使用方式,一種是查看某個特征是如何影響到模型預測結果的,另一種是一個特征是如何和另一個特征交互影響到模型預測結果的。
shap.dependence_plot('installment', shap_values, X, interaction_index=None)
總結:installment分期金額越大,壞客戶概率越高
此圖和scatter散點圖繪制效果一致
匯總:installment分期金額越大,int_rate貸款利率越高,壞客戶風險越大;但不絕對
迄今收到的本金total_rec_prncp和installment分期金額交互明顯
匯總:installment分期金額越大,emp_length對installment分期金額影響不明顯,紅色藍色點幾乎均勻混雜在一起
總結
以上是生活随笔為你收集整理的金融风控实战—模型可解释之shap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lesson 16.1016.1116.
- 下一篇: Lesson 16.1416.15 Go