尝试创建汇总图时,二元分类中 SHAP 值的数组形状不正确

问题描述 投票:0回答:1

我正在尝试使用 SHAP 为随机森林分类模型制作一个非常简单的汇总图。只是为了看看语法是否正确,我生成了一个玩具示例,并将随机森林分类器拟合到数据中。

shap version: 0.45.0
Python version: 3.10.12
import shap
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# Generate synthetic data
X, y = make_classification(n_samples=500, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# Train a RandomForest model
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

从这里开始,我尝试使用SHAP的树解释器来基于此模型创建形状值。

# Create a SHAP TreeExplainer
explainer = shap.TreeExplainer(model)

# Calculate SHAP values for the test set
shap_values = explainer.shap_values(X_test)

根据文档,这将返回以下内容:

“对于具有单个输出的模型,这会返回一个 SHAP 值矩阵(# 个样本 x # 个特征)。每一行的总和等于该样本的模型输出与模型输出的预期值(存储在解释器的预期值属性(当它为常量时)。对于具有向量输出的模型,这将返回此类矩阵的列表,每个输出一个。”

我原以为这将是一个单一输出模型(因为这是一个二元分类问题),但返回的对象似乎表现得像一个多类分类模型。我尝试检查形状并得到以下结果:

X_test shape: (125,20)
shap_values shape: (125, 20, 2)

尝试使用这些值运行摘要绘图命令会给我一个奇怪的 2 x 2 图像,我将其包含在下面。

shap.summary_plot(shap_values, X_test, plot_type="bar", max_display=None)

我不确定到底是什么导致了这种情况,除了可能采用的是单个类别的概率而不是平坦的预测。

python classification random-forest shap
1个回答
0
投票

事实证明,它实际上是将问题视为多类分类问题。为了获得正确的绘图,您需要选择所需类别的形状值 - 在二元分类的情况下,使用以下方法完成:

# Create a Tree SHAP explainer and calculate SHAP values
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[:,:,1], X_test)

考虑到形状值的形状,这是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.