【问题标题】:Names features importance plot after preprocessing预处理后的名称特征重要性图
【发布时间】:2020-08-17 20:21:43
【问题描述】:

在构建模型之前,我会像这样进行缩放

X = StandardScaler(with_mean = 0, with_std = 1).fit_transform(X)

然后建立一个特征重要性图

xgb.plot_importance(bst, color='red')
plt.title('importance', fontsize = 20)
plt.yticks(fontsize = 10)
plt.ylabel('features', fontsize = 20)

问题是我们得到 f0、f1、f2、f3 等而不是特征名称...... 如何返回特征名称?

谢谢

【问题讨论】:

    标签: python xgboost


    【解决方案1】:

    首先我们在预处理之前得到特征名称列表

    dtrain = xgb.DMatrix( X, label=y)
    dtrain.feature_names
    

    然后

    bst.get_fscore()
    mapper = {'f{0}'.format(i): v for i, v in enumerate(dtrain.feature_names)}
    mapped = {mapper[k]: v for k, v in bst.get_fscore().items()}
    mapped
    xgb.plot_importance(mapped, color='red')
    

    就是这样

    【讨论】:

    • bstXGBClassifier 的实例时,我需要使用bst.booster().get_score().items() 而不是bst.get_fscore().items()
    • 我需要使用 bst.get_booster().get_score().items()
    【解决方案2】:

    您可以通过以下方式检索 Xgboost 模型(使用 scikit-learn 类似 API 进行训练)的重要性:

    xgb.feature_importances_
    

    要检查它的重要性类型:xgb.importance_type。重要性类型可以在 Xgboost 构造函数中设置。您可以在 post 中了解在 Xgboost 中计算特征重要性的方法。

    【讨论】:

      【解决方案3】:

      对于 xgboost 0.82,答案很简单,只需用特征名称字符串列表覆盖特征名称属性即可。

      trained_xgbmodel.feature_names = feature_name_list
      xgboost.plot_importance(trained_xgbmodel)
      

      【讨论】:

      • 仅供参考,对于最新版本的 xgboost,上一个答案对我不起作用。
      猜你喜欢
      • 2017-11-14
      • 2018-12-06
      • 2019-08-10
      • 1970-01-01
      • 2022-12-19
      • 2021-09-07
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多