Codierung kategorialer Variablen unter Verwendung der Wahrscheinlichkeitsschätzung

22

Ich versuche zu verstehen, wie ich mithilfe der Wahrscheinlichkeitsschätzung kategoriale Variablen codieren kann, habe aber bisher nur wenig Erfolg gehabt.

Anregungen wäre sehr dankbar.

kleiner Zwerg
quelle
Was tun während der Vorhersagezeit, wenn wir keine Zielbeschriftung haben?
Ranjeet Singh

Antworten:

24

Ich habe auch dieses Thema gelernt und Folgendes gefunden:

  • Diese Art der Codierung wird Likelihood-Codierung , Impact-Codierung oder Zielcodierung genannt

  • Die Idee ist, Ihre kategoriale Variable unter Verwendung der Zielvariablen zu codieren (kontinuierlich oder kategorial, abhängig von der Aufgabe). Wenn Sie beispielsweise eine Regressionsaufgabe haben, können Sie Ihre kategoriale Variable mit dem Mittelwert des Ziels codieren. Für jede Kategorie berechnen Sie den entsprechenden Mittelwert des Ziels (unter dieser Kategorie) und ersetzen den Wert einer Kategorie durch diesen Mittelwert.

  • Wenn Sie eine Klassifizierungsaufgabe haben, berechnen Sie die relative Häufigkeit Ihres Ziels in Bezug auf jeden Kategoriewert.

  • Aus mathematischer Sicht bedeutet diese Kodierung eine Wahrscheinlichkeit Ihres Ziels, die von jedem Kategoriewert abhängig ist.

  • Wenn Sie es auf einfache Weise tun, wie ich oben beschrieben habe, werden Sie wahrscheinlich eine voreingenommene Schätzung erhalten. Aus diesem Grund verwenden sie in der Kaggle-Community normalerweise zwei Ebenen der Kreuzvalidierung. Lies diesen Kommentar von raddar hier . Das entsprechende Notizbuch ist hier .

Das Zitat:

Es nimmt den Mittelwert von y an. Aber nicht einfach gemein, sondern in Kreuzvalidierung in Kreuzvalidierungsweise;

Angenommen, wir haben eine 20-fache Kreuzvalidierung. wir müssen irgendwie den Mittelwert des Merkmals für die Nr. 1-Falte berechnen, wobei wir nur Informationen von Nr. 2- Nr. 20-Falten verwenden.

Also nimmst du 2- bis 20-fach und erstellst ein weiteres Kreuzvalidierungsset (ich habe das 10-fach gemacht). Berechnen Sie den Mittelwert für jede ausgelassene Falte (am Ende erhalten Sie 10 Mittelwerte). Sie mitteln diese 10 Mittelwerte und wenden diesen Vektor für Ihren primären Validierungssatz Nr. 1 an. Wiederholen Sie dies für die restlichen 19 Falten.

Es ist schwer zu erklären, schwer zu verstehen und zu meistern :) Aber wenn es richtig gemacht wird, kann es viele Vorteile bringen :)

  • Eine andere Implementierung dieser Codierung ist hier .

  • In R library vtreat wurde die Impact-Codierung implementiert. Siehe diesen Beitrag .

  • In der CatBoost-Bibliothek stehen zahlreiche Optionen für die Codierung von kategorialen Variablen zur Verfügung, einschließlich der Zielcodierung .

  • Es gibt noch keine solche Kodierung in sklearn.

Galina Alperovich
quelle
1
Es gibt Zielcodierung
Josh
Wie würden Sie die Feature-Interaktion implementieren, wenn Sie die Zielcodierung verwenden? Beispielsweise haben Sie F1 und F2 als Ziel codiert. Würden Sie einfach die codierten Werte F1 * F2 multiplizieren?
Michael Larionov
Wenn Sie den Mittelwert für jede LOO-Falte berechnen, dann nehmen Sie einen Durchschnitt von ihnen, es ist genau das gleiche, wie Sie den Mittelwert von # 2- # 20-Falte nehmen. Ich verstehe nicht, warum dies als CV betrachtet werden kann. Ich verstehe auch nicht, was er mit "Vektor" meint, wenn er diese 10 Mittelwerte mittelt.
SiXUlm
Ein später Kommentar; Die Zielcodierung in Category Encoders ist eine einfache Durchschnittscodierung. es führt nicht die von raddar beschriebene Fold-in-Fold-Regularisierung durch.
Dan Scally
7

Die Zielcodierung ist jetzt in sklearn über das category_encoders-Paket verfügbar .

Ziel-Encoder

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, smoothing = 1)

Zielkodierung für kategoriale Merkmale. Basierend auf einem Auslassungsansatz.

Wie von Josh im Kommentar oben vermerkt.

Jeffhale
quelle
1

Die Likelihood-Codierung ist beim Scikit-Lernen immer noch nicht verfügbar. Sie können dies tun, indem Sie ein Wörterbuch erstellen und dann eine Ersetzungsfunktion ausführen.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
quelle