当前位置: 首页 > news >正文

模型解释性:SHAP包的使用

  本篇博客介绍另一种事后可解释性方法:SHAP(SHapley Additive exPlanation)方法。

1. Shapley值理论

  Shapley值是博弈论中的一个概念,通过衡量联盟中各成员对联盟总目标的贡献程度,从而根据贡献程度来进行联盟成员的利益分配,避免了分配的平均主义。
  当Shapley理论用于解释机器学习模型的时候,将输入特征xxx视为参与成员,模型输出的概率分布f(x)f(x)f(x)视为联盟总目标,通过衡量各特征的贡献度来挖掘重要特征,从而提供可解释性判断依据。其数学模型如下:g(Z′)=φ0+∑j=1MφjZj′≈f(x)(1)g(Z^{'})=\varphi_{0}+\sum_{j=1}^{M}\varphi_{j}Z^{'}_{j}\approx f(x) \tag{1}g(Z)=φ0+j=1MφjZjf(x)(1)其中,ggg是解释模型,f(x)f(x)f(x)是原机器学习模型,Zj′={0,1}MZ^{'}_{j}=\{0,1\}^{M}Zj={0,1}M表示相应特征是否被观察到,MMM是输入特征的数目,φi\varphi_{i}φi是每个特征的归因值,φ0\varphi_{0}φ0是解释模型的常数。
  对于一个特定的输入数据x0x_{0}x0,其Shapley值的计算公式如下:φi(f,x0)=∑S⊆NS/{i}∣S∣!(M−∣S∣−1)!∣NS∣![f(S∪{i})−f(S)](2)\varphi_{i}(f,x_{0})=\sum_{S\subseteq N_{S}/ \{i\}}\frac{|S|!(M-|S|-1)!}{|N_{S}|!}[f(S\cup\{i\})-f(S)]\tag{2}φi(f,x0)=SNS/{i}NS!S!(MS1)![f(S{i})f(S)](2)其中,φi(f)\varphi_{i}(f)φi(f)代表函数fff中特征iii的贡献度,NSN_{S}NS是所有特征组成的集合,SSS代表特征子集,NS/{i}N_{S}/\{i\}NS/{i}代表在集合NSN_{S}NS中去除特征iiiS∪{i}S\cup \{i\}S{i}表示子集SSS中增加特征iii∣S∣|S|S表示集合SSS中元素的个数。
  为了方面公式(2)的计算,通常将公式(2)转化为如下公式计算:φi(f,x0)=∑z′∈{0,1}M∣z′∣!(M−∣z′∣−1)!M![fS(z′)−fS(z′∣i)](3)\varphi_{i}(f,x_{0})=\sum_{z^{'}\in\{0,1\}^{M}}\frac{|z^{'}|!(M-|z^{'}|-1)!}{M!}[f_{S}(z^{'})-f_{S}(z^{'}|i)]\tag{3}φi(f,x0)=z{0,1}MM!z!(Mz1)![fS(z)fS(zi)](3)其中,fS=E[f(x)∣zS′]=1N∑j=1Nf(xj′)f_{S}=E[f(x)|z_{S}^{'}]=\frac{1}{N}\sum_{j=1}^{N}f(x_{j}^{'})fS=E[f(x)zS]=N1j=1Nf(xj)其中,zS′z_{S}^{'}zS为集合SSS中特征的取值所组成的集合,NNN为原函数fff训练数据的个数,xj′x_{j}^{'}xj的取值如下:xj′={x0i,Fi∈zS′xji,Fi∉zS′x_{j}^{'}=\left\{\begin{aligned} x_{0i},& F_{i}\in z_{S}^{'} \\ x_{ji},&F_{i}\notin z_{S}^{'} \end{aligned}\right. xj={x0i,xji,FizSFi/zS其中,x0ix_{0i}x0i为待解释数据x0x_{0}x0的第iii个特征值,xjix_{ji}xji表示第jjj个训练数据中第iii个特征的取值,FiF_{i}Fi表示第iii个特征值。
  SHAP值具备扎实的理论基础,但φi\varphi_{i}φi的计算复杂度和E[f(x)∣zS′]E[f(x)|z_{S}^{'}]E[f(x)zS]的有效估计是其在实际应用中的最大阻碍,为了解决这个问题,Lundberg等人提出了Tree SHAP方法。
  Tree SHAP是用于树模型的快速SHAP值估计方法,大大增加了SHAP值的实际应用能力。

2 SHAP包用法

  这里仍然以Boston房价为例,使用XGBoost方法训练模型。其用法举例如下:
模型训练

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split
import shap
shap.initjs()
#分类
boston=load_boston()
X=boston.data
y=boston.target
features=boston.feature_names
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)xgbr=XGBRegressor(n_estimators=200,max_depth=4)
xgbr.fit(X_train,y_train)

对单个样本进行解释

explainer=shap.TreeExplainer(xgbr)
shap_values=explainer.shap_values(X_test[1].reshape(1,-1))
shap.force_plot(explainer.expected_value,shap_values,X_test[1].reshape(1,-1),feature_names=features)

其结果如下:
在这里插入图片描述
关于上图,有以下几个方面需要说明:

  • base_value:全体样本Shape平均值,这里的全体样本指的是模型的训练样本;
  • output_value: 当前样本的Shap输出值,即为模型的预测值;
  • 正向作用特征:红色特征即为正向作用的特征;
  • 反向作用特征:蓝色特征即为反向作用的特征;

整个测试集的Shap分布

explainer=shap.TreeExplainer(xgbr)
shap_values=explainer.shap_values(X_test)
shap.force_plot(explainer.expected_value,shap_values,X_test,feature_names=features)

其结果如下(可以通过调节横纵坐标观察当个特征的效果):
在这里插入图片描述
从特征角度观察样本Shap值

shap.summary_plot(shap_values,X_test,feature_names=features)

其结果如下:
在这里插入图片描述

参考文献

  • 《基于图模型机器学习算法的可解释性技术研究与实现》
  • 《稳定评估机器学习模型可解释性研究》
  • https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/106131890
http://www.lryc.cn/news/5768.html

相关文章:

  • 算法训练营 day45 动态规划 0-1背包理论 分割等和子集
  • SSM框架
  • 教育行业需要什么样的客服系统?
  • 花房集团任命新首席财务官:已跌破IPO发行价,活跃用户下滑
  • 儿童绘本馆图书借阅租赁知识付费小程序源码交流
  • Vue3 中 axios 的安装及使用
  • Django设计模式以及模板层介绍
  • Linux信号一门搞定
  • 手撸一个动态Feign,实现一个“万能”接口调用
  • Linux Capabilities 入门
  • 驱动 day6
  • 附录2-tensorflow目标检测
  • 常见的EMC问题
  • Redis内存存储效率问题
  • 3.28 haas506 2.0开发教程-example-蓝牙多设备扫描(仅支持M320,HD1)
  • C语言经典编程题100例(41~60)
  • git日常使用命令
  • ES6对象展开运算符浅拷贝or深拷贝
  • leaflet 上传包含shp的zip文件,在map上解析显示图形(059)
  • CAN总线详细介绍
  • python如何完成对 Excel文件的解密后读取?
  • 微服务实战--高级篇:RabbitMQ高级
  • autoCAD2022 - 设置新的原点
  • spring boot 配置 mybatis-plus多数据源
  • 独立产品灵感周刊 DecoHack #047 - 安卓手机上最有用的APP
  • 【面试题】JavaScript中递归的理解
  • PyTorch学习笔记
  • SpringBoot2知识点记录
  • Mysql
  • Q4营收利润增长背后估值持续偏低,全球支付巨头PayPal前景如何?