XGBoost:如何获取编码后DataFrame的特征名用于绘制特征重要性图
解决方法
你可以直接调用ColumnTransformer自带的get_feature_names_out()方法获取编码后的完整特征名,适配现有代码的操作步骤如下:
步骤1:调用方法获取编码后特征名
在完成encoder = cat_transform.fit(X_train)拟合后,直接执行以下代码:
encoded_feature_names = encoder.get_feature_names_out()
得到的encoded_feature_names就是长度为420的特征名数组,默认命名规则为:
- 独热编码后的分类特征命名格式为
cat__原特征名_类别值,例如cat__cat1_男、cat__cat2_本科 - 未参与编码的数值型特征命名格式为
remainder__原特征名
如果你觉得前缀多余,可以通过参数调整生成的特征名格式,调整后的转换器定义如下:
cat_transform = ColumnTransformer( [('cat', OneHotEncoder(handle_unknown='ignore'), cat_vars)], remainder='passthrough', verbose_feature_names_out=False # 关闭转换器前缀 )
调整后生成的特征名会去掉前缀,分类特征直接展示为原特征名_类别值,数值特征直接展示为原始特征名。
步骤2:修改绘图代码完成可视化
将你原来的绘图代码替换为以下内容即可:
import matplotlib.pyplot as plt import numpy as np # 获取特征重要性并按重要性排序 importances = xgb.feature_importances_ indices = np.argsort(importances) # 升序排列适配横向柱状图展示逻辑 plt.figure(figsize=(12, 15)) plt.barh(encoded_feature_names[indices], importances[indices]) plt.xlabel('特征重要性') plt.title('XGBoost特征重要性排序') plt.show()
注意:如果你的scikit-learn版本低于1.0,需要升级到1.0及以上版本才能使用
get_feature_names_out()方法,升级命令为pip install -U scikit-learn
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

