ValueError: feature_names discordancia: en xgboost en la función predict ()

He entrenado un modelo XGBoostRegressor. Cuando tengo que usar este modelo entrenado para predecir una nueva entrada, la función predict () arroja un error de desajuste de feature_names, aunque el vector de entidad de entrada tiene la misma estructura que los datos de entrenamiento.

Además, para generar el vector de características en la misma estructura que los datos de entrenamiento, estoy haciendo un procesamiento muy ineficiente, como agregar nuevas columnas vacías (si no existen datos) y luego reorganizar las columnas de datos para que coincidan con las estructura formativa. ¿Existe una forma mejor y más limpia de formatear la entrada para que coincida con la estructura de entrenamiento?

Por lo que pude encontrar, la función de predicción no toma el DataFrame (o una matriz dispersa) como entrada. Es uno de los errores que se pueden encontrar aquí https://github.com/dmlc/xgboost/issues/1238

Para solucionar este problema, use la función as_matrix () en el caso de un DataFrame o toarray () en el caso de una matriz dispersa.

Esta es la única solución alternativa hasta que el error se corrige o la función se implementa de una manera diferente.

También tuve este problema cuando usé Pandas DataFrame (representación no dispersa).

Convierto los datos de entrenamiento y pruebas en una numpy ndarray .

  `X_train = X_train.as_matrix() X_test = X_test.as_matrix()` 

¡Así me deshice de ese error!

Encontré el mismo problema y se resolvió agregando el nombre de la columna del dataframe del tren al dataframe de prueba mediante la adición del siguiente código:

 test_df = test_df[train_df.columns] 

Compruebe la excepción. Lo que deberías ver son dos matrices. Uno es el nombre de la columna del dataframe que está pasando y el otro es el nombre de las características de XGBoost. Deben ser de la misma longitud. Si los coloca uno al lado del otro en una hoja de cálculo de Excel, verá que no están en el mismo orden. Supongo que los nombres de XGBoost se escribieron en un diccionario, por lo que sería una coincidencia si los nombres de las dos matrices estuvieran en el mismo orden.

La solución es fácil. Solo reordena las columnas de tu dataframe para que coincidan con los nombres de XGBoost:

 f_names = model.feature_names df = df[f_names] 

Intente convertir los datos en ndarray antes de pasarlos para ajustar / predecir. Por ejemplo: si los datos de su tren son train_df y los datos de prueba son test_df. Use el siguiente código:

 train_x = train_df.values test_x = test_df.values 

Ahora encaja el modelo:

 xgb.fit(train_x,train_y) 

Finalmente, predice:

 pred = xgb.predict(test_x) 

¡Espero que esto ayude!

Haga esto mientras crea el DMatrix para XGB:

 dtrain = xgb.DMatrix(np.asmatrix(X_train), label=y_train) dtest = xgb.DMatrix(np.asmatrix(X_test), label=y_test) 

No pase X_train y X_test directamente.