如何在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
相关产品推荐
相关产品推荐

