使用 SHAP 使机器学习模型变的可解释!!!

人工智能
SHAP 借鉴了博弈论中 Shapley 值的思想,将模型视为一个合作游戏,特征被视为游戏中的“玩家”,而模型输出(模型预测)是“收益”。

大家好,我是小寒

SHAP 是一种用于解释机器学习模型预测结果的方法,它基于博弈论中的 Shapley值。旨在为每个特征分配一个“贡献值”,表明该特征对模型预测结果的影响有多大。

SHAP 为复杂的黑箱模型(如深度学习模型、集成方法等)提供了一种统一且理论上有保障的解释框架,帮助我们理解模型的决策过程,提高模型的透明度和可信度。

SHAP 的基本概念

SHAP 借鉴了博弈论中 Shapley 值的思想,将模型视为一个合作游戏,特征被视为游戏中的“玩家”,而模型输出(模型预测)是“收益”。

Shap 值的计算过程

SHAP 值的计算依赖于计算所有特征组合的边际贡献。其计算过程如下。

  1. 采样特征子集
    选取包含或不包含特定特征的不同组合,计算其对模型输出的影响。
  2. 计算边际贡献
    比较加入和移除某特征后模型输出值的差异。
  3. 平均边际贡献
    对所有可能组合计算的贡献值取平均,得到特征的 Shap 值。

由于特征组合的数量呈指数级增长,SHAP 使用近似方法(如蒙特卡洛采样、特定模型优化)来减少计算成本。

SHAP 的特点

  1. 一致性
    如果某个特征对预测的影响增加,其 SHAP 值也应增加。
  2. 公平性
    所有特征的贡献之和等于模型的预测值减去基准值(如平均预测值)。
  3. 模型无关性
    可以应用于任何机器学习模型(如 XGBoost、随机森林、深度神经网络等)。
  4. 局部与全局解释能力
  • 局部解释:解释单个预测值的贡献。
  • 全局解释:衡量整个数据集上特征的重要性。

SHAP 的应用

SHAP 广泛应用于解释机器学习模型,以下是常见的应用场景。

  • 特征重要性分析:了解哪些特征对模型预测结果影响最大。
  • 个体预测解释:解释特定样本的预测结果,提供个性化解释。
  • 模型调优:通过 SHAP 分析特征贡献来优化模型。
  • 异常检测:识别在决策过程中导致异常预测的关键特征。

SHAP 的实现方式

SHAP 提供了多种计算方法,适用于不同的模型类型和规模。

  1. Kernel SHAP(通用)
    适用于任意黑盒模型,使用加权线性回归来逼近 SHAP 值,但计算成本较高。
  2. Tree SHAP(决策树专用)
    针对决策树模型(如 XGBoost、LightGBM、Random Forest)进行了优化,计算效率更高。
  3. Deep SHAP(深度学习)
    结合深度学习的梯度信息来估计 SHAP 值。

案例分享

以下是将 SHAP 与复杂的 XGBoost 模型一起使用的示例代码。

首先训练一个 xgboost 模型。

import shap
import xgboost as xgb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 1. 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 训练 XGBoost 模型
model = xgb.XGBRegressor(objective="reg:squarederror", n_estimators=100, max_depth=4, random_state=42)
model.fit(X_train, y_train)

接下来,计算 SHAP 值,并展示所有特征对预测的整体影响。

explainer = shap.Explainer(model, X_train)
shap_values = explainer(X_test)
shap.summary_plot(shap_values, X_test)

图片图片

接下来,使用 force_plot 图,直观展示单个样本的预测分解。

shap.force_plot(explainer.expected_value, shap_values[10].values, X_test.iloc[10], matplotlib=True)

图片图片

使用 Dependence Plot(依赖图) 显示特征 AveRooms 如何影响预测,同时考虑与其他特征的交互效应。

shap.dependence_plot("AveRooms", shap_values.values, X_test)

图片图片

使用 Decision Plot(决策图) 展示特征在决策路径中的累积影响。

shap.decision_plot(explainer.expected_value, shap_values.values[:10], X_test.iloc[:10])

图片图片


责任编辑:武晓燕 来源: 程序员学长
相关推荐

2024-11-04 14:33:04

机器学习SHAP黑盒模型

2019-08-29 18:07:51

机器学习人工智能

2024-05-21 09:45:40

机器学习人工智能XAI

2020-08-19 09:20:00

机器学习人工智能Python

2021-01-08 10:47:07

机器学习模型算法

2020-08-25 10:30:59

TensorFlow数据机器学习

2023-09-20 11:42:44

人工智能AI

2021-06-05 08:04:26

机器学习CARTOptimal

2019-05-13 09:22:21

微软开源机器学习

2021-12-30 20:20:46

机器学习销售语言

2023-11-06 10:50:35

机器学习LIME

2019-11-15 13:52:06

机器学习Shapley计算

2023-08-11 13:54:31

AI因果

2024-05-28 08:00:00

人工智能机器学习

2022-06-07 10:25:45

机器学习Shapash

2018-05-23 09:20:12

人工智能机器学习技术

2024-09-09 11:45:15

ONNX部署模型

2019-10-22 10:12:45

机器学习模型人工智能

2017-07-07 14:41:13

机器学习神经网络JavaScript

2021-11-02 09:40:50

TensorFlow机器学习人工智能
点赞
收藏

51CTO技术栈公众号