如何用SHAP值整体解释高概率预测集合的特征重要性?
分析分类器在高概率预测样本中的特征重要性
背景信息
我在训练数据上拟合了一个分类器,测试最优模型时,预测了其中一类的概率,并将X_test和y_test按该概率降序排列。
核心问题
我想了解分类器在生成概率最高的500个预测结果时,哪些特征起到重要作用及作用程度(而非针对单个预测)。请问以下代码是否适用于此需求?
y_test_probas = clf.predict_proba(X_test)[:, 1] explainer = shap.Explainer(clf, X_train) # <-- 这里传入分类器训练时用的X? top_n_indices = np.argsort(y_test_probas)[-500:] shap_values = explainer(X_test.iloc[top_n_indices]) # <-- 这里传入我需要计算SHAP值的X? shap.plots.bar(shap_values)
我的需求和SHAP官方文档示例有两点不同:
- 文档用分类器训练数据,我想用测试数据
- 文档用全部数据集,我只想用数据集的子集
最小可复现代码
import numpy as np import pandas as pd import shap from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 加载泰坦尼克号生存数据集 data = pd.read_csv("https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv") # 数据预处理 data = data.drop(["Name"], axis=1) data = data.dropna() data["Sex"] = (data["Sex"] == "male").astype(int) # 划分特征(X)和目标变量(y) X = data.drop("Survived", axis=1) y = data["Survived"] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 拟合随机森林分类器 clf = RandomForestClassifier().fit(X_train, y_train) # 获取正类的预测概率 y_test_probas = clf.predict_proba(X_test)[:, 1] # 筛选出预测概率最高的500个测试样本的索引 top_n_indices = np.argsort(y_test_probas)[-500:] # 用分类器和训练集初始化SHAP解释器 explainer = shap.Explainer(clf, X_train) # 计算top500样本的SHAP值 shap_values = explainer(X_test.iloc[top_n_indices, :]) # 绘制SHAP条形图 shap.plots.bar(shap_values)
我不想了解分类器对所有预测的决策逻辑,只想关注概率最高的预测结果。请问上述代码是否适用?若不适用,正确代码应如何编写?
解答
你的代码完全适用于你的需求,原因如下:
- SHAP解释器初始化逻辑:用
X_train初始化shap.Explainer是正确的——SHAP需要训练数据作为"背景分布",用来对比解释样本的特征影响,这和你之后用测试子集计算SHAP值并不冲突。 - 子集计算SHAP值:针对筛选出的top500高概率测试样本计算SHAP值,再用
shap.plots.bar()绘制,这个条形图会自动汇总这500个样本的特征SHAP值绝对值的均值,正好能反映这些样本中各特征的平均重要程度,完全符合你"关注高概率预测结果的特征作用"的需求。
唯一需要注意的细节:如果你的top500样本数量超过了测试集总样本数(比如泰坦尼克号测试集可能不足500),代码会自动取所有测试样本,这时候可以根据实际数据调整-500:为合理的数量,比如-len(X_test):或者更小的数值。
内容的提问来源于stack exchange,提问作者DataJanitor
相关产品推荐
相关产品推荐

