Wie kann ich eine Klassifizierung mit nicht festgelegten kategorialen Daten durchführen?


10

Ich habe ein Klassifizierungsproblem mit kategorialen und numerischen Daten. Das Problem, mit dem ich konfrontiert bin, ist, dass meine kategorialen Daten nicht festgelegt sind. Dies bedeutet, dass der neue Kandidat, dessen Bezeichnung ich vorhersagen möchte, möglicherweise eine neue Kategorie hat, die zuvor nicht beobachtet wurde.

Wenn zum Beispiel meine kategorialen Daten sexwären female, wären die einzig möglichen Bezeichnungen maleund other, egal was passiert. Meine kategoriale Variable ist jedoch cityso, dass es passieren kann, dass die Person, die ich vorhersagen möchte, eine neue Stadt hat, die mein Klassifikator noch nie gesehen hat.

Ich frage mich, ob es eine Möglichkeit gibt, die Klassifizierung in diesen Begriffen vorzunehmen, oder ob ich das Training unter Berücksichtigung dieser neuen kategorialen Daten erneut durchführen sollte.


1
Können Sie citybasierend auf einer Funktion in eine Zahl konvertieren ? Auf city' = f(latitude, longitude)diese Weise können Sie einen neuen Wert für jede Stadt schaffen
Mohammad Athar

@MohammadAthar hier hat die perfekte Lösung gegeben, hoffe, dass OP es sieht!
Francesco Pegoraro

Antworten:


11

Es ist eine sehr gute Frage; Tatsächlich gibt es dieses Problem schon eine Weile und ich habe noch nicht die perfekte Lösung gefunden. Mehr als glücklich, meine Erfahrungen zu teilen:

  • Vermeiden Sie One-Hot-Codierung so weit wie möglich (im Gegensatz zu den oben vorgeschlagenen). Der Grund ist, dass es nicht funktionieren wird. Ein Modell mit One-Hot-Coding-Funktionen funktioniert nur, wenn alle diese Unterebenen in den Trainingsdaten vorhanden waren. Das Modell kann keine Vorhersagen treffen, es sei denn, es wird manuell angepasst. Wenn Sie suchen, werden Sie feststellen, dass viele Personen bei der Aufteilung ihrer Daten in Zug / Test auf dieses Problem gestoßen sind und das Problem festgestellt hat, dass einige Unterebenen eines bestimmten Features in der Trainingssplit nicht vorhanden waren und anschließend keine Vorhersage für den Test durchgeführt haben. Abgesehen davon, wenn Sie sehr hohe Kardinalmerkmale haben (vielleicht wie Ihre Stadt mit beispielsweise 200 Städtenamen), wird dies die Dimensionalität Ihrer Daten unnötig erhöhen! Wenn Sie aus bestimmten Gründen eine One-Hot-Codierung durchführen müssen, beachten Sie diese.
  • Verwenden Sie andere Codierungsmethoden . Versuchen Sie vielleicht, mehr über andere Methoden zu erfahren, die für dieses Problem robust sind, zumindest vorerst wie zielbasiertes Codieren und Hashing (siehe einige Referenzen unten). Wenn Sie mit Python arbeiten, gibt es ein nettes Paket mit Mant-Codierungsoptionen. Sie werden überrascht sein, dass andere einfache Methoden oft gut funktionieren.

  • Trainieren Sie Ihr Modell neu . Theoretisch sollte Ihr Zug / Set beim Lernen dieselbe Verteilung haben (meistens wird dies als Zielverteilung angesehen, kann aber auch für Variablen zutreffen). Jetzt, da neue Elemente ins Spiel kommen, hat sich Ihre (unsichtbare) Testdatenverteilung geändert. Dann ist es am besten, das Modell erneut zu trainieren , damit diese neuen Städte berücksichtigt werden.

  • Neu hinzugefügte Unterkategorien (und die am wenigsten häufigen) anderen zuordnen . Während ein früherer Punkt theoretisch zutrifft, ist es sehr wahrscheinlich, dass sich die Testverteilung (dieser bestimmten Kategorie) in den meisten Fällen nicht so drastisch ändert, z. B. gehen nur sehr wenige Elemente über die Kategorien im Trainingssatz. Vielleicht haben Sie wie in Ihrem Fall 100 Städte in der Stadt, und im Laufe der Zeit kommen nur sehr wenige neue. Was ich in Betracht ziehen würde, wäre, das X-Quantil dieser bestimmten Kategorie zu betrachten und die am wenigsten häufigen in die Unterkategorie Andere einzuteilen. Angenommen, Ihr neu hinzugefügter Datenpunkt ist nur wenig, dann geht er sehr viel in die AnderenGruppe. Sie werden sicherlich ein gewisses Maß an Granularität verlieren, wenn Sie dies tun, aber auch hier besteht der Lernpunkt darin, dass nicht nur Ihr Modell die Trainingsdaten lernt, sondern vor allem, dass Sie in der Lage sind, unsichtbare Daten und die neu hinzugefügten Kategorien sehr gut zu verallgemeinern Es handelt sich um Datenpunkte, deren Zusammenstellung in der Gruppe " Andere " nicht schaden wird.

  • Andere neuere, noch nicht ausgereifte Lösungen wie Cat2Vec (von Word2Vec von NLP entlehnt) oder Similarity Encoding . Diese sind sehr neu. Überprüfen Sie das Papier auf Ersteres und seinen Github sowie ein Beispiel (basierend auf Word2Vec) in Kaggle und dieses Papier auf Letzteres und dessen Implementierung . Die Idee des ersteren ist, Kategorien in Vektoren umzuwandeln. So viel ich zu sagen habe, es macht wirklich Sinn zu arbeiten, aber ich habe keine Erfahrung damit. Letzteres, so genanntes dirty_cat , sieht vielversprechend und einfach zu bedienen aus. Ob es robust ist, eine unsichtbare Kardinalkategorie in Ihren Testdaten zu haben, ist mir nicht klar!

