Vowpal Wabbit: Beste Strategie für kurze Textdaten wie Titel und Kewords

7

Ich verwende Vowpal Wabbit 7.10.0 (VW), um Kategorien für Textdaten zu lernen und vorherzusagen. Meine Textdaten für jeden Datensatz ähneln jedoch nicht einem Artikel oder einem anderen Textdokument mit anständiger Größe, sondern einigen Sätzen wie Titel, Untertitel und Schlüsselwörtern.

Ich habe ungefähr 10.000 beschriftete Datensätze, die ich für die Validierung, Schulung und Prüfung verwenden kann, und ungefähr 1-2 Millionen unbeschriftete Datensätze. Es ist ein Mehrklassenproblem mit rund 100 Klassenetiketten, die ebenfalls unausgewogen sind.

Was wäre das beste Vorverarbeitungs- und Eingabeformat, um solche Daten mit VW optimal zu nutzen?

Meine Erfahrung zeigt mir, dass VW-Modelle empfindlich auf Probleme mit Klassenungleichgewichten reagieren sollten. Hier ist eine andere Quelle, die dies bestätigt . Ist das richtig?

Bei der Auswahl eines Modells habe ich beschlossen, lieber Wortkombinationen durch n-Gramm zu berücksichtigen und dann latente Variablen basierend auf der Häufigkeit zu entdecken (weil die Texte zu kurz sind). Außerdem neigen einige Texte dazu, ein Wort hundertmal aufzulisten (für SEO) in meinen Daten. Daher gehe ich nicht TF-IDF. Ist das richtig oder nicht? Ich denke, ich kann sowohl n-Gramm als auch Wortbeutel als verschiedene Namespaces kombinieren. Aber mit welchem ​​Klassifikator mit welchen Parametern soll man anfangen?

Bisher habe ich es auf drei verschiedene Arten der Datenvorverarbeitung versucht: (1) unverarbeiteter Text mit nur entfernter Interpunktion, (2) Tokenisierung, Lemmatisierung (nicht Stemming), entfernte Stoppwörter, (3) zusätzlich zu (2), Tasche von Wörtern, dh Wort: word_count-Format.

Die Ergebnisse sind mit einer sehr grundlegenden Einstellung nicht zufriedenstellend (in diesem Beispiel wurden 16 Klassen verwendet, nicht 100):

  vw input.vw -c -k --passes 300 -b 24 --ect 16 -f model.vw
  vw input.vw -t -i model.vw -p preds.txt

Die Fehlerrate beträgt selbst auf dem Trainingssatz etwa 0,68.

Ich habe einige Zeitlimits, um alle Arten von Einstellungen gründlich zu untersuchen, und brauche wirklich schnelle und informative Ratschläge: Was ist in meinem Fall die beste Vorverarbeitungstechnik und welches Modell, das in der neuesten VW implementiert ist, sollte ich verwenden. Diese beiden Probleme hängen zusammen.

mel
quelle
Für sehr kurze Texte funktioniert die prioritätsregelbasierte Klassifizierung am besten. Kurztexte können im Allgemeinen mit sehr wenigen Regeln klassifiziert werden, daher schneller und mit einer besseren Fehlerrate als bei allen strengen ML-Aufgaben.
Statistik101
1
Was sind die "Prioritätsregel-basierten" Klassifikatoren? Instanzbasierte faule Lernende, wie k-NN?
Mel
@ stats101 Könnten Sie vielleicht anhand eines Beispiels erläutern, wie dieser Algorithmus auf Textdaten angewendet wird?
Zach
Ich spreche über regelbasierte Ansatz
stats101

Antworten:

15

Hier einige Tipps zur Leistungssteigerung von VW-Modellen:

  1. Mische die Daten vor dem Training. Eine nicht zufällige Reihenfolge Ihres Datensatzes kann VW wirklich durcheinander bringen.
  2. Sie verwenden bereits mehrere Durchgänge, was gut ist. Versuchen Sie auch, die Lernrate zwischen den Durchgängen mit zu verringern --decay_learning_rate=.95.
  3. Spielen Sie mit der Lernrate herum. Ich hatte Fälle, in denen --learning_rate=10es großartig war, und andere Fälle, in denen --learning_rate-0.001es großartig war.
  4. Versuchen Sie es --oaa 16oder --log_multi 16lieber als --ect 16. Normalerweise finde ich ectes weniger genau. Ist oaajedoch ziemlich langsam. Ich habe festgestellt --log_multi, dass dies ein guter Kompromiss zwischen Geschwindigkeit und Genauigkeit ist. Bei 10.000 Trainingsbeispielen --oaa 16sollte das in Ordnung sein.
  5. Spielen Sie mit der Verlustfunktion. --loss_function=hingekann manchmal zu großen Verbesserungen bei Klassifizierungsmodellen führen.
  6. Spielen Sie mit den Parametern --l1und --l2, die Ihr Modell regulieren. --l2ist insbesondere bei Textdaten nützlich. Versuchen Sie etwas wie --l2=1e-6.
  7. Für Textdaten, versuchen --ngram=2und --skips=2n-Gramm und überspringen Gramm auf Ihre Modelle hinzuzufügen. Dies kann sehr hilfreich sein.
  8. Versuchen --autolink=2oder --autolink=3ein quadratisches oder kubisches Spline - Modell zu passen.
  9. Versuchen Sie ftrl-Optimierung mit --ftrl. Dies kann bei Textdaten oder Datensätzen mit einigen äußerst seltenen und äußerst häufigen Funktionen hilfreich sein.
  10. Versuchen Sie einige Lernreduzierungen:
    1. Versuchen Sie es mit einem flachen neuronalen Netzwerk mit --nn=1oder --nn=10.
    2. Versuchen Sie es mit einem Radial Kernel SVM --ksvm --kernel=rbf --bandwidth=1. (Dies kann sehr langsam sein).
    3. Versuchen Sie es mit einem Polynom-Kernel-SVM --ksvm --kernel=poly --degree=3. (Dies kann sehr langsam sein).
    4. Versuchen Sie es mit einem GBM --boosting=25. Dies kann etwas langsam sein.

VW ist extrem flexibel, so dass es oft dauert viel Feinabstimmung ein gutes Modell für einen gegebenen Datensatz zu erhalten. Weitere Tuning-Ideen finden Sie hier: https://github.com/JohnLangford/vowpal_wabbit/wiki/Command-line-arguments

In Bezug auf den Beitrag, auf den Sie verlinkt haben: Diese Person hat vw mit quadratischem Verlust für ein unausgeglichenes Klassifizierungsproblem verwendet. Das ist eine dumme Sache und garantiert so ziemlich, dass jedes lineare Modell immer die dominierende Klasse vorhersagt. Wenn Sie sich Sorgen um die Klassenbalance machen, unterstützt VW Gewichte, sodass Sie die selteneren Klassen übergewichten können.

Bearbeiten : Sie haben 100 Klassen und 10.000 Trainingsbeispiele? Das sind durchschnittlich 100 Beobachtungen pro Klasse, von denen man nicht so viele lernen kann, egal welches Modell Sie verwenden.

Zach
quelle
Also
@ stats101 Ich würde 1000 Beobachtungen zumindest für die seltenste Klasse wollen.
Zach
Siehe: Hyperopt von vowpal wabbit: github.com/VowpalWabbit/vowpal_wabbit/pull/867
Kwame