Wie gut skaliert R auf Textklassifizierungsaufgaben? [geschlossen]

30

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?

Andy
quelle
1
300k Dimensionen mit wie vielen Zeilen? Leider müssen sich R-Objekte im Speicher befinden (zumindest, wenn Sie keine größeren Optimierungen in Betracht ziehen und diese Algorithmen grundsätzlich selbst neu schreiben müssen). Das bedeutet, dass Sie mit beispielsweise 8 GB RAM nicht mehr als ein paar hundert Zeilen mit 300.000 Spalten speichern können.
Crayola
@crayola: Die Anzahl der Zeilen kann zwischen 1000 und 3000 variieren.
Andy
2
R-Objekte müssen sich nicht im Speicher befinden. Speicherzuordnung ist sehr einfach. 300k Dimensionen sind kein Problem. Ich gehe auch davon aus, dass Ihre Daten spärlich sind, da dies bei fast allen Textproblemen der Fall ist.
Iterator
Mir ist gerade der obige Kommentar aufgefallen: nur 1000-3000 Zeilen? Das ist sehr klein. Können Sie erklären, was Ihr Korpus ist? Eine Reihe von E-Mails? Paketbeschreibungen in CRAN? Sie haben möglicherweise mehr statistische Probleme mit P >> N als mit Speicherproblemen.
Iterator
1
@Iterator: Wir haben einige Bildungsressourcen (Hausarbeiten, Aufsätze usw.), die wir klassifizieren möchten.
Andy

Antworten:

17

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 .

  1. Berücksichtigen Sie vor der Verarbeitung die Normalisierung der Wort-Token. openNLP(für die es ein R-Paket gibt) ist eine Route.
  2. Bei der Textverarbeitung besteht ein üblicher Vorverarbeitungsschritt darin, die Daten zu normalisieren über 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.
  3. Nach der Berechnung der tf.idf-Werte können Sie mit der vollen Dimensionalität Ihrer Daten arbeiten oder die Wörter herausfiltern, die im Wesentlichen nicht aussagekräftig sind. Zum Beispiel wird jedes Wort, das in nur einem Dokument vorkommt, nicht viel Aufschluss geben. Dies kann Ihre Dimensionalität erheblich reduzieren. Angesichts der geringen Anzahl untersuchter Dokumente ist es möglicherweise angebracht, die Größe auf nur 1 KB zu reduzieren.
  4. Ich würde nicht beide Daten neu eingeben (z. B. für PCA), aber Sie können die Daten jetzt mit Leichtigkeit in einer Term-Matrix (wobei Einträge jetzt tf.idf-Werte sind) speichern, wobei Sie die vom MatrixPaket 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 prcompund princomp.

Update: Ich habe in dieser Antwort keine Präferenz angegeben - ich empfehle prcompeher als princomp.

Iterator
quelle
+1 Schöne Antwort; Ich bin nur neugierig, warum Sie sagen, dass eine geringe Anzahl von Docks eine geringere Anzahl wichtiger Variablen impliziert.
Ich bin nicht sicher, ob ich verstehe, was du meinst. Sicherlich ist es übermäßig, sie beizubehalten, sodass diese Variablen bei einer angemessenen Regularisierung beseitigt würden. Darüber hinaus wächst der Wortschatz (P) mit der Anzahl der Dokumente oder Stichproben (N), sodass das erste Auftreten eines Begriffs nicht auf viel hindeutet. Fügen Sie weitere Dokumente hinzu, und die Wiederholung eines Begriffs in allen Dokumenten wird informativ.
Iterator
@Iterator: Danke für deine Antwort. Also prcompund / oder princompskalieren Sie auf diese Art von Daten, die Sie erwarten? Außerdem habe ich gerade meine Frage bearbeitet und einige zusätzliche Informationen hinzugefügt.
Andy
Nein, diese werden wahrscheinlich nicht skaliert, wenn Sie 300.000 Spalten erreichen. :) (Nur um darauf hinzuweisen: X'X wird in diesem Fall 90B-Einträge haben - ein Speicherproblem.) Filtern Sie stattdessen zuerst nach tf.idf. Wenn es beispielsweise nur 10 verschiedene Klassen gibt, sollte ein kleines Vielfaches von 10 für eine größere Dimensionalität zum Trennen der Klassen ausreichen. 1000 Dimensionen sollten also mehr als genug sein. Beide PCA-Methoden (übrigens empfehle ich prcomp) werden in Ordnung sein.
Iterator
Wenn Sie auf 1000 Dimensionen oder vielleicht ein paar mehr (z. B. 2K) beschränken und PCA durchführen, können Sie die Projektionen auf 100 Dimensionen übertragen (was übertrieben sein kann, aber wenig schadet) und dann eine Klassifizierung durchführen. An diesem Punkt ist nichts zu Aufregendes los.
Iterator
5

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:

  1. Ihre Datendarstellung (siehe spärliche Matrizen, besonders im MatrixPaket)
  2. Datenspeicher (möglicherweise Speicher zugeordnet, mit bigmemoryoder ff; oder verteilt, mit Hadoop)
  3. Ihre Partitionierung von Daten (wie viel Sie in RAM passen, hängt davon ab, wie viel RAM Sie haben)

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.

Iterator
quelle
3

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
Nun, ich wollte auf jeden Fall eine Feature-Auswahl durchführen (Chi-Quadrat, entropiebasiert), aber ich konnte auch hier keine R-Bibliothek finden, die für diese Aufgabe skaliert werden könnte. Wenn man all dies berücksichtigt, ist es dann richtig zu sagen, dass ich mich vielleicht mit Nicht-R-Lösungen befassen sollte?
Andy
1
msgstr "es gibt keine parallele Implementierung von RF in R". Das ist nur teilweise richtig, da das foreachPaket gut mit dem randomForestPaket spielt. Ich denke, es gibt ein solches Beispiel in der Vignette für foreach. (Oder vielleicht doMC.)
Crayola
@Andy Die Sache ist, dass ich nicht sicher bin, welche Software diese Algorithmen auf Ihre Daten anwenden kann, ohne die Algorithmen in einer einfachen Programmiersprache umzuschreiben. Wenn ich in Ihrer Situation wäre, würde ich mich an R halten und Teile neu schreiben, randomForestsodass 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ß.
Crayola
Was genau meinen Sie damit, dass Sie keine Bibliothek gefunden haben, die dafür skaliert? Filter wie diese sind Grundalgebra und sollten problemlos funktionieren (vorausgesetzt, Sie haben genügend RAM).
@crayola Stimmt, aber der Zusammenführungsteil ist schrecklich. Darüber hinaus handelt es sich nicht um eine Parallelität mit gemeinsam genutzten Mem, sodass dies in dieser Umgebung wahrscheinlich schmerzhaft (wenn nicht unmöglich) wäre.