web-dev-qa-db-fra.com

Importance des fonctionnalités avec XGBClassifier

J'espère que je ne comprends pas bien, mais dans la bibliothèque XGBoost documentation , il est noté l'extraction des attributs d'importance des fonctionnalités à l'aide de feature_importances_, un peu comme la forêt aléatoire de sklearn.

Cependant, pour une raison quelconque, je continue à avoir cette erreur: AttributeError: 'XGBClassifier' object has no attribute 'feature_importances_'

Mon extrait de code est ci-dessous:

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_

Il semble que vous puissiez calculer l'importance des fonctionnalités à l'aide de l'objet Booster en appelant l'attribut get_fscore. La seule raison pour laquelle j'utilise XGBClassifier sur Booster est qu'elle peut être encapsulée dans un pipeline Sklearn. Des idées sur les extractions de fonctionnalités? Quelqu'un d'autre rencontre ce problème?

8
Minh Mai

Comme les commentaires l'indiquent, je soupçonne que votre problème est lié à la gestion des versions. Cependant, si vous ne voulez pas/ne pouvez pas mettre à jour, alors la fonction suivante devrait fonctionner pour vous.

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}
16
David

J'ai découvert la réponse. Il semble que la version 0.4a30 ne possède pas d'attribut feature_importance_. Par conséquent, si vous installez le package xgboost à l'aide de pip install xgboost, vous ne pourrez pas extraire de fonctionnalités à partir de l'objet XGBClassifier, vous pouvez vous reporter à la réponse de @ David si vous souhaitez une solution de contournement.

Cependant, ce que j'ai fait est de le construire à partir de la source en clonant le référentiel et en exécutant . ./build.sh, ce qui installera la version 0.4 où l'attribut feature_importance_ fonctionne.

J'espère que cela aide les autres! 

6
Minh Mai

Pour xgboost, si vous utilisez xgb.fit(), vous pouvez utiliser la méthode suivante pour obtenir l’importance des fonctionnalités.

import pandas as pd
xgb_model=xgb.fit(x,y)
xgb_fea_imp=pd.DataFrame(list(xgb_model.get_booster().get_fscore().items()),
columns=['feature','importance']).sort_values('importance', ascending=False)
print('',xgb_fea_imp)
xgb_fea_imp.to_csv('xgb_fea_imp.csv')

from xgboost import plot_importance
plot_importance(xgb_model, )
3
rosefun

Obtenir l’importance des fonctionnalités sous forme de bloc de données trié

import pandas as pd
import numpy as np
def get_xgb_imp(xgb, feat_names):
    imp_vals = xgb.booster().get_fscore()
    feats_imp = pd.DataFrame(imp_vals,index=np.arange(2)).T
    feats_imp.iloc[:,0]= feats_imp.index    
    feats_imp.columns=['feature','importance']
    feats_imp.sort_values('importance',inplace=True,ascending=False)
    feats_imp.reset_index(drop=True,inplace=True)
    return feats_imp

feature_importance_df = get_xgb_imp(xgb, feat_names)
1
Ioannis Nasios