分类特征的 SHAP

将经过One-Hot 编码转换的分类特征的 SHAP 值相加
img

分类特征需要先进行转换,然后才能用于模型。One-Hot 编码是一种常见的方法:我们最终会得到每个类别的二进制变量。这很好,直到理解使用 SHAP 的模型为止。每个二进制变量都有自己的 SHAP 值。这使得很难理解原始分类特征的整体贡献。

一种简单的方法是将每个二进制变量的 SHAP 值加在一起。这可以解释为原始分类特征的 SHAP 值。我们将向你介绍执行此操作的 Python 代码。我们将看到我们能够使用 SHAP 聚合图。但是,在理解分类特征关系的性质时,这些是有限的。所以,最后我们向你展示如何使用箱线图来可视化 SHAP 值。

如果你不熟悉 SHAP 或 Python 包,我建议你阅读一下之前的这篇文章《[[Python 中的 SHAP 简介]]》。我们将深入探讨如何解释 SHAP 值。我们还探讨了本文中使用的一些聚合。

处理分类变量时还有另一种解决方案。那就是使用 CatBoost 进行建模。关于 CatBoost 如何进行建模,我以后会写一篇相关文章《[[使用 CatBoost 实现分类特征的 SHAP]]》,你可以在其中找到此解决方案。

数据集

为了演示分类特征的问题,我们将使用蘑菇分类数据集。你可以在图 1 中看到此数据集的快照。目标变量是蘑菇的类别。也就是说,蘑菇是有毒 § 还是可食用 (e)。你可以在UCI 的 MLR1中找到此数据集。

图 1:蘑菇数据集快照

对于模型特征,我们有 22 个分类特征。对于每个特征,类别都用一个字母表示。例如,气味有 9 个独特的类别 - almond (a)、anise (l)、creosote ©, fishy (y), foul (f), musty (m), none (n), pungent §, spicy (s)。这就是蘑菇的气味。

建模

我们将向你介绍用于分析此数据集的代码,你可以在GitHub2上找到完整的脚本。首先,我们将使用下面的 Python 包。我们有一些用于处理和可视化数据的常用包(第 1-5 行)。我们使用 OneHotEncoder 来转换分类特征(第 7 行)。我们使用 xgboost 进行建模(第 10 行)。最后,我们使用 shap 来了解我们的模型是如何工作的(第 12 行)。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('default')

from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import accuracy_score,confusion_matrix

import xgboost as xgb

import shap
shap.initjs()

我们导入数据集(第 2 行)。我们需要一个数值目标变量,因此我们通过设置 toxicous = 1 和 edible = 0 来转换它(第 6 行)。我们还获得了分类特征(第 7 行)。我们不使用 X_cat 进行建模,但它以后会派上用场。

# load data 
data = pd.read_csv(dp + "mushrooms.csv")

# get features
y = data['class']
y = y.astype('category').cat.codes
X_cat = data.drop('class', axis=1)

要使用分类特征,我们还需要对其进行转换。我们首先安装一个编码器(第 2-3 行)。然后我们使用它来转换分类特征(第 6 行)。对于每个分类特征,每个类别都有一个二进制特征。我们为每个二进制特征创建特征名称(第 9 至 10 行)。最后,我们将它们放在一起以创建特征矩阵(第 12 行)。

# fit encoder
enc = OneHotEncoder()
enc.fit(X_cat)

# transform categorical features
X_encoded = enc.transform(X_cat).toarray(
### SHAP分类模型中的应用 SHAPSHapley Additive exPlanations)是一种用于解释机器学习模型预测结果的技术,其核心思想是通过计算特征对模型输出的边际贡献来揭示“黑盒模型”的内部机制[^1]。对于分类问题,SHAP可以用来评估各个特征的重要性以及它们如何影响模型的决策。 #### 特征重要性分析分类模型中,可以通过创建一个`shap.Explainer`对象并使用测试数据生成SHAP值来进行特征重要性分析。以下是具体实现方法: 1. **模型训练** 首先需要构建和训练一个分类模型。例如,在逻辑回归的情况下,可以按照以下方式完成: ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) ``` 2. **创建SHAP解释器** 接下来,定义一个SHAP解释器以便能够计算SHAP值。这里以`KernelExplainer`为例说明: ```python import shap explainer = shap.KernelExplainer(model.predict_proba, X_test_m) shap_values = explainer.shap_values(X_test_m) ``` 上述代码片段展示了如何基于已训练好的模型及其对应的测试数据集生成SHAP值。注意,当处理多类别的分类问题时,`predict_proba`函数返回的是概率估计而非简单的类别标签[^3]。 3. **绘制全局条形图** 使用SHAP提供的绘图功能展示整体上哪些特征最为重要。这一步骤有助于直观理解不同变量在整个样本集合上的平均效应大小。 ```python shap.summary_plot(shap_values, X_test_m, plot_type="bar") ``` 4. **蜂群图可视化** 蜂群图提供了更加细致入微的角度去观察每一个单独实例周围的特征分布情况及其方向性作用力。它能帮助识别特定子群体内的模式差异。 ```python shap.plots.beeswarm(shap_values) ``` 上述过程不仅限于逻辑回归模型,同样适用于其他类型的分类算法如支持向量机(SVM)[^2]等场景下执行类似的特征重要度解析操作。 ### 注意事项 - 对于二元分类任务来说,通常会关注正类(即目标事件发生的情况),因此可能只需要查看其中一个维度下的SHAP值即可满足需求;而对于多元情形,则需分别考察各类别关联的结果表现。 - 计算效率方面考虑较大规模的数据集可能会耗费较多时间资源,此时可尝试采用近似版本或者采样技术降低复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶桁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值