将经过One-Hot 编码转换的分类特征的 SHAP 值相加
可直接在橱窗里购买,或者到文末领取优惠后购买:
分类特征需要先进行转换,然后才能用于模型。One-Hot 编码是一种常见的方法:我们最终会得到每个类别的二进制变量。这很好,直到理解使用 SHAP 的模型为止。每个二进制变量都有自己的 SHAP 值。这使得很难理解原始分类特征的整体贡献。
一种简单的方法是将每个二进制变量的 SHAP 值加在一起。这可以解释为原始分类特征的 SHAP 值。我们将向你介绍执行此操作的 Python 代码。我们将看到我们能够使用 SHAP 聚合图。但是,在理解分类特征关系的性质时,这些是有限的。所以,最后我们向你展示如何使用箱线图来可视化 SHAP 值。
如果你不熟悉 SHAP 或 Python 包,我建议你阅读一下之前的这篇文章《[[Python 中的 SHAP 简介]]》。我们将深入探讨如何解释 SHAP 值。我们还探讨了本文中使用的一些聚合。
处理分类变量时还有另一种解决方案。那就是使用 CatBoost 进行建模。关于 CatBoost 如何进行建模,我以后会写一篇相关文章《[[使用 CatBoost 实现分类特征的 SHAP]]》,你可以在其中找到此解决方案。
数据集
为了演示分类特征的问题,我们将使用蘑菇分类数据集。你可以在图 1 中看到此数据集的快照。目标变量是蘑菇的类别。也就是说,蘑菇是有毒 § 还是可食用 (e)。你可以在UCI 的 MLR1中找到此数据集。
对于模型特征,我们有 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)