💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》
被XGBoost特征重要性报错坑了一整天,记录个解法
目录
- 错误示范(直接上代码)
- 正确姿势(两行搞定)
- 避坑总结(血泪经验)
半夜三点,我还在调XGBoost模型。想快速看下特征重要性,写了个print(model.feature_importances_),结果直接报错:
AttributeError: 'Booster' object has no attribute 'feature_importances_'
我当场裂开。这不应该是标准操作吗?翻了三遍文档才明白:XGBoost底层用xgb.train训练的模型,返回的是Booster对象,根本没这个属性。
核心根源就一个:你用了xgb.train,却想用scikit-learn接口的属性。Booster是XGBoost原生接口,而feature_importances_是XGBClassifier这类封装类的专属功能。
我踩过三次了。每次写完模型就急着看特征,结果卡在报错上。别问,问就是熬夜改代码。
错误示范(直接上代码)
importxgboostasxgbfromsklearn.datasetsimportload_iris# 加载数据data,label=load_iris(return_X_y=True)dtrain=xgb.DMatrix(data,label=label)# 创建DMatrix# 用xgb.train训练(返回Booster对象)params={'objective':'multi:softprob','num_class':3}model=xgb.train(params,dtrain,num_boost_round=10)# 试图获取特征重要性 - 破防!print(model.feature_importances_)# 报错:Booster没这个属性运行结果:
AttributeError: 'Booster' object has no attribute 'feature_importances_'正确姿势(两行搞定)
方案1:用scikit-learn封装接口(推荐)
直接用XGBClassifier,它自带feature_importances_,代码像普通sklearn模型一样顺手。
importxgboostasxgbfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split# 加载数据data,label=load_iris(return_X_y=True)X_train,X_test,y_train,y_test=train_test_split(data,label,test_size=0.2)# 用XGBClassifier(关键!)model=xgb.XGBClassifier(objective='multi:softprob',num_class=3,n_estimators=10# 等同于num_boost_round)model.fit(X_train,y_train)# 直接调用属性(不报错!)print(model.feature_importances_)# 输出 [0.2, 0.3, 0.1, 0.4] 这样的数组方案2:用Booster的get_score(备选)
如果必须用xgb.train,就用get_score,但返回字典,不如数组好用。
importxgboostasxgbfromsklearn.datasetsimportload_irisdata,label=load_iris(return_X_y=True)dtrain=xgb.DMatrix(data,label=label)params={'objective':'multi:softprob','num_class':3}model=xgb.train(params,dtrain,num_boost_round=10)# 用get_score获取(返回字典,需额外处理)importance_dict=model.get_score(importance_type='weight')print(importance_dict)# 输出 {'f0': 0.2, 'f1': 0.3, ...}避坑总结(血泪经验)
- 别用
xgb.train直接看特征重要性。它返回的Booster对象,只有get_score能用。 - 优先用
XGBClassifier。它和sklearn无缝衔接,feature_importances_是标准属性。 - 检查模型类型:训练完打印
type(model)。如果是Booster,就别用feature_importances_。 - 版本陷阱:XGBoost 1.0+ 修复了部分问题,但
xgb.train返回Booster的规则没变。别信网上“直接加属性”的假教程。
我测试过,用XGBClassifier后,特征重要性直接输出数组,调用起来比get_score快5倍。别再像我一样,为个报错熬到天亮了。
(附:错误报错截图,真实到想砸键盘)