发布时间:2024-04-20 15:01
SHAP主要是解释xgboost这类模型的特征重要性,与预测值的正负性相关
feature importance无法反映特征与预测结果的关系
SHAP是由Shapley value启发的可加性解释模型。对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。 假设第ii个样本为xixi,第ii个样本的第jj个特征为xi,jxi,j,模型对第ii个样本的预测值为yiyi,整个模型的基线(通常是所有样本的目标变量的均值)为ybaseybase,那么SHAP value服从以下等式
yi=ybase+f(xi,1)+f(xi,2)+⋯+f(xi,k)yi=ybase+f(xi,1)+f(xi,2)+⋯+f(xi,k)
其中f(xi,1)f(xi,1)为xi,jxi,j的SHAP值。直观上看,f(xi,1)f(xi,1)就是对yiyi的贡献值,当f(xi,1)>0f(xi,1)>0,说明该特征提升了预测值,也正向作用;反之,说明该特征使得预测值降低,有反作用
Shapley value的核心是边际贡献(margin)
举个例子(参考了这里),A,B,C 3人要完成500行代码,A独立能完成100行,B能完成125行,C能完成50行,A+B能完成270行,B+C350行,A+C375行,3人同时做,要如何发奖金?
边际贡献是每个人的加入对团体起到多少催化效益,而不是他本身带来多少产出,以上3人的组合有6种:
A邀请B,AB再邀请C (A-B-C);B加入后,带来的产出是270-100=170,C加入AB后,带来的产生是500-270=230(3人完成的就是总数500)
A-C-B
B-A-C
B-C-A
C-A-B
C-B-A
A/B/C的催化效益是这6种情况的均值,计算后Shapley(A)=970/6,Shapley(B)=970/6,Shapley(_C)=1060/6
如果用SHAP解释模型,特征C就比A,B重要,如果带来负的效益,就是负相关
在模型中,通常对某条数据改变某个特征的值,看改变后对结果产生了什么影响来判断贡献度
为什么适用于树模型?
参考2
机器学习中,函数有以下3种:
1.线性,单调:这些是最可解释的函数,因为对输入要素的更改会导致目标变量在单个方向(正或负)上成比例变化。这允许我们计算相对特征重要性度量和原因代码。原因代码有助于理解为什么学习模型预测特定输入的高或低。它为我们提供了输入特征预测影响的定性度量,即它是强,弱,正还是负。
2.非线性,单调:机器学习算法学习的大多数响应函数都是非线性的。单调性可确保输入要素的相对变化导致目标变量在单个方向上发生变化。非线性,单调函数也是可解释的,因为它允许我们计算相对特征重要性度量和原因代码。
3.非线性,非单调:这些是现代机器学习算法学习的最常见的函数,并且是最难解释的。这是因为输入变量的变化会导致目标变量在任何方向上以不同的速率发生变化。我们可以为这些函数计算的唯一可解释的度量是相对特征重要性。解释这些功能是本文的重点。
python
安装
pip install shap
import xgboost
from xgboost import XGBClassifier
import shap
shap.initjs()
# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100)
# explain the model's predictions using SHAP values
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# shap_values[0,:],第1条
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
输出的是对某一条数据的特征重要性,红色是促进,蓝色是抑制模型效果
第一条数据,对应的基本预测值是16.49(不是实际的y!)