Probleme mit einer binären One-Hot (One-of-K) -Codierung in Python

ei der binären One-Hot-Codierung (auch als One-of-K-Codierung bezeichnet) wird für jeden eindeutigen Wert einer kategorialen Variablen eine binäre Spalte erstellt. Wenn beispielsweise eine Farbspalte (kategoriale Variable) die Werte "Rot", "Blau", "Gelb" und "Unbekannt" annimmt, ersetzt eine binäre One-Hot-Codierung die Farbspalte durch die Binärspalten "color =" rot ',' farbe = blau 'und' farbe = gelb '. Ich beginne mit Daten in einem Pandadatenrahmen und möchte diese Daten verwenden, um ein Modell mit scikit-learn zu trainieren. Ich kenne zwei Möglichkeiten für die binäre One-Hot-Codierung, von denen keine für mich zufriedenstellend ist.

Pandas und get_dummies in den kategorialen Spalten des Datenrahmens. Diese Methode scheint ausgezeichnet zu sein, sofern der ursprüngliche Datenrahmen @ enthälall Daten verfügbar. Das heißt, Sie führen die One-Hot-Codierung durch, bevor Sie Ihre Daten in Trainings-, Validierungs- und Testsätze aufteilen. Wenn die Daten jedoch bereits in verschiedene Gruppen aufgeteilt sind, funktioniert diese Methode nicht sehr gut. Warum? Da einer der Datensätze (z. B. der Testsatz) weniger Werte für eine bestimmte Variable enthalten kann. Beispielsweise kann es vorkommen, dass das Trainingsset die Werte Rot, Blau, Gelb und Unbekannt für die variable Farbe enthält, während das Testset nur Rot und Blau enthält. Das Testset würde also weniger Spalten als das Trainingsset enthalten. (Ich weiß auch nicht, wie die neuen Spalten sortiert sind, und wenn sogar dieselben Spalten vorhanden sind, kann dies in jeder Gruppe in einer anderen Reihenfolge erfolgen.)

Sklearn und DictVectorizer Dies löst das vorherige Problem, da wir sicherstellen können, dass wir dieselbe Transformation auf den Testsatz anwenden. Das Ergebnis der Transformation ist jedoch ein Numpy-Array anstelle eines Pandas-Datenrahmens. Wenn wir die Ausgabe als Pandas-Datenrahmen wiederherstellen möchten, müssen wir (oder zumindest so, wie ich es mache): 1) pandas.DataFrame (data = Ergebnis der DictVectorizer-Transformation, index = Index der ursprünglichen Pandas-Daten frame, columns = DictVectorizer (). get_features_names) und 2) fügen entlang des Index den resultierenden Datenrahmen mit dem ursprünglichen zusammen, der die numerischen Spalten enthält. Das funktioniert, ist aber etwas umständlich.

Gibt es eine bessere Möglichkeit, eine binäre One-Hot-Codierung innerhalb eines Pandas-Datenrahmens durchzuführen, wenn wir unsere Daten in Trainings- und Test-Sets aufteilen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage