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

如何从GridSearchCV训练的XGBClassifier生成特征重要性DataFrame?

问题:GridSearchCV训练XGBClassifier后获取特征重要性报错解决

我用scikit-learn的GridSearchCV为XGBClassifier调参,代码如下:

grid_params = {
      'n_estimators' : [100, 500, 1000],
      'subsample' : [0.01, 0.05]
}

est = xgb.Classifier()
grid_xgb = GridSearchCV(param_grid = grid_params,
                        estimator = est,
                        scoring = 'roc_auc',
                        cv = 4,
                        verbose = 0)
grid_xgb.fit(X_train, y_train)

print('best estimator:', grid_xgb.best_estimator_)
print('best AUC:', grid_xgb.best_score_)
print('best parameters:', grid_xgb.best_params_)

需要生成如下格式的特征重要性DataFrame:

variable | importance
---------|-------
x1       | 12.456
x2       | 3.4509
x3       | 1.4456
...      | ...

尝试了以下代码但报错:

f_imp_xgb = grid_xgb.get_booster().get_score(importance_type='gain')
keys = list(f_imp_xgb.keys())
values = list(f_imp_xgb.values())

df_f_imp_xgb = pd.DataFrame(data = values, index = keys, columns = ['score']).sort_values(by='score', ascending = False)

错误信息:

AttributeError: 'GridSearchCV' object has no attribute 'get_booster'

解决方案

错误原因

GridSearchCV是调参容器对象,本身没有get_booster方法,你需要调用其内部训练好的最优模型(即best_estimator_属性),这才是真正的XGBClassifier实例。

方法一:使用XGBoost原生get_score方法(自定义重要性类型)

修正原有代码,通过best_estimator_获取模型后调用get_booster:

import pandas as pd

# 从最优模型中获取特征重要性(指定importance_type,可选'gain'/'weight'/'cover'等)
f_imp_xgb = grid_xgb.best_estimator_.get_booster().get_score(importance_type='gain')

# 转换为要求格式的DataFrame
df_f_imp_xgb = pd.DataFrame({
    'variable': list(f_imp_xgb.keys()),
    'importance': list(f_imp_xgb.values())
}).sort_values(by='importance', ascending=False).reset_index(drop=True)

print(df_f_imp_xgb)

方法二:使用scikit-learn兼容的feature_importances_属性

如果不需要自定义重要性类型,直接用XGBClassifier的feature_importances_属性更简洁:

import pandas as pd

# 获取特征名称和对应重要性
feature_names = X_train.columns
importances = grid_xgb.best_estimator_.feature_importances_

# 生成目标格式的DataFrame
df_f_imp_xgb = pd.DataFrame({
    'variable': feature_names,
    'importance': importances
}).sort_values(by='importance', ascending=False).reset_index(drop=True)

print(df_f_imp_xgb)

两种方法的区别

  • get_score(importance_type='gain'):返回XGBoost原生的特征重要性,可指定计算方式(如gain表示特征带来的平均增益,weight表示特征被用于分裂的次数)。
  • feature_importances_:scikit-learn统一接口的重要性,默认等价于get_score(importance_type='weight'),返回的是每个特征被用于分裂的次数占比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:27:09