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 nombres de características, aunque el vector de características de entrada tiene la misma estructura que los datos de entrenamiento.
Además, para construir 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 los datos no existen) y luego reorganizar las columnas de datos para que coincidan con el estructura de entrenamiento. ¿Existe una forma mejor y más limpia de formatear la entrada para que coincida con la estructura de entrenamiento?
Este es el caso en el que el orden de los nombres de las columnas durante la construcción del modelo es diferente del orden de los nombres de las columnas durante la puntuación del modelo.
He utilizado los siguientes pasos para superar este error.
Primero cargue el archivo pickle
model = pickle.load(open("saved_model_file", "rb"))extraer todas las columnas con el orden en que se usaron
cols_when_model_builds = model.get_booster().feature_namesreordenar el marco de datos de pandas
pd_dataframe = pd_dataframe[cols_when_model_builds]Intente convertir los datos en ndarray antes de pasarlos a fit/predict. 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.valuesAhora ajuste el modelo:
xgb.fit(train_x,train_y)Finalmente, predecir:
pred = xgb.predict(test_x)¡Espero que esto ayude!
También tuve este problema cuando usé pandas DataFrame (representación no dispersa).
Convertí los datos de entrenamiento y prueba en numpy ndarray .
`X_train = X_train.as_matrix() X_test = X_test.as_matrix()`¡Así me deshice de ese error!