Textkategorisierung: Kombination verschiedener Funktionen


19

Das Problem, mit dem ich mich befasse, ist die Kategorisierung von Kurztexten in mehrere Klassen. Mein aktueller Ansatz ist die Verwendung von tf-idf-gewichteten Termfrequenzen und das Erlernen eines einfachen linearen Klassifikators (logistische Regression). Dies funktioniert recht gut (ca. 90% Makro F-1 am Testgerät, fast 100% am Trainingsgerät). Ein großes Problem sind unsichtbare Wörter / n-Gramm.

Ich versuche, den Klassifikator zu verbessern, indem ich andere Merkmale hinzufüge, z. B. einen Vektor mit fester Größe, der unter Verwendung von Verteilungsähnlichkeiten (wie von word2vec berechnet) berechnet wurde, oder andere kategoriale Merkmale der Beispiele. Meine Idee war es, die Features einfach zu den spärlichen Eingabefeatures aus der Worttüte hinzuzufügen. Dies führt jedoch zu einer schlechteren Leistung des Test- und Trainingssatzes. Die zusätzlichen Funktionen für sich allein ergeben etwa 80% F-1 im Testsatz, so dass sie kein Müll sind. Das Skalieren der Funktionen hat auch nicht geholfen. Ich bin der Meinung, dass diese Art von Funktionen nicht gut mit den (spärlichen) Wortfeatures zusammenpassen.

Die Frage ist also: Unter der Annahme, dass die zusätzlichen Funktionen zusätzliche Informationen liefern, wie lassen sie sich am besten integrieren? Könnte man getrennte Klassifikatoren trainieren und in einer Art Ensemble-Arbeit kombinieren (dies hätte wahrscheinlich den Nachteil, dass keine Interaktion zwischen den Merkmalen der verschiedenen Klassifikatoren erfasst werden könnte)? Gibt es andere komplexere Modelle, die ich berücksichtigen sollte?


3
Einige Aktualisierungen: Ich konnte akzeptable Ergebnisse erzielen, indem ich die zusätzlichen dichten Vektoren l2-normalisierte. Ich habe fälschlicherweise angenommen, dass der sklearn StandardScaler dies tun würde. Ich bin jedoch immer noch auf der Suche nach komplexeren Methoden, mit denen ich Label-Abhängigkeiten modellieren oder das Vertrauen von Unterklassifizierern einbeziehen kann.
Elmille

Ich habe letztes Jahr das gleiche Experiment durchgeführt und bin auf genau das gleiche Problem gestoßen, das Sie haben. Kann Ihr word2vec-Vektor nach dem l2-Normalisierungsprozess BOW schlagen? Ich habe die l2-Normalisierung noch nicht durchgeführt, aber selbst nach dem Testen vieler Nachbearbeitungsmethoden ist der semantische Vektor immer noch 2-4 absolute Prozent hinter den BOW-tf / idf-Funktionen. Ich frage mich, ob diese Richtung eine Sackgasse ist. Mein ursprüngliches Ziel ist es, einen dicht semantischen Vektor mit einem traditionellen BOW zu kombinieren und zu prüfen, ob er die Leistung bei der Klassifizierung / Modellierung von Themen verbessern kann. Übrigens: an welchem ​​Datensatz haben Sie gearbeitet, meins ist 20newsgroup.

Ich habe mit einem Datensatz für den CIKM 2014-Wettbewerb gearbeitet. Für mich waren die Vektordarstellungen niemals in der Lage, BOW mit tf-idf-Gewichten zu schlagen. Mein Plan war es, sie zusätzlich zur Qualitätsverbesserung einzusetzen. Nach meiner Erfahrung (für die Textklassifizierung) ist eine Form von tf-idf + ein lineares Modell mit n-Gramm ein äußerst starker Ansatz. Ich experimentiere derzeit mit Faltungs-Neuronalen Netzen und sogar mit diesen (mehr oder weniger) komplexen Modellen, die schwer zu schlagen sind.
Elmille

