一文带您了解SHAP:机器学习的模型解释

在机器学习和数据科学领域,模型的可解释性一直是研究者和实践者关注的焦点。随着深度学习和集成方法等复杂模型的广泛应用,理解模型的决策过程变得尤为重要。可解释人工智能(Explainable AI | XAI)通过提高模型的透明度,帮助建立对机器学习模型的信任和信心。

提高模型的透明度可以通过多种复杂模型的广泛应用等方法来实现,以及用于解释模型的决策过程。这些方法包括特征重要性分析、模型预测区间估计、局部可解释性算法等。特征重要性分析可以通过评估模型对输入特征的影响程度来解释模型的决策过程。模型预测区间估计可以提供模型预测的确定性信息。局部可解释性算法可以帮

xai是一套工具和框架,用于理解和解释机器学习模型如何做出决策。其中,python中的shap(shapley additive explanations)库是一个非常有用的工具。shap库能够量化特征对单个预测及整体预测的贡献,并提供美观且易于使用的可视化功能。

接下来,我们将概括介绍下SHAP库的基础知识,以理解在Scikit-learn中构建的回归和分类模型的预测。

SHAP 和SHAP values

SHAP(Shapley Additive Explanations)是一种解释任何机器学习模型输出的博弈论方法。它利用经典的博弈论博弈值及其相关扩展,将最优的信用分配与局部解释相结合(详细信息和引用请参阅相关论文:https://github.com/shap/shap#citations)。SHAP通过计算每个特征对模型输出的贡献,从而提供最优的信用分配和局部解释。这种方法可以应用于各种模型类型,包括线性模型、树模型、深度学习模型等。SHAP的目标是提供一种直观且可解释的方式,帮助人们理解机器学习模型的决策过程,以及各个特征对于预测结果的影响程度。通过使用SHAP值和相关扩展,我们可以获得更准确、全面的特征重要性解释,并对模型的预

SHAP+ values可以帮助我们量化特征对预测的贡献。SHAP值越接近于零,表示该特征对预测的贡献越小;而SHAP值越远离零,表示该特征对预测的贡献越大。此外,SHAP值还可以告诉我们特征对预测的贡献大小。当SHAP值接近于零时,表示该特征对预测的贡献很小;而当SHAP值远离零时,

安装shap 包:

pip install shap-i https://pypi.tuna.tsinghua.edu.cn/simple

我们看下面的示例:如何在回归问题中获取特征的SHAP值。我们将从加载库和示例数据开始,然后快速构建一个模型来预测糖尿病的进展情况:

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import (RandomForestRegressor, RandomForestClassifier)import shapshap.initjs()# Import sample datadiabetes = load_diabetes(as_frame=True)X = diabetes['data'].iloc[:, :4] # Select first 4 columnsy = diabetes['target']# Partition dataX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)print(f"Training features shape: {X_train.shape}")print(f"Training target shape: {y_train.shape}\n")print(f"Test features shape: {X_test.shape}")print(f"Test target shape: {y_test.shape}")display(X_train.head())# Train a simple modelmodel = RandomForestRegressor(random_state=42)model.fit(X_train, y_train)

一种常见的获取SHAP值的方法是使用Explainer对象。接下来创建一个Explainer对象,并为测试数据提取shap_test值:

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Shap values length: {len(shap_test)}\n")print(f"Sample shap value:\n{shap_test[0]}")

shap_test的长度为89,因为它包含了每个测试实例的记录。从查看第一个测试记录中,我们可以看到它包含三个属性:

shap_test[0].base_values:目标的基准值

shap_test[0].data:每个特征的值

shap_test[0].values:每个对象的SHAP值

  • 基准值:基准值(shap_test.base_values),也称为期望值(explainer.expected_value),是训练数据中目标值的平均值。
print(f"Expected value: {explainer.expected_value[0]:.1f}")print(f"Average target value (training data): {y_train.mean():.1f}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.1f}")

  • shap_test.data 包含与 X_test 相同的值
(shap_test.data == X_test).describe()

  • values:shap_test 最重要的属性是 values 属性,因为我们可以通过它访问 SHAP 值。让我们将 SHAP 值转换为 DataFrame,以便于操作:
shap_df = pd.DataFrame(shap_test.values,  columns=shap_test.feature_names,  index=X_test.index)shap_df

可以看到每条记录中每个特征的 SHAP 值。如果将这些 SHAP 值加到期望值上,就会得到预测值:

np.isclose(model.predict(X_test),  explainer.expected_value[0] + shap_df.sum(axis=1))

现在我们已经有了 SHAP 值,可以进行自定义可视化,如下图所示,以理解特征的贡献:

columns = shap_df.apply(np.abs).mean()\ .sort_values(ascending=False).indexfig, ax = plt.subplots(1, 2, figsize=(11,4))sns.barplot(data=shap_df[columns].apply(np.abs), orient='h', ax=ax[0])ax[0].set_title("Mean absolute shap value")sns.boxplot(data=shap_df[columns], orient='h', ax=ax[1])ax[1].set_title("Distribution of shap values");plt.show()

左侧子图显示了每个特征的平均绝对 SHAP 值,而右侧子图显示了各特征的 SHAP 值分布。从这些图中可以看出,bmi 在所使用的4个特征中贡献最大。

Shap 内置图表

虽然我们可以使用 SHAP 值构建自己的可视化图表,但 shap 包提供了内置的华丽可视化图表。在本节中,我们将熟悉其中几种选择的可视化图表。我们将查看两种主要类型的图表:

  • 全局:可视化特征的整体贡献。这种类型的图表显示了特征在整个数据集上的汇总贡献。
  • 局部:显示特定实例中特征贡献的图表。这有助于我们深入了解单个预测。
  • 条形图/全局:对于之前显示的左侧子图,有一个等效的内置函数,只需几个按键即可调用:
shap.plots.bar(shap_test)

这个简单但有用的图表显示了特征贡献的强度。该图基于特征的平均绝对 SHAP 值而生成:shap_df.apply(np.abs).mean()。特征按照从上到下的顺序排列,具有最高平均绝对 SHAP 值的特征显示在顶部。

  • 总结图/全局:另一个有用的图是总结图:
shap.summary_plot(shap_test)

以下是解释这张图的指南:

  • 图的横轴显示了特征的 SHAP 值分布。每个点代表数据集中的一个记录。例如,我们可以看到对于 BMI 特征,点的分布相当散乱,几乎没有点位于 0 附近,而对于年龄特征,点更加集中地分布在 0 附近。
  • 点的颜色显示了特征值。这个额外的维度允许我们看到随着特征值的变化,SHAP 值如何变化。换句话说,我们可以看到关系的方向。例如,我们可以看到当 BMI 较高时(由热粉色点表示)SHAP 值倾向于较高,并且当 BMI 较低时(由蓝色点表示)SHAP 值倾向于较低。还有一些紫色点散布在整个光谱中。
  • 热力图/全局:热力图是另一种可视化 SHAP 值的方式。与将 SHAP 值聚合到平均值不同,我们看到以颜色编码的个体值。特征绘制在 y 轴上,记录绘制在 x 轴上:
shap.plots.heatmap(shap_test)

这个热力图的顶部还补充了每个记录的预测值(即 f(x))的线图。

  • Force plot/全局:这个交互式图表允许我们通过记录查看 SHAP 值的构成。
shap.initjs()shap.force_plot(explainer.expected_value, shap_test.values, X_test)

就像热力图一样,x 轴显示每个记录。正的 SHAP 值显示为红色,负的 SHAP 值显示为蓝色。例如,由于第一个记录的红色贡献比蓝色贡献多,因此该记录的预测值将高于期望值。

交互性允许我们改变两个轴。例如,y 轴显示预测值 f(x),x 轴根据输出(预测)值排序,如上面的快照所示。

  • 条形图/局部:现在我们将看一下用于理解个别案例预测的图表。让我们从一个条形图开始:
shap.plots.bar(shap_test[0])

与“ 条形图/全局 ”中完全相同,只是这次我们将数据切片为单个记录。

  1. Force plot/局部:Force plot是单个记录的强制图。
shap.initjs()shap.plots.force(shap_test[0])

分类模型的SHAP values/图表

上面示例是回归模型,下面我们以分类模型展示SHAP values及可视化:

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierimport shapfrom sklearn.datasets import fetch_openml# 加载 Titanic 数据集titanic = fetch_openml('titanic', version=1, as_frame=True)df = titanic.frame# 选择特征和目标变量features = ['pclass', 'age', 'sibsp', 'parch', 'fare']df = df.dropna(subset=features + ['survived'])# 删除包含缺失值的行X = df[features]y = df['survived']# 分割数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林分类器model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)

和回归模型一样的,shap values 值也是包括base_values 和values 值:

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Length of shap_test: {len(shap_test)}\n")print(f"Sample shap_test:\n{shap_test[0]}")print(f"Expected value: {explainer.expected_value[1]:.2f}")print(f"Average target value (training data): {y_train}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.2f}")shap_df = pd.DataFrame(shap_test.values[:,:,1],  columns=shap_test.feature_names,  index=X_test.index)shap_df

