webentwicklung-frage-antwort-db.com.de

Behalten Sie dieselbe Dummy-Variable in den Trainings- und Testdaten

Ich baue in Python ein Vorhersagemodell mit zwei separaten Trainings- und Testsätzen. Die Trainingsdaten enthalten kategoriale Variablen vom numerischen Typ, z. B. Postleitzahl, [91521, 23151, 12355, ...], und auch kategoriale String-Variablen, z. ...]. 

Um die Daten zu trainieren, verwende ich zuerst die 'pd.get_dummies', um die Dummy-Variable dieser Variablen zu erhalten, und passe dann das Modell an die transformierten Trainingsdaten an.

Ich verwende meine Testdaten auf dieselbe Weise und sage das Ergebnis anhand des trainierten Modells voraus. Ich habe jedoch den Fehler 'ValueError: Die Anzahl der Features des Modells muss mit der Eingabe übereinstimmen. Das Modell n_features ist 1487 und der Eingang n_features ist 1345 '. Der Grund liegt darin, dass die Testdaten weniger Dummy-Variablen enthalten, da es weniger 'Stadt' und 'Postleitzahl' gibt. 

Wie kann ich dieses Problem lösen? Beispielsweise codiert 'OneHotEncoder' nur alle kategorialen Variablen vom numerischen Typ. 'DictVectorizer ()' kodiert nur die kategoriale Variable des String-Typs. Ich suche online und sehe ein paar ähnliche Fragen, aber keine von ihnen beantwortet meine Frage wirklich.

Umgang mit kategorialen Features mit scikit-learn

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

https://www.quora.com/Was-is-der-beste-weg-zum-do-a-binary-one-hot-one-of-K-coding-in-Python

22
nimning

Sie können auch einfach die fehlenden Spalten abrufen und sie dem Test-Dataset hinzufügen:

# 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]

Dieser Code stellt außerdem sicher, dass Spalten, die aus einer Kategorie im Test-Dataset resultieren, aber nicht im Trainings-Dataset vorhanden sind, entfernt werden

36

Angenommen, Sie haben identische Funktionsnamen im Zug- und Test-Dataset. Sie können verkettete Datensätze aus Zug und Test generieren, Dummys aus verketteten Datensätzen abrufen und diese für Training und Test aufteilen.

Sie können es so machen:

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:]

Im Ergebnis verfügen Sie über die gleiche Anzahl von Funktionen für Zug- und Testdatensatz. 

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

train2 und test2 haben die gleichen Spalten. Fill_value gibt den Wert an, der für fehlende Spalten verwendet werden soll.

5
user1482030

Dies ist eine ziemlich alte Frage, aber wenn Sie Scikit Learn API verwenden möchten, können Sie die folgende DummyEncoder-Klasse verwenden: https://Gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

Was er tut, ist, dass er die Kategorie dtype verwendet, um anzugeben, welche Dummys erstellt werden sollen, wie auch hier erläutert: Dummy-Erstellung in Pipeline mit unterschiedlichen Ebenen in Zug und Testsatz

1
fsociety