2016-07-05 227 views
6

希望我读这个错误,但在XGBoost库documentation,有注意到使用feature_importances_提取功能重要性属性很像sklearn的随机森林。功能重要性与XGBClassifier

然而,出于某种原因,我不断收到此错误: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_ 

看来你可以通过调用get_fscore使用Booster对象计算功能的重要性属性。我使用XGBClassifier而不是Booster的唯一原因是它能够被包裹在sklearn管道中。有关功能提取的任何想法?有没有人遇到过这种情况?

+0

我无法重现与您的代码段的问题。你有什么版本的XGBoost? – BrenBarn

+0

从我的'pip freeze',我有'xgboost == 0.4a30' –

+0

这是否有帮助? https://www.kaggle.com/mmueller/liberty-mutual-group-property-inspection-prediction/xgb-feature-importance-python/评论 –

回答

13

正如评论所示,我怀疑你的问题是一个版本问题。但是,如果你不想/不能更新,那么下面的函数应该适合你。

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} 
+0

有趣的方法!但是,如果我调整“XGBClassifer”的参数,会否影响?我将如何确保它与您在XGBClassifer()对象中引用booster()对象的Booster' –

+0

的参数相匹配,以便匹配:'xgb.booster()' – David

+0

我意识到一些奇怪的东西,并且是应该发生的?从xgb.booster()。get_fscore()返回的值应该包含模型所训练的所有列的值?因为我发现imp_vals中缺少2列,这些列出现在列列中,但不是imp_cols –

5

我找到了答案。看来版本0.4a30没有feature_importance_属性。因此,如果您使用pip install xgboost来安装xgboost软件包,您将无法从XGBClassifier对象中进行特征提取,如果需要解决方法,可以参考@David的答案。

不过,我所做的是通过克隆回购和运行. ./build.sh其中feature_importance_属性工程将安装版本0.4从源头上构建它。

希望这可以帮助别人!