我们仔细检查一下将 shap 值之和添加到预期概率是否会给出预测概率:

np.isclose(model.predict_proba(X_test)[:,1],  explainer.expected_value[1] + shap_df.sum(axis=1))

内置图与回归模型是一致的,比如:

shap.plots.bar(shap_test[:,:,1])

或者瀑布图如下:

shap.plots.waterfall(shap_test[:,:,1][0])

示例

看一个具体的用例。我们将找出模型对幸存者预测最不准确的例子,并尝试理解模型为什么会做出错误的预测:

test = pd.concat([X_test, y_test], axis=1)test['probability'] = model.predict_proba(X_test)[:,1]test['order'] = np.arange(len(test))test.query("survived=='1'").nsmallest(5, 'probability')

生存概率为第一个记录的746。让我们看看各个特征是如何对这一预测结果产生贡献的:

ind1 = test.query("survived=='1'")\ .nsmallest(1, 'probability')['order'].values[0]shap.plots.waterfall(shap_test[:,:,1][ind1])

主要是客舱等级和年龄拉低了预测值。让我们在训练数据中找到类似的例子:

pd.concat([X_train, y_train], axis=1)[(X_train['pclass']==3) & (X_train['age']==29) & (X_train['fare'].between(7,8))]

所有类似的训练实例实际上都没有幸存。现在,这就说得通了!这是一个小的分析示例,展示了 SHAP 如何有助于揭示模型为何会做出错误预测。

