Codierung für Klassifikatoren

Aug 24 2020

Ich habe einige Zweifel bezüglich der Codierung (ich bin mit solchen Aufgaben nicht vertraut) kategorialer Variablen, um sie als Parameter in einem Modell wie logistischer Regression oder SVM zu verwenden. Mein Datensatz sieht wie folgt aus

Text                                  Symbol    Note    Account    Age   Label 
There is a red car                      !        red      John    24   1
My bag was very expensive               ?       orange    Luke    36  0
Where are my keys?                      @        red      Red     58  1
I promise: I will never let you go!    ...       green    Aoife   28  0

Im Text sind Kommentare von Benutzern in einer Community gespeichert. Symbol enthält das am häufigsten verwendete Symbol eines Benutzers; Note repräsentiert sein Niveau: Grün ist erfahrener, Rot ist ein neuer Schreiner; Konto ist der Benutzername. Das Etikett gibt mir Informationen über die Vertrauenswürdigkeit des Benutzers: Wenn 0, ist der Benutzer nicht gefälscht; Wenn einer der Benutzer ein möglicher Bot sein könnte.

Ich möchte neue Benutzer anhand der aktuellen Informationen klassifizieren (siehe Spalten oben). Mein Datensatz enthält mehr als 1000 Zeilen und 400 Benutzer. Da ich zur Verwendung von Klassifizierern kategoriale Felder codieren muss, habe ich versucht, Folgendes MultiColumnLabelEncoderin sklearn zu verwenden:

MultiColumnLabelEncoder(columns = ['Text', 'Symbol', 'Note', 'Account']).fit_transform(df)

wo df ist mein Datenrahmen. Ich habe jedoch verstanden, dass auch ein Hotencoder vorzuziehen sein sollte. Ich habe auch ein Konto hinzugefügt, da möglicherweise mehr Kommentare von demselben Konto vorhanden sind. Wenn ich also ein Konto als gefälscht klassifiziere und einen neuen Kommentar von demselben Konto erhalte, kann dieses Konto leicht als gefälscht erkannt werden. Wie bereits erwähnt, besteht das Ziel darin, neue Elemente aus einem Testsatz anhand der angegebenen Informationen (Symbol, Notiz, Alter, Texte) mit einer gewissen Genauigkeit zu klassifizieren, dh nach möglichen Korrelationen zwischen diesen Variablen zu suchen Ich kann sagen, dass ein neues Konto gefälscht ist (1) oder nicht (0).

Wie Sie sehen, hängt das Problem mit Klassifizierern zusammen, bei denen Parameter nicht nur numerisch, sondern auch kategorisch sind.
Für die Datenvorverarbeitung (Entfernen von Stoppwörtern und Bereinigen von Daten) habe ich Python-Pakete von nltk verwendet. In Bezug auf die Merkmalsextraktion (dies sollte ein wichtiger Punkt sein, da er mit dem nächsten Schritt verknüpft ist, dh die Verwendung eines Klassifikators zur Vorhersage der Klasse 1 oder 0), habe ich Schwierigkeiten gefunden, zu verstehen, welche Ausgabe ich von der Codierung erwarten sollte Ich kann die obigen Informationen als Eingaben in meinem Modell verwenden (wobei das Ziel als Bezeichnung bezeichnet wird und es sich um einen Binärwert handelt). Ich verwende als Klassifikator logistische Regression, aber auch SVM.

Meine erwartete Ausgabe im Fall von Benutzer X mit 16 Jahren, Symbol #, Note Wonderful und Note Red (neuer Schreiner) wäre eine Klassifizierung als Fälschung mit einem bestimmten Prozentsatz.

Ich würde mich freuen, wenn mir jemand Schritt für Schritt erklären könnte, wie ich meinen Datensatz in einen Datensatz umwandeln kann, dessen Variablen ich innerhalb einer logistischen Regression verwenden kann, um die Bezeichnung (falsch oder nicht falsch) neuer Benutzer zu bestimmen.

Antworten

1 hssay Aug 28 2020 at 19:05

Sie müssen eine Mischung aus Textverarbeitung und einer Hot-Codierung verwenden. Die Textspalte sollte nicht als One-Hot-Codierung behandelt werden, da versucht wird, eine neue Variable für jeden eindeutigen Satz im Datensatz zu erstellen, was sehr viel ist (und beim Lernen nicht sehr hilfreich ist). Der Textvektorisierer fasst die Textspalte basierend auf der Art der darin enthaltenen Wörter / Token zusammen.

Daher sollten Sie zuerst einen Textvektor verwenden, um nur die Textspalte zu verarbeiten. Dies gibt Ihnen einen Datenrahmen (sagen wir A). Dieser Datenrahmen enthält Spalten, die Token / Wörtern im Datensatz entsprechen. Wenn der Textvektor 100 eindeutige Wörter aufnimmt, haben Sie einen Datenrahmen mit einer Größe von 1000 x 100. Beachten Sie, dass diese 100 Spalten nur vom Textvektor generiert wurden.

Für Symbole und Notizen können Sie eine One-Hot-Codierung verwenden, mit der Sie einen weiteren Datenrahmen erhalten (z. B. B). Dann sollten Sie A & B auf einem gemeinsamen Schlüssel beitreten, um Ihren endgültigen Datenrahmen bei Eingabe zu erhalten. Der allgemeine Schlüssel hier ist die Zeilen-ID (lesen Sie jedoch den folgenden Kommentar zum Aggregieren von Daten auf Benutzerebene).

Es ist nicht klar, ob die Spalte Benutzername (Konto) in den Daten eindeutig ist. Wenn es 1000 Zeilen, aber nur 400 Benutzer gibt, bedeutet dies, dass es mehr als 1 Zeile pro Benutzer geben kann. In diesem Fall können Sie die Daten auf Benutzerebene aggregieren (für die Textspalte können Sie einfach alle Zeichenfolgen für denselben Benutzer zusammenfassen).