Dummy-Variablen, wenn nicht alle Kategorien vorhanden sind
Habe ich eine Reihe von dataframes, wo eine der Spalten enthält einen kategorischen Variablen. Ich möchte konvertieren, um mehrere dummy-Variablen, in dem Fall würde ich normalerweise verwenden get_dummies
.
Was passiert, ist, dass get_dummies
schaut auf die Daten, die in jeder dataframe, um herauszufinden, wie viele Kategorien es gibt, und schaffen so die entsprechende Anzahl von dummy-Variablen. Jedoch in dem problem, das ich jetzt arbeite, habe ich eigentlich im Voraus wissen, was die möglichen Kategorien sind. Aber wenn man bei jeder dataframe individuell, nicht alle Kategorien zwangsläufig erscheinen.
Meine Frage ist: gibt es eine Möglichkeit zu passieren, um get_dummies
(oder eine gleichwertige Funktion) die Namen der Kategorien, so dass für die Kategorien, die nicht in einem bestimmten dataframe, es würde nur zu erstellen, die eine Spalte 0EN?
Etwas damit wäre dieses:
categories = ['a', 'b', 'c']
cat
1 a
2 b
3 a
Werden diese:
cat_a cat_b cat_c
1 1 0 0
2 0 1 0
3 1 0 0
- Sie sind auf der Suche für die
sklearn.OneHotEncoder
. Schau mal hier: scikit-learn.org/stable/modules/generated/... get_dummies
implementiert die gleiche Funktionalität wieOneHotEncoder
, mit dem zusätzlichen Vorteil, dass der Ausgang ist leicht zu verstehen, pandas dataframe mit beschrifteten Spalten anstatt einem einfachenndarray
.- Hatte ich falsch verstanden, die Frage. Danke!
- Ich denke, für das Modell-training, es ist nicht notwendig, um diesen Schritt durchführen. Wenn eine Kategorie fehlt, die in den Trainingsdaten, wenn Sie porivde eine Spalte mit Nullen, oder nicht, Ihr Modell wird nicht lernen, was hilfreich, um Vorhersagen für die test-Instanzen enthalten, die variable.
- Die Anzahl der Fälle, in denen dies nicht notwendig ist, ist ziemlich klein. Für die ersten Prototypen, die es vielleicht nicht werden, aber für jede Produktions-code, den Sie wollen würde, um sicherzustellen, dass alle Modell-Eingänge haben die gleichen Spalten.
- Dies hängt davon ab, die Daten, die sagen, Sie haben ein Modell, sondern für eine einzelne Kategorie einen neuen Wert scheint ziemlich plötzlich. In diesem Fall wird Ihr Modell noch in der Lage sein, um Vorhersagen für solche Werte. Allerdings, wenn Sie Kodieren die Kategorien manuell, Ihr Modell wird Fehler produzieren. Die Frage ist, was gewünscht wird. Alles was ich sage ist: wissen Sie vielleicht noch nicht alle Eingabe-Werte vorher. Darüber hinaus, wenn die Umschulung das Modell, die neuen Werte für die Kategorien sind natürlich behandelt das Modell.
- Gerade über jedes Modell, das ich kennen erfordert die konsequente Dimensionalität der Eingangsdaten. Wenn Sie nicht Kodieren die Kategorien als unten, müssen Sie eine änderung in der Räumlichkeit, wenn "ein neuer Wert erscheint ziemlich plötzlich".
- Zumindest bei diese Methode, wenn ein Wert angezeigt wird, das war unbekannt vor, es wird keine neue Spalte für die es - Zeile werden alle Nullen. Das garantiert die konsequente Dimensionalität. Als ein beiseite, ist es wahrscheinlich eine gute Idee, dass nur Kategorien angezeigt, die in einem Trainings-set, wie die Behandlung von neuen Kategorien, die unvorhersehbar sein können in zahlreichen Modellen.
- genau, zusätzlich z.B. piRSquared Lösung haben den gleichen Vorteil. Es gibt keine Notwendigkeit, im Vorbeigehen das Potenzial der Kategorie Ebenen, um get_dummies. Allerdings, wenn dataframes kombiniert werden müssen und get_dummies muss aufgerufen werden, aus welchem Grund auch immer, bevor die Kombination, ich gebe zu, es kann notwendig sein, um zu wissen, die Kategorie-Ebenen Voraus. Wenn die get_dummies Aufruf geschieht in einem späten pipeline wird es im Allgemeinen nicht erforderlich sein, übergeben Sie die Kategorie Ebenen durch das Verhalten, das du oben beschrieben
- Das Verhalten, die ich oben beschrieben habe ist genau das ein Grund, um passieren die Kategorien - wenn Sie nicht, eine zusätzliche Spalte erstellt werden, für neue Spalten, die wahrscheinlich einen Fehler auslösen, es sei denn, Sie absichtlich fallen lassen, an welcher Stelle könnten Sie genauso gut bestanden haben, die Kategorien ausdrücklich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Über die Umsetzung und die Neuindizierung
reindex
'scolumns
Schlagwort (d.h.dummies.reindex(columns=cats)
), brauchen Sie nicht zu tun das doppelte transponieren.reindex
hat einefill_value
parameter, die tut, was Sie getan haben, mit derfillna
. So, die Zeile, bevor Sie drucken das Ergebnis kann durchgeführt werden mit:dummies = dummies.reindex(columns=cats, fill_value=0)
.Ja, es ist! Pandas besitzt eine spezielle Art von Serie nur für kategorische Daten. Eines der Attribute dieser Serie ist die Möglichkeit, bei Kategorien, die
get_dummies
berücksichtigt. Hier ist ein Beispiel:Dann
get_dummies
wird genau das tun, was Sie wollen!Gibt es eine Reihe von anderen Möglichkeiten zum erstellen einer kategorialen
Series
oderDataFrame
dies ist nur die eine, finde ich am bequemsten. Sie können Lesen Sie über alle von Ihnen in die pandas Dokumentation.EDIT:
Habe ich nicht befolgt, die genaue Versionierung, aber es war ein bug wie pandas behandelt sparse-Matrizen, zumindest bis version 0.17.0. Es wurde korrigiert in der version 0.18.1 (veröffentlicht im Mai 2016).
Version 0.17.0, wenn Sie versuchen, dies zu tun mit der
sparse=True
option mit einemDataFrame
die Spalte von Nullen für die fehlenden dummy-variable wird eine SpalteNaN
, und es wird konvertiert, um zu dichten.Versuchen Sie dies:
columns=cats
imget_dummies
hier nicht wirklich etwas tun. Diecolumns
option für die Auswahl einer Teilmenge der ursprünglichen Daten-frame, den Sie möchten, kodiert mit dummy-Variablen. Es scheint, Sie zu ignorieren, wenn die angeforderten Spalten erscheinen nicht in den Daten-frame. Es scheint, wie es sollte, wird ein Fehler erzeugt, aber es funktioniert nichtIch glaube nicht, dass
get_dummies
bietet das out of the box, es ermöglicht nur das erstellen eines extracolumn
dass highlightsNaN
Werte.Hinzufügen der fehlenden
columns
sich, Sie könnte verwendenpd.concat
entlangaxis=0
vertikal 'stack' dasDataFrames
(die dummy-Spalten plus eineDataFrame
id
) und erstellt automatisch fehlende Spalten, verwenden Siefillna(0)
zu ersetzen der fehlenden Werte, und verwenden Sie dann.groupby('id')
zu trennen die verschiedenenDataFrame
wieder.get_dummies
, aber die einzige andere alternative, die ich fand, warsklearn
'sOneHotEncoder
die scheint nicht viel weiterhelfen...)get_dummies
aus und erstellen Sie alle0
-1
Spalten sich basierend auf der Kategorie-Spalte selbst. Ich denke, das hängt ein bißchen von der Größe des Problems.Habe ich diese Frage an die pandas github. Stellt sich heraus, es ist wirklich einfach zu umgehen, wenn man definiert die Spalte als einen
Categorical
hier definieren Sie, in allen möglichen Kategorien.get_dummies()
den rest machen dann wie erwartet.Hinzufügen der fehlenden Kategorie in den test-Satz:
Beachten Sie, dass dieser code auch die Spalte entfernen, die aus der Kategorie in den test-Datensatz jedoch nicht im Trainings-Datensatz
Wie vorgeschlagen, die von anderen - Konvertieren Sie Ihre Kategorialen Funktionen "Kategorie" Daten-Typ sollte nach beheben der unsichtbaren label Problem mit 'get_dummies'.