问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于SHAP进行特征选择和贡献度计算——可解释性机器学习

创作时间:
作者:
@小白创作中心

基于SHAP进行特征选择和贡献度计算——可解释性机器学习

引用
CSDN
1.
https://blog.csdn.net/qq_41301570/article/details/140998319

SHAP(SHapley Additive exPlanations)是一个Python包,用于解释任何机器学习模型的输出。SHAP的名称源自合作博弈论中的Shapley值,它构建了一个加性的解释模型,将所有特征视为“贡献者”。对于每个预测样本,模型会产生一个预测值,而SHAP值则表示该样本中每个特征的贡献度。

假设第i个样本为Xi,第i个样本的第j个特征为Xij,模型对该样本的预测值为yi,整个模型的基线(通常是所有样本的目标变量的均值)为ybase,那么SHAP值服从以下等式:

yi=ybase+f(Xi1)+f(Xi2)+⋯+f(Xik)

其中f(Xij)表示第i个样本中第j个特征的SHAP值。从直观上看,f(Xi1)表示第i个样本中第1个特征对最终预测值yi的贡献。当f(Xj1)>0时,说明该特征提升了预测值,有正向作用;反之,则说明该特征降低了预测值,有反向作用。

解释器Explainer

在SHAP中进行模型解释需要先创建一个explainer,SHAP支持很多类型的explainer(例如deep、gradient、kernel、tree、sampling等),以tree为例,它支持常用的XGB、LGB、CatBoost等树集成算法。

explainer = shap.TreeExplainer(model) # 这里的model在准备工作中已经完成建模,模型名称就是model
shap_values = explainer.shap_values(X) # 传入特征矩阵X,计算SHAP值

上面的shap_values对象是一个包含两个array的list。第一个array是负向结果的SHAP值,而第二个array是正向结果的SHAP值。通常从预测正向结果的角度考虑模型的预测结果,所以会拿出正向结果的SHAP值(拿出shap_values[1])。

局部可解释性Local Interper,Local可解释性提供了预测的细节,侧重于解释单个预测是如何生成的。它可以帮助决策者信任模型,并且解释各个特征是如何影响模型单次的决策。

使用例子

import xgboost as xgb
from sklearn.model_selection import train_test_split
import shap
import pandas as pd

data = pd.read_csv('example.csv')
X = data[['A', 'B', 'C', 'D', 'E']]
Y = data['F']

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, shuffle=False)

xgb_model = xgb.XGBRegressor(random_state=42)
xgb_model.fit(X_train, Y_train)

explainer = shap.Explainer(xgb_model)
shap_values = explainer(X_test)

shap.summary_plot(shap_values)  # 提琴图
shap.plots.bar(shap_values)  # Bar Plot
shap.plots.bar(shap_values.cohorts(2).abs.mean(0))  # 队列图
shap.plots.heatmap(shap_values[1:1000])  # 热图
shap.plots.waterfall(shap_values[0])  # 瀑布图

shap.initjs()

explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_test)

def p(j):
    return(shap.force_plot(explainer.expected_value, shap_values[j,:], X_test.iloc[j,:]))

p(0)

shap_values = explainer.shap_values(X_test)[1]
shap.decision_plot(explainer.expected_value, shap_values, X_test)

可视化结果


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号