Python Pandas: Konvertiere 2.000.000 DataFrame Zeilen in die binäre Matrix (pd.get_dummies ()) ohne Speicherfehler?

8

Ich verarbeite eine große Datei von Datensätzen mit 2,000,000 rows. Jede Zeile enthält Funktionen zu E-Mails und ein binäres Label [0,1] für Nicht-Spam bzw. Spam.

Ich möchte alle Features wie email_type , die Werte von [1,10] annehmen, in eine binäre Matrix konvertieren.

Dies kann mit pd.get_dummies() erreicht werden, das eine binäre Matrix aus einer Spalte von Features erstellt.

Das funktioniert perfekt auf einer kleinen Teilmenge der Daten, sagen wir 10,000 rows. Für 100,000+ rows sehe ich jedoch den Fehler Killed:9 .

Um dies anzugehen, habe ich Folgendes versucht:

Schritte:

  1. Teilen Sie den Datenrahmen in Stücke von 10.000 Zeilen mit numpyp.array_split()
  2. Erstellen Sie eine Binärmatrix für jeden DataFrame mit 10.000 Zeilen
  3. Fügen Sie diese zu einer Liste von DataFrames
  4. hinzu
  5. Verknüpfen Sie diese Datenrahmen miteinander (ich mache das, um den Unterschied in den Spalten zu erhalten, die jeder Block enthält)

Code:

%Vor%

Einige Beispielausgaben:

%Vor%

Schritt 2 (Umwandlung in binäre Matrix) ist nach der Verarbeitung von 32 blocks ( 320,000 rows) nicht mehr im Speicher. Es kann jedoch zu wenig Speicher vorhanden sein, da der Chunk wie folgt an eine Liste von Datenrahmen angehängt wird df_chunks.append(df) .

Schritt 3 hat nicht genügend Arbeitsspeicher, um 20 erfolgreich verarbeitete Blöcke zu verketten ( 200,000 rows)

Die ideale Ausgabe ist numpy.ndarray , die ich einem sklearn Logistic Regression Klassifikator zuführen kann.

Welche anderen Ansätze kann ich ausprobieren? Ich fange an, maschinelles Lernen mit Datensätzen dieser Größe regelmäßiger zu machen.

Ich bin nach Beratung und offen für Vorschläge wie:

  1. Verarbeitung jedes Chunks unter Verwendung aller möglichen Spalten des gesamten Datenrahmens und Speichern als Datei vor dem erneuten Kombinieren
  2. Vorschläge für Dateidatenspeicherung
  3. Vollständig andere Ansätze mit anderen Matrizen
jfive 08.04.2016, 12:19
quelle

1 Antwort

5

Wenn Sie so etwas wie "One-Hot Encoding" machen oder auf jeden Fall viele Nullen haben, haben Sie in Betracht gezogen, dünn besetzte Matrizen ? Dies sollte nach der Vorverarbeitung erfolgen, z. B.:

%Vor%

pandas hat auch einen spärlichen Typ :

%Vor%

Eine Anmerkung: Da Sie schneiden und reihenweise aneinanderreihen, ist csr besser als csc.

    
ntg 26.04.2016, 10:26
quelle