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.
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
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
Perfekt, froh, dass ich helfen konnte. :) – Matt