Ich möchte meine Textdaten klassifizieren. Ich habe 300 classes
200 Schulungsunterlagen pro Klasse (so 60000 documents in total
) und dies wird wahrscheinlich zu sehr hohen Maßangaben führen (wir suchen möglicherweise nach mehr als 1 Million Dimensionen ).
Ich möchte die folgenden Schritte in der Pipeline ausführen (um Ihnen einen Eindruck von meinen Anforderungen zu vermitteln):
- Konvertieren jedes Dokuments in einen Merkmalsvektor (
tf-idf
odervector space model
) Feature selection
(Mutual Information
basiert vorzugsweise oder auf einem anderen Standard)- Die Ausbildung der Klassifikator (
SVM
,Naive Bayes
,Logistic Regression
oderRandom Forest
) - Vorhersage unsichtbarer Daten basierend auf dem trainierten Klassifikatormodell.
Die Frage ist also, welche Tools / Frameworks ich für den Umgang mit derart hochdimensionalen Daten verwende. Mir sind die üblichen Verdächtigen bekannt (R, WEKA ...), aber meines Wissens nach (ich kann mich irren) kann möglicherweise keiner von ihnen mit so großen Daten umgehen. Gibt es ein anderes Werkzeug von der Stange, das ich mir ansehen könnte?
Wenn ich es parallelisieren muss, sollte ich Apache Mahout anschauen ? Sieht so aus, als ob es möglicherweise noch nicht die Funktionalität bietet, die ich benötige.
Vielen Dank an alle im Voraus.
Update: Ich habe mich auf dieser Website , in der R-Mailingliste und im Internet allgemein umgesehen. Es scheint mir, dass die folgenden Probleme in meiner Situation auftauchen könnten:
(1) Die Vorverarbeitung meiner Daten unter Verwendung von R (insbesondere TM- Paket) kann unpraktisch sein , da tm
dies unerschwinglich langsam sein wird.
(2) Da ich ein Ensemble von R-Paketen (Vorverarbeitung, Sparse-Matrizen, Klassifikatoren usw.) verwenden muss, kann die Interoperabilität zwischen den Paketen zu einem Problem werden, und es kann ein zusätzlicher Aufwand bei der Konvertierung von Daten von einem Format in ein anderes entstehen . Wenn ich zum Beispiel meine Vorverarbeitung mit tm
(oder einem externen Tool wie WEKA) durchführe, muss ich eine Möglichkeit finden, diese Daten in eine Form zu konvertieren, die die HPC-Bibliotheken in R lesen können. Auch hier ist mir nicht klar, ob die Classifier-Pakete die von den HPC-Bibliotheken bereitgestellten Daten direkt aufnehmen würden.
Bin ich auf dem richtigen Weg? Und was noch wichtiger ist, mache ich Sinn?
quelle
foreach
Bibliothek verwenden, um parallelen Code in R zu schreiben. Dies funktioniert besonders gut in Verbindung mit zufälligen Gesamtstrukturen, die von Natur aus einfach zu parallelisieren sind.Antworten:
Dies sollte möglich sein, damit es funktioniert, solange die Daten als spärliche Datenstruktur dargestellt werden, z. B. als
scipy.sparse.csr_matrix
Instanz in Python. Ich habe ein Tutorial zum Bearbeiten von Textdaten geschrieben . Es ist weiterhin möglich, die Speichernutzung weiter zu reduzieren, indem Sie den Hashing-Trick anwenden: Passen Sie ihn an, umHashingVectorizer
anstelle desCountingVectorizer
oder das zu verwendenTfidfVectorizer
. Dies wird im Dokumentationsabschnitt Extrahieren von Textfeatures erläutert .Zufällige Wälder sind im Allgemeinen viel teurer als lineare Modelle (wie lineare Support-Vektor-Maschinen und logistische Regression) und multinomiale oder Bernoulli-naive Bayes sowie für die meisten Textklassifizierungsprobleme, die keine wesentlich bessere Vorhersagegenauigkeit bringen als einfachere Modelle.
Wenn scikit-learn nicht in der Lage ist, auf Ihr Problem zu skalieren, wird Vowpal Wabbit dies tun (und wahrscheinlich schneller als sklearn), obwohl es nicht alle Modelle implementiert, über die Sie sprechen.
Im April 2015 bearbeitet, um den aktuellen Stand der Scikit-Learn-Bibliothek widerzuspiegeln und fehlerhafte Links zu beheben.
quelle
Gensim für Python ist Magie. Und da es in Python ist, können Sie es in Verbindung mit @ ogrisels Vorschlag verwenden.
quelle
Um nicht mein eigenes Horn zu betäuben, habe ich mit Rapidminer eine ziemlich beliebte Videoserie über Textanalyse gemacht. Sie können es hier sehen:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Sie können wahrscheinlich auf die Auswahl von Features verzichten, indem Sie einen Klassifikator verwenden, der keine Million * Million-Matrix im Speicher erstellt :)
Die logistische Regression wird in so vielen Dimensionen ersticken. Naive Bayes nimmt unabhängige Dimensionen an, sodass es Ihnen gut geht. SVM hängt nicht von der Anzahl der Dimensionen ab (sondern von der Anzahl der Unterstützungsvektoren), sodass es auch in Ordnung ist.
300 ist jedoch eine Menge von Klassen. Ich würde mit nur wenigen anfangen und mich nach oben arbeiten.
quelle
Erstens, basierend auf Ihren Kommentaren, würde ich dies als 300 binäre (Ja / Nein) Klassifizierungsprobleme behandeln. Es gibt viele benutzerfreundliche Open-Source-Lernprogramme für Binärklassifikatoren, mit denen Sie Zeit gegen Speicher eintauschen können.
SVMs und logistische Regressionen sind wahrscheinlich die beliebtesten Ansätze für die Textklassifizierung. Beide können problemlos mit 1000000 Dimensionen umgehen, da moderne Implementierungen spärliche Datenstrukturen verwenden und Regularisierungseinstellungen enthalten, die eine Überanpassung vermeiden.
Mehrere Open-Source-Lösungen für maschinelles Lernen, darunter WEKA und KNIME , umfassen sowohl SVMs als auch logistische Regression. Eigenständige Implementierungen von SVMs umfassen libSVM und SVMlight . Für die logistische Regression werde ich BXRtrain und BXRclassify einbinden , die ich mit Madigan, Genkin und anderen entwickelt habe. BXRclassify kann einen speicherinternen Index von Tausenden logistischen Regressionsmodellen erstellen und gleichzeitig anwenden.
Was das Konvertieren von Text in Attributvektorform angeht, schreibe ich am Ende immer ein wenig Perl, um das von Grund auf zu tun. :-) Aber ich denke, die von mir erwähnten maschinellen Lernsuiten enthalten Tokenisierungs- und Vektorisierungscode. Eine andere Möglichkeit wäre, mit einem Toolkit in natürlicher Sprache wie LingPipe zu arbeiten , obwohl dies für Sie möglicherweise zu viel ist .
quelle
Seit Sklearn 0.13 gibt es tatsächlich eine Implementierung des HashingVectorizer .
BEARBEITEN: Hier ist ein vollständiges Beispiel für eine solche Anwendung von sklearn docs
Grundsätzlich zeigt dieses Beispiel, dass Sie Text in Daten klassifizieren können, die nicht in den Hauptspeicher des Computers passen (sondern auf Datenträger / Netzwerk / ...).
quelle