PS: Ich möchte hinzufügen, dass die Idee der Stadt zu einem geografischen Ort, die im ersten Kommentar angegeben wurde, wirklich nett ist und eigentlich nicht kompliziert ist, da es sich um viele Python-APIs handelt, z. B. von Google oder HIER, mit denen Sie dies tun können. Es wird jedoch darauf hingewiesen, dass dies nur eine Möglichkeit ist, neue Funktionen zu entwickeln und sicherlich nicht durch die Stadtfunktion selbst ersetzt zu werden.

Interessante Hinweise zur Überprüfung der ersten , zweiten , dritten , vierten (keine bestimmte Reihenfolge!)

Alle oben genannten Punkte sind praktische Lösungen, die eher konkret theoretisch korrekt sind und sicherlich weiteren Diskussionen unterliegen. Und ich bin mehr als glücklich, mehr zu lernen.


1
Was ist mit der Schaffung von Clustern ähnlicher Städte? Selbst wenn wir eine neue Stadt haben, ist sie nicht anders als alles, was wir bereits haben. Können wir mit der am besten passenden Stadt abgleichen?
Aditya

Vergnügen Aditya. Das ist auch eine andere hervorragende Idee. Ich weiß nichts über die neue "Ähnlichkeitskodierung", es könnte sein, dass sie genau das Gleiche tun. Überprüfen Sie ihr Tutorial. Auch eine Randnotiz, dass man vorsichtig sein muss, welches Clustering für kategoriale Daten wie k-Modi verwendet werden soll, da all ihre Abstände keine ähnliche Bedeutung haben wie numerische Werte.
TwinPenguins

Vielen Dank für Ihre gute Antwort. Wie könnte ich die Umschulung machen? Ich meine, stellen Sie sich vor, ich habe einen neuen Kandidaten und ich möchte vorhersagen, ob er / sie gut oder schlecht ist. Wie könnte ich mein Modell neu trainieren, wenn ich nicht sein / ihr wahres Etikett habe, das angibt, ob es gut ist oder nicht? Ich sehe keine Möglichkeit, diese neuen Daten für die Umschulung einzubeziehen, und mir wird der Punkt der Vorhersage fehlen. Liege ich falsch?
Marisa

Bitte schön. Informationen zur Umschulung: Es bedeutet wörtlich, von vorne zu beginnen, alle Ihre Daten zu mischen, um sicherzustellen, dass Sie neue Daten haben, und erneut zu lernen. Der andere Punkt, den Sie erwähnt haben, ist, dass Sie nicht die wahre Bezeichnung für diesen bestimmten neuen Datenpunkt haben: Dies ist eine ganz andere Geschichte für sich. Was Sie tun können, um diesen Datenpunkt zu kennzeichnen, ist, den ähnlichsten Datenpunkt zu suchen und die Beschriftung von dort wie den sehr einfachen KNN-Algorithmus zu übernehmen.
TwinPenguins

4

Am einfachsten (was normalerweise ein guter Ausgangspunkt ist) ist es, Ihre Städte nur mit einem Hot-Coding zu codieren, wobei jede Stadt zu einem einzelnen Feature wird und Werte von 1 (die Person stammt aus dieser Stadt) oder 0 (nicht aus) hat diese Stadt). Wenn eine neue Stadt in einem Testsatz angezeigt wird, der nicht im Trainingssatz enthalten ist, hat diese Person nur Nullen für alle Städte im Trainingssatz. Das mag seltsam erscheinen, aber wenn diese Stadt nicht im Trainingsset enthalten ist, sollte eine Person, die aus dieser Stadt stammt, kein Gewicht haben.

Der nächste Schritt wäre etwas in der Art, wie Mohammad Athar es vorgeschlagen hat, und würde sich ein Bild von der geografischen Nähe zu anderen Städten in Ihrem Trainingsset machen. Das wird viel komplizierter, also werde ich es jemand anderem kommentieren lassen.


Einfach anfangen und von dort aus wachsen ist ein guter Rat!
Escachator

0

Sie sollten Vowpal Wabbit ausprobieren , das mit einem Hashing-Trick und adaptiven Lernraten sehr gut mit neuen Funktionen umgeht .

Es stürzt nicht nur nicht ab, wenn neue Funktionen angezeigt werden (zur Zug- oder Testzeit), sondern aktualisiert auch die Gewichte. Darüber hinaus ist es böse schnell. Es werden jedoch nur Varianten des linearen Modells implementiert, sodass Sie auf dieser Seite eingeschränkt sind. Ein sehr mächtiges Werkzeug, über das man Bescheid wissen muss

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.