web-dev-qa-db-fra.com

Conservez la même variable muette dans les données d'apprentissage et de test

Je construis un modèle de prévision en python avec deux ensembles distincts de formation et de test. Les données d'apprentissage contiennent une variable catégorique de type numérique, par exemple, Code postal, [91521,23151,12355, ...], ainsi que des variables catégoriques de chaînes, par exemple, city ['Chicago', 'New York', 'Los Angeles', ...] 

Pour former les données, j'utilise d'abord 'pd.get_dummies' pour obtenir la variable muette de ces variables, puis adapte le modèle aux données d'apprentissage transformées.

Je fais la même transformation sur mes données de test et je prédis le résultat à l'aide du modèle formé. Cependant, j'ai l'erreur 'ValueError: le nombre d'entités du modèle doit correspondre à l'entrée. Le modèle n_features est 1487 et l'entrée n_features est 1345 '. La raison en est qu'il y a moins de variables nominales dans les données de test, car elles comportent moins de "ville" et de "code postal". 

Comment puis-je résoudre ce problème? Par exemple, 'OneHotEncoder' encodera uniquement toutes les variables catégorielles de type numérique. 'DictVectorizer ()' n'encodera que toutes les variables catégorielles de type chaîne. Je cherche en ligne et vois quelques questions similaires mais aucune d’entre elles ne répond vraiment à ma question.

Gestion des fonctionnalités catégoriques à l'aide de scikit-learn

https://www.quora.com/If-the-training-dataset-has-more-variables-than-the-test-dataset- what-does-one-do

https://www.quora.com/What-is-the-best-way-to-do-a-binary-one-hot-one-of-K-coding-in-Python

22
nimning

Vous pouvez également obtenir les colonnes manquantes et les ajouter à l'ensemble de données de test:

# Get missing columns in the training test
missing_cols = set( train.columns ) - set( test.columns )
# Add a missing column in test set with default value equal to 0
for c in missing_cols:
    test[c] = 0
# Ensure the order of column in the test set is in the same order than in train set
test = test[train.columns]

Ce code garantit également que la colonne résultant de la catégorie dans l'ensemble de données de test mais non présente dans l'ensemble de données d'apprentissage sera supprimée

36
Thibault Clement

Supposons que vous ayez des noms d'entités identiques dans le train et dans le jeu de données test. Vous pouvez générer un ensemble de données concaténé à partir de train et de test, obtenir des valeurs factices à partir d'un ensemble de données concaténées et le scinder pour former et tester à nouveau.

Vous pouvez le faire de cette façon:

import pandas as pd
train = pd.DataFrame(data = [['a', 123, 'ab'], ['b', 234, 'bc']],
                     columns=['col1', 'col2', 'col3'])
test = pd.DataFrame(data = [['c', 345, 'ab'], ['b', 456, 'ab']],
                     columns=['col1', 'col2', 'col3'])
train_objs_num = len(train)
dataset = pd.concat(objs=[train, test], axis=0)
dataset_preprocessed = pd.get_dummies(dataset)
train_preprocessed = dataset_preprocessed[:train_objs_num]
test_preprocessed = dataset_preprocessed[train_objs_num:]

En conséquence, vous disposez d'un nombre égal d'entités pour les ensembles de données train et test. 

21
Eduard Ilyasov
train2,test2 = train.align(test, join='outer', axis=1, fill_value=0)

train2 et test2 ont les mêmes colonnes. Fill_value indique la valeur à utiliser pour les colonnes manquantes.

5
user1482030

C'est une question un peu ancienne, mais si vous souhaitez utiliser scikit learn, vous pouvez utiliser la classe DummyEncoder suivante: https://Gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

Ce qu’il fait, c’est qu’il utilise la catégorie dtype pour spécifier les types nuls à créer, également expliqués ici: Création de mannequins en cours de développement avec différents niveaux de formation et d’essai

1
fsociety