2017-07-31 3 views
0

J'ai du mal à obtenir un modèle XGBoost pour prédire le temps d'engagement d'un article à partir de son texte. Tout d'abord, je reçois un dataframe représentant les caractéristiques que j'extrait de l'article comme celui-ci:XGBoost: Mismatch de noms de caractéristiques

article_features = pd.concat([tfidf_df, numeric_df_normalized], axis=1) 

Je puis train mon modèle et obtenir les bonnes colonnes pertinentes (caractéristiques):

with open('correct_columns') as fp: 
     correct_columns = pickle.load(fp) 

Puis je passe par toutes les fonctionnalités nécessaires et les mettre à 0.0 si elles ne sont pas déjà en article_features:

for col in correct_columns: 
     if col not in article_features.columns: 
      article_features[col] = 0.0 

Enfin, supprimer des fonctionnalités qui étaient extrac cié de cet article qui n'existent pas dans les données de formation:

for col in article_features: 
    if col not in correct_columns: 
     del article_features[col] 

Alors maintenant article_features a le bon nombre de caractéristiques. J'essaie de courir:

model.predict(article_features) 

Et je reçois:

ValueError: feature_names mismatch:... 

Je Google et essayer convertir mon dataframe à:

model.predict(article_features.as_matrix()) 

Mais je reçois la même erreur.

J'étais alors inquiet ordre des colonnes dans article_features ne pas être le même que correct_columns donc je l'ai fait:

article_features.sort_index(axis=1, inplace=True) 

mais nous avons eu la même erreur.

Une idée de réparation?

Merci!

+0

Comment avez-vous formé le 'model'? Je veux dire quelles caractéristiques ont été utilisées dans cela? Exactement ces caractéristiques devraient être présentes lors de la prédiction sinon cela n'aurait aucun sens. –

Répondre

0

L'idée est que les données que vous utilisez pour adapter le modèle contiennent exactement les mêmes caractéristiques que les données que vous avez utilisées pour former le modèle.

Enfin, je supprimer des fonctionnalités qui ont été extraites de cet article qui ne sont pas existent dans les données de formation: .... Alors maintenant article_features a le bon nombre de caractéristiques. ....

Qu'en est-il des fonctionnalités présentes dans les données que vous utilisez pour adapter le modèle mais pas dans les données que vous avez utilisées pour la formation?

0

Le problème se produit en raison de DMatrix..num_col() renvoyant uniquement la quantité de colonnes non nulles dans une matrice clairsemée. Par conséquent, si les deux données de test & du train ont la même quantité de colonnes non nulles, tout fonctionne correctement. Sinon, vous vous retrouvez avec des listes de noms de fonctionnalités différentes.Il sont actuellement trois solutions pour contourner ce problème:

  1. réaligner les colonnes noms des dataframe de train et dataframe de test à l'aide

    test_df = test_df[train_df.columns] 
    
  2. enregistrer le premier modèle, puis charger le modèle

  3. modifier les données d'essai en réseau avant l'alimentation dans le modèle:

    use test_df.values 
    

    au lieu de

    test_df