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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

金融风控实战—模型可解释之shap

發布時間:2025/4/5 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 金融风控实战—模型可解释之shap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import time import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split import xgboost import pandas as pd import numpy as np #混淆矩陣計算 from sklearn import metrics from sklearn.metrics import roc_curve, auc,roc_auc_score from sklearn.metrics import precision_score from sklearn.metrics import accuracy_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score

readFileName="data_Q5_filter.xlsx" #讀取excel data=pd.read_excel(readFileName) X=data.loc[:,"installment":"emp_length"] y=data["target"] train_x, test_x, y_train, y_test=train_test_split(X,y,test_size=0.3,random_state=0)model = xgboost.XGBClassifier(eval_metric=['logloss','auc','error'],use_label_encoder=False) model.fit(train_x,y_train) #XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1, # colsample_bynode=1, colsample_bytree=1, # eval_metric=['logloss', 'auc', 'error'], gamma=0, gpu_id=-1, # importance_type='gain', interaction_constraints='', # learning_rate=0.300000012, max_delta_step=0, max_depth=6, # min_child_weight=1, missing=nan, monotone_constraints='()', # n_estimators=100,n_jobs=8,num_parallel_tree=1,random_state=0, # reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1, # tree_method='exact', use_label_encoder=False, # validate_parameters=1, verbosity=None)

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 庫的主要解釋器接口。它采用模型和掩碼的任意組合,并返回一個可調用的子類對象,該對象實現所選的特定估計算法。

import shap shap.initjs() # notebook環境下,加載用于可視化的JS代碼 explainer1 = shap.Explainer(model) shap_values1 = explainer1(X) shap_values1 #.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) # #.base_values = #array([-4.852247, -4.852247, -4.852247, ..., -4.852247, -4.852247, # -4.852247], dtype=float32) # #.data = #array([[3.24230e+02, 4.78340e+02, 3.24230e+02, ..., 1.58000e+02, # 1.00000e+00, 0.00000e+00], # [8.49200e+01, 1.13980e+02, 8.49200e+01, ..., 1.40000e+02, # 2.00000e+00, 1.00000e+01], # [2.76490e+02, 2.83370e+02, 2.76490e+02, ..., 4.00000e+00, # 4.00000e+00, 0.00000e+00], # ..., # [1.69830e+02, 5.79600e+02, 1.69830e+02, ..., 1.47000e+02, # 1.60000e+01, 1.00000e+01], # [3.27680e+02, 1.19947e+03, 3.27680e+02, ..., 6.10000e+01, # 2.00000e+00, 1.10000e+01], # [3.56080e+02, 1.10657e+03, 3.56080e+02, ..., 1.44000e+02, # 1.20000e+01, 2.00000e+00]]) shap_values1[0] #.values = #array([ 0.12214637, 0.5763162 , 0.09239966, 0.6356046 , -0.922258 , # 0.17202896, 0.7647206 , -0.12842692, -0.24789801, -0.8769324 , # -0.10680736, -0.07461585, 0.05956555, -0.08578542, 0.00583912], # dtype=float32) # #.base_values = #-4.852247 # #.data = #array([3.2423e+02, 4.7834e+02, 3.2423e+02, 6.3985e+02, 1.0330e-01, # 6.3985e+02, 1.6151e+02, 2.7500e+02, 6.1500e+00, 2.8000e+05, # 1.7631e+04, 4.6000e+01, 1.5800e+02, 1.0000e+00, 0.0000e+00])

SHAP瀑布圖
可視化第一個預測的解釋:

shap.plots.waterfall(shap_values1[0])

#max_display顯示y軸展現變量數量,默認參數是10 shap.plots.waterfall(shap_values1[0],max_display=20)

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時,表示該特征提升了預測值,也正向作用;反之,說明該特征使得預測值降低,有反作用。

#第二條記錄 shap.plots.waterfall(shap_values1[1])

shap.plots.waterfall(shap_values1[3])


由于瀑布圖只顯示一個樣本值的數據,我們無法看到變量的動態變化帶來的影響

我們用散點圖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的負貢獻最大

# 可視化第一個prediction的解釋 如果不想用JS,傳入matplotlib=True shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

explainer.expected_value #-4.852247 shap.force_plot(explainer.expected_value, shap_values[1,:], X.iloc[1,:])


個圖是直接由shap values繪成的,可以比較第一個樣本的shap values具體數值:所以就算不繪制force plot,直接獲取樣本的shap values,就可以知道每個特征值是如何貢獻得到模型預測值的。

sample_0_shap = pd.DataFrame(X.iloc[0,:]) sample_0_shap.rename(columns={0: 'feature_value'}, inplace=True) sample_0_shap['shap_value'] = shap_values[0] sample_0_shap.sort_values('shap_value', ascending=False)

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散點圖繪制效果一致

shap.dependence_plot('installment', shap_values, X, interaction_index='installment')

shap.dependence_plot('int_rate', shap_values, X, interaction_index=None)

shap.dependence_plot('installment', shap_values, X, interaction_index='int_rate')


匯總:installment分期金額越大,int_rate貸款利率越高,壞客戶風險越大;但不絕對

shap.dependence_plot('installment', shap_values, X, interaction_index='total_rec_prncp')


迄今收到的本金total_rec_prncp和installment分期金額交互明顯

shap.dependence_plot('installment', shap_values, X, interaction_index='emp_length')


匯總:installment分期金額越大,emp_length對installment分期金額影響不明顯,紅色藍色點幾乎均勻混雜在一起

總結

以上是生活随笔為你收集整理的金融风控实战—模型可解释之shap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。