python - predict_proba - Importancia de funciones con XGBClassifier
xgboost plot_importance (2)
Como lo indican los comentarios, sospecho que tu problema es un control de versiones. Sin embargo, si no desea / no puede actualizar, la siguiente función debería funcionar para usted.
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}
Espero que esté leyendo esto mal, pero en la documentación de la biblioteca XGBoost, hay una nota de extracción de los atributos de importancia de la función usando feature_importances_
muy parecido al bosque aleatorio de sklearn.
Sin embargo, por alguna razón, sigo recibiendo este error: AttributeError: ''XGBClassifier'' object has no attribute ''feature_importances_''
Mi fragmento de código está a continuación:
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_
Parece que puede calcular la importancia de las funciones utilizando el objeto Booster
llamando al atributo get_fscore
. La única razón por la que estoy usando XGBClassifier
sobre Booster
es porque puede envolverse en una tubería sklearn. ¿Alguna idea sobre las extracciones de características? ¿Hay alguien más experimentando esto?
Descubrí la respuesta. Parece que la versión 0.4a30
no tiene el atributo feature_importance_
. Por lo tanto, si instala el paquete xgboost utilizando pip install xgboost
, no podrá realizar la extracción de características desde el objeto XGBClassifier
, puede consultar la respuesta de XGBClassifier
si desea una solución alternativa.
Sin embargo, lo que hice fue construirlo desde la fuente clonando el repositorio y ejecutándolo . ./build.sh
. ./build.sh
que instalará la versión 0.4
donde funciona el atributo feature_importance_
.
Espero que esto ayude a otros!