To Mod: Sorry, dass ich keine Reputation von 50 habe, also kann ich nicht in den Kommentarbereich schreiben. Hi elmille: Ja, das erlebe ich im ganzen Test. Finden Sie das Wort vec + BOW jedoch hilfreich? Nach meiner Erfahrung wird die Leistung sogar noch geringer, wenn ich das Wort vec mit BOW tf-idf verkette (in meinem Fall ist dieses vec tatsächlich ein Gesamtvektor innerhalb des gesamten Artikels, es ist kein Wort vec, aber sehr ähnlich). Ich denke ursprünglich, es sollte BOW + vec> BOW> vec sein. Da sie gegenseitig behilfliche Informationen enthalten. Das tatsächliche Ergebnis ist BOW> vec> BOW + vec. Dann mache ich Standard-Skalierung und

Antworten:


13

Wenn ich das richtig verstehe, haben Sie im Wesentlichen zwei Arten von Funktionen für Ihre Modelle. (1) Textdaten, die Sie als spärliche Wortsammlung dargestellt haben, und (2) traditionellere dichte Merkmale. In diesem Fall gibt es drei gängige Ansätze:

  1. Führen Sie eine Dimensionsreduktion (wie z. B. LSA via TruncatedSVD) für Ihre spärlichen Daten durch, um diese zu verdichten, und kombinieren Sie die Features in einer einzigen dichten Matrix, um Ihre Modelle zu trainieren.
  2. Fügen Sie Ihre wenigen dichten Features zu Ihrer dünnen Matrix hinzu, indem Sie so etwas wie scipy's hstackin eine einzelne dünne Matrix umwandeln , um Ihre Modelle zu trainieren.
  3. Erstellen Sie ein Modell, indem Sie nur Ihre wenigen Textdaten verwenden, und kombinieren Sie dann seine Vorhersagen (Wahrscheinlichkeiten, wenn es sich um eine Klassifizierung handelt) als dichtes Feature mit Ihren anderen dichtem Features, um ein Modell zu erstellen (dh Zusammensetzen über Stapeln). Wenn Sie diesen Weg gehen, denken Sie daran, CV-Vorhersagen nur als Funktionen zum Trainieren Ihres Modells zu verwenden. Andernfalls werden Sie wahrscheinlich sehr schlecht trainiert sein (Sie können eine Klasse bilden, um dies alles innerhalb eines einzelnen zu tun, Pipelinewenn dies gewünscht wird).

Alle drei Ansätze sind gültig und haben ihre eigenen Vor- und Nachteile. Persönlich empfinde ich (1) als am schlechtesten, weil es relativ langsam ist. Ich finde auch, dass (3) normalerweise das Beste ist, sowohl ausreichend schnell als auch mit sehr guten Vorhersagen. Sie können natürlich auch eine Kombination daraus erstellen, wenn Sie bereit sind, ein umfangreicheres Ensemble zu erstellen.

Die von Ihnen verwendeten Algorithmen können im Wesentlichen alle in dieses Framework passen. Die logistische Regression funktioniert die meiste Zeit überraschend gut, aber andere können es besser machen, je nachdem, welches Problem vorliegt und wie gut Sie sie einstellen. Ich bin selbst ein Teil von GBMs, aber das Fazit ist, dass Sie so viele Algorithmen ausprobieren können, wie Sie möchten, und sogar einfache gewichtete Ensembles ihrer Vorhersagen führen fast immer zu einer besseren Gesamtlösung.


10

Lineare Modelle addieren einfach ihre Merkmale multipliziert mit den entsprechenden Gewichten. Wenn Sie zum Beispiel 1000 Sparse-Features haben, von denen jeweils nur 3 oder 4 aktiv sind (und die anderen Nullen sind), und 20 Dichte-Features, die alle nicht Nullen sind, ist es ziemlich wahrscheinlich, dass Dichte-Features das Beste aus ihnen machen Die Auswirkungen, während spärliche Features nur einen geringen Wert hinzufügen. Sie können dies überprüfen, indem Sie die Feature-Gewichtung für einige Instanzen und deren Einfluss auf die resultierende Summe untersuchen.

