get_dummies Python-Speicherfehler

9

Ich habe ein Problem mit einem Datensatz mit 400.000 Zeilen und 300 Variablen. Ich muss Dummy-Variablen für eine kategorische Variable mit mehr als 3.000 verschiedenen Elementen erhalten. Am Ende möchte ich einen Datensatz mit 3.300 Variablen oder Features haben, damit ich ein RandomForest-Modell trainieren kann.

Hier ist, was ich versucht habe:

%Vor%

Wenn ich das mache, bekomme ich immer einen Speicherfehler. Gibt es eine Grenze für die Anzahl der Variablen, die ich haben kann?

Wenn ich das nur mit den ersten 1.000 Zeilen mache (die 374 verschiedene Kategorien haben), funktioniert es einfach.

Hat jemand eine Lösung für mein Problem? Der Computer, den ich verwende, hat 8 GB Speicher.

    
Duesentrieb 09.07.2015, 15:27
quelle

1 Antwort

21

Update: Ab Version 0.19.0 gibt get_dummies eine 8-Bit-Integer statt 64-Bit-Float zurück, wodurch dieses Problem in vielen Fällen behoben wird und die as_type -Lösung darunter unnötig wird. Siehe: get_dummies - pandas 0.19. 0

Aber in anderen Fällen kann die unten beschriebene Option sparse hilfreich sein.

Ursprüngliche Antwort: Hier sind ein paar Möglichkeiten zu versuchen. Beides reduziert den Speicherbedarf des Datenrahmens erheblich, aber Sie könnten später immer noch Probleme mit dem Arbeitsspeicher bekommen. Es ist schwer vorherzusagen, du musst es nur versuchen.

(beachte, dass ich die Ausgabe von info() unten vereinfache)

%Vor%

Hier ist unsere Grundlinie. Jede Dummy-Spalte belegt 800 Byte, da die Beispieldaten 100 Zeilen haben und get_dummies standardmäßig auf float64 (8 Byte) festgelegt ist. Dies scheint eine unnötig ineffiziente Möglichkeit zu sein, Dummies zu speichern, da man so wenig wie möglich dafür verwenden kann, aber es gibt vielleicht einen Grund für das, was mir nicht bewusst ist.

Also, erster Versuch, wechsle einfach zu einer Ein-Byte-Ganzzahl (dies scheint keine Option für get_dummies zu sein, also muss es als eine Umwandlung mit astype(np.int8) gemacht werden.

%Vor%

Jede Dummy-Spalte belegt jetzt wie zuvor 1/8 des Speichers.

Alternativ können Sie die Option sparse von get_dummies verwenden.

%Vor%

Ziemlich vergleichbare Einsparungen. Die info() -Ausgabe verbirgt etwas die Art und Weise, wie Einsparungen auftreten, aber Sie können den Wert der Speicherauslastung betrachten, um die Gesamteinsparungen zu sehen.

Welche davon in der Praxis besser funktioniert, hängt von Ihren Daten ab. Sie müssen sie also nur einmal ausprobieren (oder Sie können sie sogar kombinieren).

    
JohnE 09.07.2015, 17:08
quelle

Tags und Links