Wann wird One Hot Encoding vs LabelEncoder vs DictVectorizor verwendet?

96

Ich erstelle seit einiger Zeit Modelle mit kategorialen Daten. In dieser Situation verwende ich standardmäßig die LabelEncoder-Funktion von scikit-learn, um diese Daten vor dem Erstellen eines Modells zu transformieren.

Ich verstehe den Unterschied zwischen OHE, LabelEncoderund DictVectorizorin Hinblick darauf, was sie auf die Daten zu tun, aber was mir nicht klar ist , ist , wenn Sie wählen könnten eine Technik , über eine andere zu beschäftigen.

Gibt es bestimmte Algorithmen oder Situationen, in denen man Vor- / Nachteile gegenüber den anderen hat?

anthr
quelle
2
In Bezug auf die Antwort von AN6U5 und diese Aussage:> Es gibt immer noch Algorithmen wie Entscheidungsbäume und zufällige Gesamtstrukturen, die mit kategorialen Variablen gut funktionieren, und LabelEncoder kann verwendet werden, um Werte mit weniger Speicherplatz zu speichern. Würde die Verwendung von LabelEncoder nicht ein kategoriales in ein numerisches Merkmal umwandeln, wodurch ein Entscheidungsbaum bei einem Wert Aufteilungen ausführt, die nicht wirklich sinnvoll sind, da die Zuordnung willkürlich ist?
Nico
1
Nico, ich denke, was AN6U5 sagt, ist speziell für Entscheidungsbäume. Es funktioniert gut, weil der Baum bei Hund, Katze, Maus oder 1,2,3 aufgeteilt würde und die Bedeutung von "Katze" vs "2" für nicht wichtig ist ein Baum (denken Sie darüber nach, wie er sich spaltet). Im Falle einer logistischen Regression sind die Werte Teil einer Gleichung, da Sie die Gewichtswerte * multiplizieren, was zu Trainingsproblemen und Gewichtsproblemen führen kann, da Hund: 1 und Katze: 2 keine numerische 1 * 2 - Beziehung haben (obwohl es kann immer noch mit genügend Trainingsbeispielen und -epochen arbeiten).
Doug F

Antworten:

125

Es gibt einige Fälle, in denen LabelEncoder oder DictVectorizor nützlich sind, aber diese sind meiner Meinung nach aufgrund der Ordinalität sehr begrenzt.

LabelEncoder kann [Hund, Katze, Hund, Maus, Katze] in [1,2,1,3,2] umwandeln, aber dann bedeutet die auferlegte Ordinalität, dass der Durchschnitt von Hund und Maus Katze ist. Trotzdem gibt es Algorithmen wie Entscheidungsbäume und zufällige Gesamtstrukturen, die gut mit kategorialen Variablen umgehen können, und LabelEncoder kann verwendet werden, um Werte mit weniger Speicherplatz zu speichern.

One-Hot-Encoding hat den Vorteil, dass das Ergebnis eher binär als ordinal ist und dass sich alles in einem orthogonalen Vektorraum befindet. Der Nachteil ist, dass bei hoher Kardinalität der Feature-Space sehr schnell explodieren kann und Sie beginnen, mit dem Fluch der Dimensionalität zu kämpfen. In diesen Fällen verwende ich normalerweise eine One-Hot-Codierung, gefolgt von PCA, um die Dimensionalität zu reduzieren. Ich finde, dass die vernünftige Kombination von One-Hot und PCA selten von anderen Codierungsschemata übertroffen werden kann. PCA stellt die lineare Überlappung fest und neigt daher dazu, ähnliche Merkmale in demselben Merkmal zu gruppieren.

AN6U5
quelle
1
Vielen Dank - das ist sehr hilfreich und macht sehr viel Sinn. Gibt es andere Kodierungsschemata, die Sie für bestimmte / Randfälle verwenden? Haben Sie jemals festgestellt, dass Sie in einer Situation sind, in der Sie unterschiedliche Kodierungsschemata für unterschiedliche Funktionen verwenden?
Anthr
21

Während AN6U5 eine sehr gute Antwort gegeben hat, wollte ich einige Punkte als zukünftige Referenz hinzufügen. Wenn wir One Hot Encoding (OHE) und Label Encoding in Betracht ziehen , müssen wir versuchen zu verstehen, welches Modell Sie erstellen möchten. Die zwei Kategorien von Modellen, die wir betrachten werden, sind:

  1. Baumbasierte Modelle : Gradient Boosted Decision Trees und Random Forests.
  2. Nicht baumbasierte Modelle : Linear, kNN oder Neural Network based.

Überlegen wir uns, wann OHE und wann Label Encoding beim Erstellen von baumbasierten Modellen angewendet werden müssen.

Wir wenden OHE an, wenn:

  1. Wenn die Werte, die in der Beschriftungscodierung nahe beieinander liegen , Zielwerten entsprechen, die nicht nahe beieinander liegen (nicht lineare Daten).
  2. Wenn das kategoriale Merkmal nicht ordinal ist (Hund, Katze, Maus).

Wir wenden Label-Codierung an, wenn:

  1. Das kategoriale Merkmal ist ordinal (Jr. kg, Sr. kg, Grundschule, Gymnasium usw.).
  2. Wenn wir einen Label-Encoder entwickeln können, mit dem enge Labels ähnlichen Kategorien zugeordnet werden : Dies führt zu einer Verringerung der Streuverluste in der Locke und somit zu einer Verkürzung der Ausführungszeit.
  3. Wenn die Anzahl der kategorialen Features im Dataset sehr groß ist: Die One-Hot-Codierung eines kategorialen Features mit einer großen Anzahl von Werten kann zu (1) einem hohen Speicherverbrauch führen und (2) zu dem Fall, dass nicht kategoriale Features nur selten vom Modell verwendet werden. Sie können sich mit dem 1. Fall befassen, wenn Sie spärliche Matrizen verwenden. Der zweite Fall kann auftreten, wenn Sie einen Baum nur mit einer Teilmenge von Features erstellen. Wenn Sie beispielsweise über 9 numerische Features und 1 kategoriales Feature mit 100 eindeutigen Werten verfügen und dieses kategoriale Feature einmal im laufenden Betrieb codiert haben, erhalten Sie 109 Features. Wenn ein Baum nur mit einer Teilmenge von Features erstellt wird, werden die ersten 9 numerischen Features selten verwendet. In diesem Fall können Sie die Größe der Parametersteuerung für diese Teilmenge erhöhen. In xgboost heißt es colsample_bytree, in sklearns Random Forest max_features.

Wenn Sie mit OHE fortfahren möchten, wie von @ AN6U5 vorgeschlagen, können Sie PCA mit OHE kombinieren.

Überlegen wir, wann OHE und Label Encoding beim Erstellen nicht baumbasierter Modelle angewendet werden sollen.

Um die Label-Codierung anzuwenden, muss die Abhängigkeit zwischen Feature und Ziel linear sein, damit die Label-Codierung effektiv genutzt werden kann.

Wenn die Abhängigkeit nicht linear ist, können Sie auch OHE verwenden.

Hinweis: Einige der Erklärungen stammen aus Gewinnen eines Data Science-Wettbewerbs von Coursera.

Pushkaraj Joshi
quelle
Sehr intuitive Erklärung. Sollte es nicht "splits" sein, nicht "spilts"?
29.
0

LabelEncoder steht für Ordnungsdaten, OHE für Nenndaten.

Vochicong
quelle