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 sex
wären female
, wären die einzig möglichen Bezeichnungen male
und other
, egal was passiert. Meine kategoriale Variable ist jedoch city
so, 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.
city
basierend auf einer Funktion in eine Zahl konvertieren ? Aufcity' = f(latitude, longitude)
diese Weise können Sie einen neuen Wert für jede Stadt schaffenAntworten:
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:
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.
quelle
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.
quelle
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
quelle