web-dev-qa-db-fra.com

ValueError: non-concordance des noms de caractéristiques: dans xgboost dans la fonction Predict ()

J'ai formé un modèle XGBoostRegressor. Lorsque je dois utiliser ce modèle expérimenté pour prévoir une nouvelle entrée, la fonction Predict () génère une erreur de concordance feature_names, bien que le vecteur d'entité en entrée présente la même structure que les données d'apprentissage.

De plus, afin de construire le vecteur de caractéristiques dans la même structure que les données d'apprentissage, je fais beaucoup de traitements inefficaces, tels que l'ajout de nouvelles colonnes vides (si les données n'existent pas), puis la réorganisation des colonnes de données de sorte qu'elles correspondent aux structure de formation. Existe-t-il un moyen plus efficace de formater l’entrée de manière à ce qu’elle corresponde à la structure de formation?

8
Sujay S Kumar

D'après ce que j'ai pu trouver, la fonction de prévision ne prend pas le DataFrame (ou une matrice fragmentée) en entrée. C'est l'un des bugs qui peuvent être trouvés ici https://github.com/dmlc/xgboost/issues/1238

Afin de résoudre ce problème, utilisez la fonction as_matrix () dans le cas d'un DataFrame ou toarray () dans le cas d'une matrice fragmentée.

C'est la seule solution de contournement jusqu'à ce que le bogue soit corrigé ou que la fonctionnalité soit mise en œuvre de manière différente.

5
Sujay S Kumar

Je suis tombé sur le même problème et il a été résolu en ajoutant le nom de colonne train dataframe au fichier data test en ajoutant le code suivant: 

test_df = test_df[train_df.columns]
3
CathyQian

J'ai également eu ce problème lorsque j'ai utilisé Pandas DataFrame (représentation non épars).

J'ai converti les données de formation et de test en numpy ndarray.

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

Voilà comment je me suis débarrassé de cette erreur!

3
Abhishek Sharma

Vérifiez l'exception. Ce que vous devriez voir sont deux tableaux. L’un correspond aux noms des colonnes de la structure de données que vous transmettez et l’autre aux noms des fonctionnalités XGBoost. Ils devraient être la même longueur. Si vous les mettez côte à côte dans une feuille de calcul Excel, vous verrez qu'elles ne sont pas dans le même ordre. Je suppose que les noms XGBoost ont été écrits dans un dictionnaire. Ce serait donc un hasard si les noms de deux tableaux étaient alors dans le même ordre. 

La solution est facile. Réorganisez simplement vos colonnes de données pour qu'elles correspondent aux noms XGBoost:

f_names = model.feature_names
df = df[f_names]
2
GDB

Essayez de convertir les données en ndarray avant de les transmettre pour qu'elles correspondent/prédisent. Par exemple: Si les données de votre train sont train_df et les données de test sont test_df. Utilisez le code ci-dessous:

train_x = train_df.values
test_x = test_df.values

Maintenant adapter le modèle:

xgb.fit(train_x,train_y)

Enfin, prédisez:

pred = xgb.predict(test_x)

J'espère que cela t'aides!

0
saurabh kumar

Faites cela en créant le DMatrix for XGB:

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

Ne passez pas X_train et X_test directement.

0
Saurabh