Scikit-Lern Logischer Regressionsspeicherfehler

7

Ich versuche, das LogisticRegression-Objekt von sklearn 0.11 zu verwenden, um ein Modell an 200.000 Beobachtungen mit etwa 80.000 Merkmalen anzupassen. Ziel ist es, kurze Textbeschreibungen in 1 von 800 Klassen einzuteilen.

Wenn ich versuche, den Klassifizierer pythonw.exe anzupassen, gebe ich:

Anwendungsfehler "Die Anweisung bei ... referenzierte Speicher bei 0x00000000". Der Speicher konnte nicht geschrieben werden ".

Die Features sind extrem spärlich, etwa 10 pro Beobachtung, und binär (entweder 1 oder 0), so dass meine 4 GB RAM bei der Berechnung meiner Hüllkurve in der Lage sein sollten, die Speicheranforderungen zu erfüllen, aber das ist nicht t scheint der Fall zu sein. Die Modelle passen nur, wenn ich weniger Beobachtungen und / oder weniger Features verwende.

Wenn überhaupt, würde ich gerne noch mehr Beobachtungen und Funktionen verwenden. Mein naives Verständnis ist, dass die liblineare Bibliothek, die Dinge hinter den Kulissen ausführt, dies unterstützen kann. Irgendwelche Ideen, wie ich noch ein paar weitere Beobachtungen machen könnte?

Mein Code sieht so aus:

%Vor%

Die Funktion features (), die ich an den Analysator übergebe, gibt nur eine Liste von Strings zurück, die die bei jeder Beobachtung gefundenen Merkmale anzeigen.

Ich benutze Python 2.7, sklearn 0.11, Windows XP mit 4 GB RAM.

    
Alexander Measure 25.06.2012, 18:47
quelle

1 Antwort

20

liblinear (die Backing-Implementierung von sklearn.linear_model.LogisticRegression ) hostet seine eigene Kopie der Daten, da es eine C ++ - Bibliothek ist, deren internes Speicherlayout nicht direkt auf eine zuvor zugewiesene spärliche Matrix in scipy wie scipy.sparse.csr_matrix oder abgebildet werden kann scipy.sparse.csc_matrix .

In Ihrem Fall würde ich empfehlen, Ihre Daten als scipy.sparse.csr_matrix zu laden und sie in sklearn.linear_model.SGDClassifier zu füttern (mit loss='log' , wenn Sie ein logistisches Regressionsmodell und die Möglichkeit haben möchten, die Methode predict_proba aufzurufen). SGDClassifier kopiert die Eingabedaten nicht, wenn bereits das Speicherlayout scipy.sparse.csr_matrix verwendet wird.

Erwarte, dass ein dichtes Modell von 800 * (80000 + 1) * 8 / (1024 ** 2) = 488 MB (zusätzlich zur Größe deines Eingabe-Datasets) im Speicher abgelegt wird.

Bearbeiten: So optimieren Sie den Speicherzugriff für Ihr Dataset

Um den Speicher nach der Extraktion freizugeben, können Sie:

%Vor%

Beenden Sie dann diesen Python-Prozess (um die vollständige Speicherfreigabe zu erzwingen) und in einem neuen Prozess:

%Vor%

Unter Linux / OSX könnte man das noch effizienter mit:

abbilden %Vor%     
ogrisel 26.06.2012, 08:53
quelle

Tags und Links