在机器学习和数据科学中,模型的可解释性一直备受关注。可解释人工智能(XAI)通过提高模型透明度,增强对模型的信任。SHAP库是一个重要工具,通过量化特征对预测的贡献,提供可视化功能。本文介绍了SHAP库的基础知识,以及如何使用它来理解回归和分类模型的预测。通过具体用例,展示了SHAP如何帮助解释模型错误预测。

以上就是一文带您了解SHAP:机器学习的模型解释的详细内容,更多请关注昆居客【www.kunjuke.com】AI人工智能频道。

相关推荐:

月之暗面 K2.7 Code 高速版模型正式登陆 Kimi Code,成为常驻可选模式

7 月 11 日消息,月之暗面官方昨晚宣布,K2.7 Code 高速版结束 Beta,成为常驻可选模式。订阅 Allegretto 及以上会员计划的用户,在 Kimi Code CLI 或其他工具中使用 Coding Plan 进行编程时,无需任何申请,可以直接调用 K2.7 Code HighSpeed。官方表示,K2.7 Code HighSpeed 在 Coding Plan 中的用量消耗是...

阶跃星辰端侧模型全家桶 Step Edge 登场,面向手机、汽车等终端场景

感谢网友 Skyraver 的线索投递! 7 月 12 日消息,阶跃星辰今天宣布推出 Step Edge 端侧模型全家桶,包含 Step Edge 基础模型、Step Edge Audio、Step Edge GUI 和 Step Edge Gen 四款产品。了解到,这四款模型面向手机、汽车等终端场景,旨在让 Agent 不只停留在云端,而是能够真正进入终端,在本地更快响应、更好保护隐私,并通过端...

