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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/4/5 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 金融风控实战—模型可解释之shap 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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 #混淆矩陣計(jì)算 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瀑布圖-展示單個(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ì)算法。

import shap shap.initjs() # notebook環(huán)境下,加載用于可視化的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瀑布圖
可視化第一個(gè)預(yù)測的解釋:

shap.plots.waterfall(shap_values1[0])

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

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ù)測值降低,有反作用。

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

shap.plots.waterfall(shap_values1[3])


由于瀑布圖只顯示一個(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è)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,:])


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

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貸款利率為前三最重要變量

其實(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)圖繪制效果一致

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貸款利率越高,壞客戶風(fēng)險(xiǎn)越大;但不絕對(duì)

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對(duì)installment分期金額影響不明顯,紅色藍(lán)色點(diǎn)幾乎均勻混雜在一起

總結(jié)

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

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