Ich versuche, mit R auf dem neuesten Stand zu sein. Ich möchte schließlich R-Bibliotheken für die Textklassifizierung verwenden. Ich habe mich nur gefragt, welche Erfahrungen die Leute mit der Skalierbarkeit von R machen, wenn es um die Klassifizierung von Texten geht.
Es ist wahrscheinlich, dass ich auf hochdimensionale Daten stoße (~ 300k Dimensionen). Ich betrachte die Verwendung von SVM und insbesondere Random Forest als Klassifizierungsalgorithmen.
Würden R-Bibliotheken auf meine Problemgröße skaliert?
Vielen Dank.
EDIT 1: Zur Verdeutlichung, mein Datensatz wird wahrscheinlich 1000-3000 Zeilen (vielleicht ein bisschen mehr) und 10 Klassen haben.
EDIT 2: Da ich sehr neu bei R bin, werde ich die Poster bitten, wo immer möglich, genauer zu sein. Wenn Sie beispielsweise einen Workflow / eine Pipeline vorschlagen, erwähnen Sie nach Möglichkeit die R-Bibliotheken, die an jedem Schritt beteiligt sind. Einige zusätzliche Hinweise (auf Beispiele, Beispielcode usw.) würden das i-Tüpfelchen auf dem i-Tüpfelchen sein.
EDIT 3: Zunächst einmal danke allen für Ihre Kommentare. Und zweitens, ich entschuldige mich, hätte ich vielleicht mehr Kontext für das Problem geben sollen. Ich bin neu in R, aber nicht so sehr in der Textklassifizierung. Ich habe bereits einen Teil meiner Daten mit tm- Paket vorverarbeitet (Stemming, Entfernen von Stoppwörtern, Konvertierung von tf-idf usw.) , um ein Gefühl für die Dinge zu bekommen. tm war sogar bei etwa 200docs so langsam, dass ich mir Sorgen um die Skalierbarkeit machte. Dann habe ich angefangen mit FSelector zu spielen und selbst das war sehr langsam. Und das ist der Punkt, an dem ich mein OP gemacht habe.
EDIT 4: Mir ist gerade in den Sinn gekommen, dass ich 10 Klassen und ungefähr 300 Schulungsunterlagen pro Klasse habe. Tatsächlich baue ich die termXdoc-Matrix aus dem gesamten Schulungssatz auf, was zu einer sehr hohen Dimensionalität führt. Aber wie wäre es, wenn Sie jedes 1-aus-k-Klassifizierungsproblem auf eine Reihe von binären Klassifizierungsproblemen reduzieren? Das würde die Anzahl der Trainingsdokumente (und damit die Dimensionalität) in jedem der k-1-Schritte drastisch reduzieren, nicht wahr? Ist dieser Ansatz also gut? Wie verhält es sich in Bezug auf die Genauigkeit zur üblichen Implementierung in mehreren Klassen?
Antworten:
Wie in einem Kommentar angefordert, finden Sie hier einige Hinweise zu den Verarbeitungsschritten. In der CRAN-Task-Ansicht für die Verarbeitung natürlicher Sprachen finden Sie eine Reihe von Tools . Möglicherweise möchten Sie auch dieses Dokument zum
tm
(Text Mining-) Paket für R lesen .openNLP
(für die es ein R-Paket gibt) ist eine Route.tf.idf
- Termhäufigkeit * Inverse Dokumenthäufigkeit - Weitere Informationen finden Sie im Wikipedia-Eintrag . Es gibt andere neuere Normalisierungen, aber dies ist eine Brot-und-Butter-Methode, daher ist es wichtig, sie zu kennen. Sie können es einfach in R implementieren: Einfach speichern (docID, wordID, freq1, freq2), wobei freq1 die Häufigkeit ist, mit der das durch wordID indizierte Wort im angegebenen Dokument vorkommt, und freq2 die Anzahl der Dokumente, in denen es vorkommt. Dieser Vektor muss nicht für Wörter gespeichert werden, die in einem bestimmten Dokument nicht enthalten sind. Dann nimm einfach freq1 / freq2 und du hast deinen tf.idf Wert.Matrix
Paket unterstützten spärlichen Matrizen verwenden .Zu diesem Zeitpunkt haben Sie einen gut vorverarbeiteten Datensatz. Ich würde empfehlen, mit den in der CRAN-Taskansicht oder im Text Mining-Paket angegebenen Tools fortzufahren. Das Clustering der Daten, beispielsweise durch Projizieren auf die ersten 4 oder 6 Hauptkomponenten, kann für Ihre Gruppe sehr interessant sein, wenn die Daten geplottet werden.
Eine andere Sache: Sie können feststellen, dass die Verringerung der Dimensionalität in Anlehnung an PCA (*) hilfreich sein kann, wenn Sie verschiedene Klassifizierungsmethoden verwenden, da Sie im Wesentlichen die verwandten Wörter aggregieren. Die ersten 10-50 Hauptkomponenten können alles sein, was Sie für die Klassifizierung von Dokumenten in Anbetracht Ihrer Stichprobengröße benötigen.
(*) Hinweis: PCA ist nur ein erster Schritt. Es kann für jemanden, der gerade erst mit Text Mining und PCA anfängt, sehr interessant sein, aber Sie werden möglicherweise feststellen, dass es für spärliche Datensätze etwas ärgerlich ist. Schauen Sie sich das zunächst an, insbesondere über die Funktionen
prcomp
undprincomp
.Update: Ich habe in dieser Antwort keine Präferenz angegeben - ich empfehle
prcomp
eher alsprincomp
.quelle
prcomp
und / oderprincomp
skalieren Sie auf diese Art von Daten, die Sie erwarten? Außerdem habe ich gerade meine Frage bearbeitet und einige zusätzliche Informationen hinzugefügt.prcomp
) werden in Ordnung sein.Zunächst einmal herzlich willkommen! Die Textverarbeitung macht sehr viel Spaß und es wird immer einfacher, sie in R auszuführen.
Die kurze Antwort: Ja - die Tools in R sind jetzt ziemlich gut für den Umgang mit dieser Art von Daten. Tatsächlich ist R, C ++, Groovy, Scala oder eine andere Sprache nichts Besonderes, wenn es um die Speicherung von Daten im RAM geht: Jede Sprache speichert einen 8-Byte-Double-Float in ... warte darauf ... warte darauf. .. 8 Bytes!
Die Algorithmen und ihre Implementierung spielen eine Rolle, insbesondere wenn sie in Bezug auf Datenstrukturen und Rechenaufwand sehr schlecht implementiert sind. Wenn Sie Ihre eigenen Algorithmen implementieren, passen Sie einfach auf. Wenn Sie anderen Code verwenden, gilt der Vorbehalt wie in jeder Umgebung.
Für R müssen Sie berücksichtigen:
Matrix
Paket)bigmemory
oderff
; oder verteilt, mit Hadoop)Der letzte Punkt liegt wirklich unter Ihrer Kontrolle.
Wenn es um diese Dimensionalität geht, ist sie nicht mehr besonders groß. Die Anzahl der Beobachtungen wirkt sich eher aus, aber Sie können Ihre Daten partitionieren, um sie an die RAM-Nutzung anzupassen, sodass Sie sich nicht allzu viele Sorgen machen müssen.
quelle
Ich stimme Crayola zu, dass die Anzahl der Zeilen hier entscheidend ist. Für RF benötigen Sie mindestens das 3-fache des Arbeitsspeichers als das Gewicht Ihres Datensatzes und wahrscheinlich viel Zeit (für eine solche Anzahl von Attributen sind normalerweise viele Bäume in der Gesamtstruktur erforderlich - und beachten Sie, dass RF in R nicht parallel implementiert wird).
In Bezug auf SVM bezweifle ich, dass es eine gute Idee ist, mit 300.000 Dimensionen zu kämpfen, während Sie wahrscheinlich eine Kernelfunktion entwickeln können, die Ihren Textbeschreibungen entspricht.
BEARBEITEN: Eine 3k x 30k (echte) Matrix würde ungefähr 7 GB belegen. Alles, was Sie für RF (mit randomForest) auf diesen Daten benötigen, ist ein Computer mit 16 GB RAM, etwas Glück und viel Zeit oder nur ein Computer mit 24 GB RAM und ziemlich viel Zeit.
quelle
foreach
Paket gut mit demrandomForest
Paket spielt. Ich denke, es gibt ein solches Beispiel in der Vignette fürforeach
. (Oder vielleichtdoMC
.)randomForest
sodass die zufällig ausgewählten Spalten zum Beispiel aus einer SQL-Datenbank bei jeder Iteration abgefragt werden (sodass die gesamten 300-KB-Dimensionen dies niemals getan hätten) im Widder sein). Aber das liegt wahrscheinlich hauptsächlich daran, dass ich mehr über R als über die anderen möglichen Optionen weiß.