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

