You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XGBoost模型的SHAP可视化图中正确显示特征名称?

解决SHAP图中特征名显示的索引越界问题

问题根源

报错index 77810 is out of bounds for axis 0 with size 77810的核心原因是:你传入的X_columns特征名列表长度,与XGBoost模型训练时使用的特征总数不匹配,或者特征名的顺序和拼接后的特征顺序不一致。常见场景包括:

  • 分类列用OneHotEncoder编码后生成的特征数远多于原列数(比如type有5个类别就会生成5个特征),但你只把原列名['type','action']加入了特征名列表,导致总长度不足
  • TF-IDF的特征名数量与TfidfVectorizer输出的特征数不一致(比如误用了旧版本的get_feature_names()而非get_feature_names_out())
  • 拼接稀疏矩阵时的特征顺序,和特征名列表的顺序不对应

分步解决方案

1. 重新生成正确的特征名列表

必须严格按照特征拼接的顺序,生成与矩阵列数完全一致的特征名:

import numpy as np
from scipy.sparse import hstack

# 假设你已完成前置处理:
# - 文本处理:tfidf = TfidfVectorizer(...),text_matrix = tfidf.fit_transform(processed_description)
# - 分类列处理:encoder = OneHotEncoder(sparse_output=True),cat_matrix = encoder.fit_transform(df[['type','action']])
# - 特征拼接:X = hstack([text_matrix, cat_matrix])

# 获取TF-IDF特征名
tfidf_feature_names = tfidf.get_feature_names_out()

# 获取分类列编码后的特征名(OneHotEncoder场景)
cat_feature_names = encoder.get_feature_names_out(['type', 'action'])

# 合并特征名,顺序必须和拼接矩阵的顺序一致
all_feature_names = np.concatenate([tfidf_feature_names, cat_feature_names])

# 关键验证:特征名数量必须等于X的列数
assert len(all_feature_names) == X.shape[1], f"特征名数量({len(all_feature_names)})与特征列数({X.shape[1]})不匹配"

如果分类列用的是LabelEncoder(生成单列数值特征),则直接用原列名即可:

cat_feature_names = ['type', 'action']
all_feature_names = np.concatenate([tfidf_feature_names, cat_feature_names])

2. 用正确的特征名绘制SHAP图

确保SHAP解释器使用的测试集特征数与特征名长度一致,然后传入feature_names参数:

import shap

# 初始化树模型解释器
explainer = shap.TreeExplainer(xgb_model)

# 计算SHAP值(X_test必须是与训练时特征顺序一致的稀疏/稠密矩阵)
shap_values = explainer.shap_values(X_test)

# 绘制汇总图,指定正确的特征名
shap.summary_plot(shap_values, X_test, feature_names=all_feature_names)

# 绘制单样本依赖图时同样指定特征名
shap.dependence_plot("某个特征名", shap_values, X_test, feature_names=all_feature_names)

3. 排查潜在问题

如果仍报错,检查以下几点:

  • 确认训练集/测试集拆分是在特征拼接完成后进行的,拆分后需保证测试集的特征处理逻辑与训练集完全一致(比如TF-IDF只在训练集fit,测试集复用同一个transform)
  • 若使用稀疏矩阵,部分SHAP绘图函数可能需要将矩阵转为稠密格式,可尝试X_test_dense = X_test.toarray()后再传入SHAP
  • 检查XGBoost模型的n_features_in_属性,确认模型训练时的特征数:print(xgb_model.n_features_in_),该值必须等于len(all_feature_names)

内容的提问来源于stack exchange,提问作者Naila Rocha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:55:38