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?
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}
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!
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, )
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)