es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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).

Tags:  ,

Answer

  1. Avatar for 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:

    # Dividir df en entrenamiento y prueba
    X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,0:21], df.iloc[:,-1], test_size=0.2)
    
    # Crear una lista de todos los nombres de columna antes de codificarlos
    all_cols = list(X_train.columns)
    
    # Codificación de variables categóricas
    cat_vars = ['cat1','cat2']
    cat_transform = ColumnTransformer([('cat', OneHotEncoder(handle_unknown='ignore', categories='auto'), cat_vars)], remainder='passthrough')
    
    # Pasar la lista de todos los nombres de columna a OneHotEncoder
    encoder = cat_transform.fit(X_train[all_cols])
    X_train = encoder.transform(X_train[all_cols])
    X_test = encoder.transform(X_test[all_cols])
    
    # Obtener los nombres de características después de la codificación
    feature_names = encoder.named_transformers_['cat'].get_feature_names(cat_vars)
    feature_names = np.concatenate([feature_names, all_cols[2:]])
    
    # Definir objeto xgb
    model = XGBRegressor()
    
    # Ajustar hiperparámetros
    r = RandomizedSearchCV(model, param_distributions=params, n_iter=200, cv=3, verbose=1, n_jobs=1)
    
    # Ajustar modelo
    r.fit(X_train, y_train)
    
    xgb = r.best_estimator_
    
    # Graficar la importancia de características con los nombres de características
    plt.barh(feature_names, xgb.feature_importances_)
    

    Tenga en cuenta que pasamos la lista all_cols al corte de los dataframes X_train y X_test para asegurarnos de que se preserve el orden de las columnas. Luego, usamos encoder.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ón plt.barh() para graficar la importancia de características con los nombres de características.

Comments are closed.