Eine Möglichkeit, dies zu beheben, besteht darin, das additive Modell zu verlassen. Hier sind einige Kandidatenmodelle.

SVM basiert auf der Trennung von Hyperebenen. Obwohl die Hyperebene selbst ein lineares Modell ist, fasst SVM ihre Parameter nicht zusammen, sondern versucht, den Merkmalsraum auf optimale Weise zu teilen. Angesichts der Anzahl der Funktionen würde ich sagen, dass lineare SVM gut funktionieren sollte, während kompliziertere Kernel dazu neigen, die Daten zu überfüllen.

Trotz seines Namens ist Naive Bayes ein ziemlich leistungsfähiges statistisches Modell, das gute Ergebnisse für die Textklassifizierung zeigt. Es ist auch flexibel genug, um Ungleichgewichte in der Häufigkeit von spärlichen und dichten Merkmalen zu erfassen. Probieren Sie es also unbedingt aus.

Schließlich können in diesem Fall zufällige Wälder als gute Ensemblemethode fungieren. Durch die Randomisierung wird sichergestellt, dass verschiedene Arten von Features (dünn / dicht) als primäre Entscheidungsknoten in verschiedenen Bäumen verwendet werden. RF- / Entscheidungsbäume eignen sich auch zum Prüfen von Features selbst. Es lohnt sich also, deren Struktur zu beachten.

Beachten Sie, dass alle diese Methoden ihre Nachteile haben, die sie in Ihrem Fall in einen Müll verwandeln können. Das Kombinieren von spärlichen und dichten Features ist keine wirklich gut untersuchte Aufgabe. Teilen Sie uns daher mit, welche dieser Ansätze für Ihren Fall am besten geeignet sind.


Vielen Dank für Ihre Antwort! Ich habe zwei Anschlussfragen :) 1) Wie unterscheiden sich SVM (mit einem linearen Kernel) und Naive Bayes darin, dass sie ihre Merkmale und entsprechenden Gewichte nicht zusammenfassen (dh, was Sie als "additives Modell" bezeichnen)? Beide erzeugen effektiv eine trennende Hyperebene. Ist das Ergebnis also nicht immer eine Art Hinzufügen von Features multipliziert mit den entsprechenden Gewichten? 2) Ich würde gerne zufällige Gesamtstrukturen ausprobieren, aber leider ist der Funktionsbereich zu groß, um ihn in einem dichten Format darzustellen (ich verwende sklearn). Gibt es eine Implementierung, die damit umgehen kann?
Elmille

1) Bei der linearen Regression interessieren Sie sich für Punkte auf der Hyperebene, daher addieren Sie gewichtete Features, um den vorhergesagten Punkt zu erhalten. In SVM suchen Sie dagegen nach Punkten an den Seiten der Hyperebene. Sie klassifizieren, indem Sie einfach überprüfen, auf welcher Seite sich Ihr Beispiel befindet, und keine Summierung bei der Vorhersage vornehmen. Naive Bayes können verschiedene Arten von Modellen enthalten (z. B. Binomial- oder Multinomialmodelle), aber im Grunde multiplizieren Sie Wahrscheinlichkeiten, ohne sie hinzuzufügen.
Freund

2) Ich habe in diesem Thema Nachforschungen angestellt, bin aber noch nie auf die Implementierung gestoßen (wahrscheinlich wird Googeln hier einige Links geben). Sie können jedoch jederzeit einen anderen Weg einschlagen: Reduzieren Sie die Dimensionalität beispielsweise mit PCA, und führen Sie dann eine zufällige Gesamtstruktur aus, die auf einem reduzierten Datensatz basiert.
Freund
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.