2016-03-23 9 views
1

Ich benutze den Datensatz sentiment140, der aus 1.6M Tweets besteht, um die Genauigkeiten verschiedener Klassifikatoren in der scikit-learn Bibliothek in Python zu trainieren und zu analysieren. Ich verwende das folgende Code-Snippet, um die Tweets in Feature-Vektoren zu vektorisieren, bevor Sie sie den Klassifizierern zuführen.Wie man einen sehr großen Datensatz mit scikit-learn trainiert/hochskaliert?

vectorizer = CountVectorizer(max_features = 2000) 
train_set = (vectorizer.fit_transform(trainX)).toarray() 

Danach trainiere ich mein classifier Objekt, das GaussianNB() umfasst, MultinomialNB(), BernoulliNB(), LogisticRegression(), LinearSVC() und RandomForestClassifier() den folgenden Codeausschnitt verwendet:

classifier.fit(train_vectors,trainy) 

jedoch meine vectorizer die auf Umwandlung in einen Satz transformierter Numpy Array mit der toarray() Funktion für die trainset, sehe ich, dass das Programm viel Speicher (ca. 4-5 GB) für nur 100k Beispiele mit einem fea ein Vektor der Größe 2000 für jedes Beispiel, d. h. ein 100.000 × 2000-Merkmalsvektor.

Dies ist das Maximum, das mein System tun kann, da ich nur 8 GB RAM habe. Kann jemand Vorschläge machen, wie ich vorgehen kann, um die gesamten 1.6M des Trainingsdatensatzes mit dem verfügbaren Speicher zu trainieren, indem ich den Code irgendwie modifizieren kann? Wenn ich versuche, mit dem obigen Code zu tun, würde es etwa 72 GB RAM erfordern, was nicht durchführbar ist.

Ich verstehe auch, dass es Bestimmungen gibt, schrittweise bestimmte Klassifizierer mit einem Bruchteil des Zugsatzes iterativ zu trainieren. Klassifizierer wie MultinomialNB() und BernoulliNB() haben dafür Vorkehrungen (unter Verwendung von partial_fit), aber die anderen Klassifizierer, die ich auch verwende, tun dies nicht, also ist das keine Option.

Antwort

3

Die Frage ist, was versuchen Sie in erster Linie zu erreichen? Der Grund, warum ich frage ist, dass der vektorisierte Text eine große Anzahl von Dimensionen aufgrund der Natur des Problems hat. Außerdem wird max_features=2000 Sie nicht in die Nähe einer angemessenen Leistung in der Textklassifizierung bringen.

Lange Rede kurzer Sinn:

GaussianNB FAIL 
MultinomialNB PASS 
BernoulliNB PASS 
LogisticRegression PASS 
LinearSVC PASS 
GradientBoostingClassifier PASS 

Ich schlage vor, dass:

from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB 
from sklearn.linear_model import LogisticRegression 
from sklearn.svm import LinearSVC 
from sklearn.ensemble import GradientBoostingClassifier 
from scipy.sparse import csr_matrix 
from sklearn.datasets import load_digits 
digits = load_digits() 
X, y = digits.data, digits.target 

for CLF in [GaussianNB, MultinomialNB, BernoulliNB, LogisticRegression, LinearSVC, GradientBoostingClassifier]: 
    print(CLF.__name__, end='') 
    try: 
     CLF().fit(csr_matrix(X), y == 0) 
     print(' PASS') 
    except TypeError: 
     print(' FAIL') 

Welche Ausgänge: Die meisten der Klassifizierer Sie arbeiten mit spärlichen Vektoren erwähnt, außer GaussianNB, kann dies leicht mit überprüft werden Sie löschen einfach GaussianNB aus Ihrer Liste und arbeiten mit den Klassifikatoren, die spärliche Vektoren unterstützen. Sie sollten zumindest in der Lage sein, mit mehr Proben innerhalb Ihrer 8 g Grenze zu arbeiten.

Siehe auch this issue für Scikit-Learn, zitiert Jake Vanderplas:

Ein Grund spärlich Eingänge in GaussianNB nicht implementiert ist, dass sehr wenige Daten an Sicherheit grenzender Wahrscheinlichkeit nicht die Annahmen des Algorithmus nicht erfüllt - wenn der Groß der Werte sind Null, eine einfache Gaußsche passt nicht gut zu den Daten und wird fast nie zu einer nützlichen Klassifizierung führen.

+0

Vielen Dank! Ich habe nie gewusst, dass diese Klassifikatoren mit Sparse Arrays arbeiten. Da ich mit dem GaussianNB() - Klassifikator vor anderen getestet habe, für die ich eine Umwandlung von Zug in numply array durchführen musste, dachte ich implizit, dass ich dasselbe auch für andere Klassifikatoren tun müsste.Durch das Entfernen von GaussianNB entfällt die Notwendigkeit, das Sparse-Array, das ich von fit_transform erhalten habe, zu einem dichten Array zu machen und damit mein Problem zu lösen. – tedghosh

+0

Was Ihre Frage anbelangt, bin ich mir bewusst, dass die Verwendung eines Feature-Sets von 2000 Wörtern mir keine gute Genauigkeit geben wird. Ich habe mit den Algorithmen Genauigkeiten im Bereich von 74-77% erreicht. Aber ich hatte keine Wahl, da die Verwendung eines großen Feature-Sets einen Speicherüberlauf verursachte. Aber Ihre Lösung hat mir geholfen, einen größeren Funktionsumfang ohne Speicherprobleme zu verwenden, also nochmals vielen Dank. – tedghosh

+0

Perfekt, froh, dass ich helfen konnte. :) – Matt

Verwandte Themen