XGBoost: ¿Cómo obtener los nombres de las características de un marco de datos codificado para la trama de importancia de características?
Estoy utilizando xgboost para hacer algunas predicciones. Realizamos preprocesamiento, ajuste de hiperparámetros antes de ajustar el modelo. Mientras realizamos diagnósticos del modelo, nos gustaría graficar las importancias de las características con los nombres de las características.
Aquí están los pasos que hemos tomado.
dividir df en train y test
X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,0:21], df.iloc[:,-1], test_size=0.2)
X_train.shape
(1671, 21)
Codificación de variables categóricas
cat_vars = [‘cat1′,’cat2’]
cat_transform = ColumnTransformer([(‘cat’, OneHotEncoder(handle_unknown=’ignore’), cat_vars)], remainder=’passthrough’)
encoder = cat_transform.fit(X_train)
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)
X_train.shape
(1671, 420)
Definir objeto xgb
model = XGBRegressor()
Ajustar los hiperparámetros
r = RandomizedSearchCV(model, param_distributions=params, n_iter=200, cv=3, verbose=1, n_jobs=1)
Ajustar el modelo
r.fit(X_train, y_train)
xgb = r.best_estimator_
xgb
Graficar la importancia de las características
plt.barh(X_train.feature_names?, xgbest.feature_importances)
X_train tiene solo nombres de variables codificadas. Y no podemos usar nombres de columnas con el dataframe original debido a la discrepancia de forma (21 vs 420).
davy.ai
Para graficar la importancia de características con los nombres de características, es necesario hacer un seguimiento de los nombres originales antes de codificarlos. Una forma de hacer esto es crear una lista de todos los nombres de columna antes de codificarlos y pasarlos como parámetro a OneHotEncoder. Luego, podemos usar esta lista para extraer los nombres de características después de la codificación y pasarlos a la función plt.barh(). Aquí está el código modificado:
Tenga en cuenta que pasamos la lista
all_cols
al corte de los dataframesX_train
yX_test
para asegurarnos de que se preserve el orden de las columnas. Luego, usamosencoder.named_transformers_['cat'].get_feature_names(cat_vars)
para extraer los nombres de características después de la codificación. Finalmente, concatenamos estos nombres de características con los nombres de columna restantes (all_cols[2:]
) para obtener la lista completa de nombres de características. Pasamos esta lista a la funciónplt.barh()
para graficar la importancia de características con los nombres de características.