XGBClassifier的功能重要性

发布于 2021-01-29 17:19:45

希望我读错了,但是在XGBoost库文档中,有注释说明了使用feature_importances_sklearn的随机森林很像地提取特征重要性属性。

但是,由于某种原因,我不断收到此错误: AttributeError: 'XGBClassifier' object has no attribute 'feature_importances_'

我的代码段如下:

from sklearn import datasets
import xgboost as xg
iris = datasets.load_iris()
X = iris.data
Y = iris.target
Y = iris.target[ Y < 2] # arbitrarily removing class 2 so it can be 0 and 1
X = X[range(1,len(Y)+1)] # cutting the dataframe to match the rows in Y
xgb = xg.XGBClassifier()
fit = xgb.fit(X, Y)
fit.feature_importances_

看来您可以Booster通过调用get_fscore属性使用该对象来计算功能重要性。我使用XGBClassifier过度的唯一原因Booster是因为它能够包裹在sklearn管道中。关于特征提取有什么想法吗?还有其他人遇到这个吗?

关注者
0
被浏览
286
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如评论所示,我怀疑您的问题是版本问题。但是,如果您不想/不能更新,那么以下功能应该为您工作。

    def get_xgb_imp(xgb, feat_names):
        from numpy import array
        imp_vals = xgb.booster().get_fscore()
        imp_dict = {feat_names[i]:float(imp_vals.get('f'+str(i),0.)) for i in range(len(feat_names))}
        total = array(imp_dict.values()).sum()
        return {k:v/total for k,v in imp_dict.items()}
    
    
    >>> import numpy as np
    >>> from xgboost import XGBClassifier
    >>> 
    >>> feat_names = ['var1','var2','var3','var4','var5']
    >>> np.random.seed(1)
    >>> X = np.random.rand(100,5)
    >>> y = np.random.rand(100).round()
    >>> xgb = XGBClassifier(n_estimators=10)
    >>> xgb = xgb.fit(X,y)
    >>> 
    >>> get_xgb_imp(xgb,feat_names)
    {'var5': 0.0, 'var4': 0.20408163265306123, 'var1': 0.34693877551020408, 'var3': 0.22448979591836735, 'var2': 0.22448979591836735}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看