Meta 发布多模态推理模型 Muse Spark 1.1,强化 AI 智能体任务能力

7 月 12 日消息,Meta 于 7 月 9 日正式发布适用于 AI 智能体的多模态推理模型 Muse Spark 1.1 版本,重点提升了模型在智能体任务中的规划、协同与执行能力,并增强了工具调用、代码开发、应用操作能力。Meta 表示,Muse Spark 1.1 强化了多智能体协作机制,由主智能体负责收集信息、制定计划,再将任务拆分并分配给多个子智能体并行执行,从而缩短复杂项目的处理时间。...

商汤发布并开源 SenseNova-Vision 理解生成统一视觉大模型,能力超越 Vision Banana

7 月 13 日消息,商汤科技今日发布并全面开源日日新 SenseNova-Vision 理解生成统一视觉大模型,这是商汤日日新大模型体系的重要视觉能力升级。商汤科技表示,行业以往的 " 统一视觉 " 多是把检测、分割、深度预测等多个专家模型打包封装,本质还是割裂的。SenseNova-Vision 的核心变革是:让视觉成为通用基础模型的原生能力,彻底融入大模型体系。所有经典视觉任务如目标检测、图...

更精准地预测飓风,微软 Aurora 1.5 天气预报模型发布

7 月 10 日消息,据科技媒体 Neowin 昨天报道,微软现已正式发布 Aurora 1.5 天气预报模型,新增 22 种变量,支持小时级预测。与上一代模型相比,Aurora 1.5 模型在精确度等方面有所提升。测试结果显示,该模型在海伦妮飓风的路径预测的中位数路径误差率,相比以往低了三分之一。同时在各项指标中,以 88.9% 的准确率优于 ECMWF(注:欧洲中期天气预报中心)模型。Auro...

影石拓竹官宣合作,国产影像行业首次开源产品 3D 模型

7 月 10 日消息,影石今日宣布联合拓竹发起创意挑战赛,面向全球创作者征集 Luna Ultra 云台相机的 3D 打印创意配件。在拓竹 3D 打印模型社区 MakerWorld 上,影石已开设官方账号,并上传了 Luna Ultra 云台相机的完整 3D 模型,用户可免费下载,自行打印整机或分拆打印遥控屏、云台等部件。这是影像行业品牌首次以官方身份向第三方平台开源完整产品 3D 模型。据赛事介...

前沿 AI 模型竞争激烈:在 ECI 榜单上只能维持约 7 周领先地位

7 月 8 日消息,科技媒体 The Decoder 昨日(7 月 7 日)发布博文,报道称在 Epoch Capabilities Index(ECI)榜单榜首更迭中,前沿模型只能维持约 7 周领先地位。注:Epoch Capabilities Index 主要汇总评估语言模型的整体能力表现,整合多项能力信号为统一刻度,便于比较不同模型在不同时间点的相对位置,常用于观察头部模型的领先周期、能力跃...

凯迪拉克官宣将行业首发量产 Momenta R7 世界模型

7 月 8 日消息,2026 年 7 月 8 日(今天),Momenta 正式在香港联合交易所主板挂牌上市,股票代码为“6880.HK”。凯迪拉克官方今日发文祝贺 Momenta 港股上市,并宣布将行业首发量产 R7 世界模型。据此前报道,Momenta 合伙人、研发 SVP 夏炎今年 4 月在发布会上对 Momenta R7 强化学习世界模型的技术架构进行了深度拆解。夏炎指出,物理 AI 的核心...