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

如何在SKLearn XGBoost中获取名义分类特征的整体特征重要性?

原始名义特征的整体特征重要性计算方法

在使用独热编码处理名义分类特征后,要获取原始特征的整体重要性完全可行,其中求和是更合理的选择,具体说明如下:

核心逻辑

独热编码后的每一列都是原始名义特征的子维度,模型输出的各子列重要性,本质是原始特征在不同类别上的贡献拆分。将同一原始特征下所有子列的重要性整合,就能得到原始特征的整体影响力。

两种计算方式对比

  • 求和(推荐):把同一原始特征对应的所有独热编码列的feature_importances_值相加。这种方式能直接反映原始特征对模型决策的总贡献,是行业内通用做法。比如race特征的race_1、race_2、race_3三列重要性之和,就是race这个原始特征的整体重要性。
  • 取平均:对同一原始特征的所有独热编码列重要性取平均值。这种方式仅能体现原始特征下单个类别的平均贡献,无法反映原始特征的整体影响力——如果某个原始特征类别数量多,平均值会稀释其总贡献,因此不适合用来衡量原始特征的整体重要性。

实操代码示例

通过Pipeline和分组统计可快速实现:

import pandas as pd
from xgboost import XGBClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 假设X_train是训练集,y_train是标签,categorical_features是名义特征列表
categorical_features = ["race", "gender"]

# 构建预处理+模型的Pipeline
preprocessor = ColumnTransformer(
    transformers=[
        ("cat", OneHotEncoder(sparse_output=False), categorical_features)
    ],
    remainder="passthrough"
)

model = Pipeline(steps=[
    ("preprocessor", preprocessor),
    ("classifier", XGBClassifier())
])

model.fit(X_train, y_train)

# 获取编码后的特征名称与对应重要性
encoded_feature_names = preprocessor.get_feature_names_out()
feature_importances = model.named_steps["classifier"].feature_importances_

# 构建DataFrame并匹配原始特征
importance_df = pd.DataFrame({
    "encoded_feature": encoded_feature_names,
    "importance": feature_importances
})
# 从编码特征名中提取原始特征(比如"cat__race_White"提取为"race")
importance_df["original_feature"] = importance_df["encoded_feature"].apply(
    lambda x: x.split("__")[1].split("_")[0]
)

# 按原始特征分组求和,得到整体重要性
original_importance = importance_df.groupby("original_feature")["importance"].sum().sort_values(ascending=False)
print(original_importance)

内容的提问来源于stack exchange,提问作者Mehrnoosh Dadashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:49