Kategorische Daten: Vokabular- und One-Hot-Codierung

Der Begriff Dimension ist ein Synonym für die Anzahl der Elemente in einem Merkmalsvektor. Einige kategorische Merkmale sind niedrigdimensional. Beispiel:

Name der Funktion Anzahl der Kategorien Beispielkategorien
snowed_today 2 Wahr, Falsch
skill_level 3 Anfänger, Praktiker, Experte
season 4 Winter, Frühling, Sommer, Herbst
day_of_week 7 Montag, Dienstag, Mittwoch
Planet 8 Merkur, Venus, Erde

Wenn ein kategorisches Merkmal nur wenige mögliche Kategorien hat, können Sie es als Vokabular codieren. Bei einer Vokabularcodierung behandelt das Modell jeden möglichen kategorischen Wert als separates Merkmal. Während des Trainings lernt das Modell unterschiedliche Gewichtungen für jede Kategorie.

Angenommen, Sie erstellen ein Modell, um den Preis eines Autos vorherzusagen, der unter anderem auf einem kategorischen Feature namens car_color basiert. Vielleicht sind rote Autos mehr wert als grüne. Da Hersteller eine begrenzte Anzahl von Außenfarben anbieten, ist car_color ein niedrigdimensionales kategoriales Feature. Die folgende Abbildung zeigt ein Vokabular (mögliche Werte) für car_color:

Abbildung 1: Jede Farbe in der Palette wird als separates Element dargestellt. Jede Farbe ist also ein separates Merkmal im Merkmalsvektor.
      Beispielsweise ist „Rot“ ein Element, „Orange“ ein separates Element und so weiter.
Abbildung 1. Ein eindeutiges Merkmal für jede Kategorie.

Übung: Teste deine Intuition

Richtig oder falsch: Ein Modell für maschinelles Lernen kann direkt mit Rohstringwerten wie "Red" und "Black" trainieren, ohne diese Werte in numerische Vektoren umzuwandeln.
Richtig
Während des Trainings kann ein Modell nur Gleitkommazahlen bearbeiten. Der String "Red" ist keine Gleitkommazahl. Sie müssen Strings wie "Red" in Gleitkommazahlen konvertieren.
Falsch
Ein Modell für maschinelles Lernen kann nur mit Merkmalen mit Gleitkommawerten trainiert werden. Sie müssen diese Strings daher vor dem Training in Gleitkommawerte umwandeln.

Indexzahlen

Modelle für maschinelles Lernen können nur Gleitkommazahlen verarbeiten. Daher müssen Sie jeden String in eine eindeutige Indexnummer umwandeln, wie in der folgenden Abbildung dargestellt:

Abbildung 2. Jede Farbe ist mit einem eindeutigen Ganzzahlwert verknüpft. Beispielsweise wird „Rot“ mit der Ganzzahl 0, „Orange“ mit der Ganzzahl 1 usw. verknüpft.
Abbildung 2. Indexierte Features

Übung: Teste deine Intuition

Sollte Ihr Modell direkt anhand der Indexzahlen in Abbildung 2 trainiert werden?
Ja
Wenn das Modell mit den Indexnummern trainiert würde, würde es jede davon fälschlicherweise als numerischen Wert behandeln und "Black" (Indexnummer 5) als fünfmal aussagekräftiger für das Modell betrachten als "Orange" (Indexnummer 1).
Nein
Ihr Modell sollte nicht anhand der Indexzahlen trainiert werden. Andernfalls würde Ihr Modell jede Indexnummer als numerischen Wert behandeln und "Black" (Indexnummer 5) als fünfmal aussagekräftiger für das Modell betrachten als "Orange" (Indexnummer 1).

One-Hot-Codierung

Im nächsten Schritt beim Erstellen eines Vokabulars werden die einzelnen Indexnummern in ihre One-Hot-Codierung umgewandelt. Bei der One-Hot-Codierung:

  • Jede Kategorie wird durch einen Vektor (Array) mit N Elementen dargestellt, wobei N die Anzahl der Kategorien ist. Wenn car_color beispielsweise acht mögliche Kategorien hat, hat der One-Hot-Vektor, der sie darstellt, acht Elemente.
  • Genau ein Element in einem One-Hot-Vektor hat den Wert 1,0. Alle anderen Elemente haben den Wert 0,0.

In der folgenden Tabelle sehen Sie beispielsweise die One-Hot-Codierung für jedes Element in car_color:

Funktion Rot Orange Blau Gelb Grün Schwarz Lila Braun
„Rot“ 1 0 0 0 0 0 0 0
„Orange“ 0 1 0 0 0 0 0 0
„Blau“ 0 0 1 0 0 0 0 0
„Gelb“ 0 0 0 1 0 0 0 0
„Grün“ 0 0 0 0 1 0 0 0
„Schwarz“ 0 0 0 0 0 1 0 0
„Violett“ 0 0 0 0 0 0 1 0
„Braun“ 0 0 0 0 0 0 0 1

Es ist der One-Hot-Vektor, nicht der String oder die Indexnummer, der an den Featurevektor übergeben wird. Das Modell lernt eine separate Gewichtung für jedes Element des Merkmalsvektors.

Die folgende Abbildung zeigt die verschiedenen Transformationen in der Vokabulardarstellung:

Abbildung 3: Diagramm des End-to-End-Prozesses zur Zuordnung von Kategorien zu Featurevektoren. Im Diagramm sind die Eingabefeatures „Gelb“, „Orange“, „Blau“ und noch einmal „Blau“.  Das System verwendet ein gespeichertes Vokabular (z. B. „Rot“ ist 0, „Orange“ ist 1, „Blau“ ist 2, „Gelb“ ist 3 usw.), um den Eingabewert einer ID zuzuordnen. Daher ordnet das System „Gelb“, „Orange“, „Blau“ und „Blau“ den Werten 3, 1, 2 und 2 zu. Das System wandelt diese Werte dann in einen One-Hot-Ebenenvektor um. Bei einem System mit acht möglichen Farben wird beispielsweise „3“ zu „0, 0, 0, 1, 0, 0, 0, 0“.
Abbildung 3. Der End-to-End-Prozess zum Zuordnen von Kategorien zu Featurevektoren.

Dünne Darstellung

Ein Feature, dessen Werte überwiegend null (oder leer) sind, wird als sperriges Feature bezeichnet. Viele kategorische Merkmale wie car_color sind in der Regel spärliche Merkmale. Bei der spaltensparenden Darstellung wird die Position von 1.0 in einem spärlichen Vektor gespeichert. Der One-Hot-Vektor für "Blue" sieht beispielsweise so aus:

[0, 0, 1, 0, 0, 0, 0, 0]

Da sich 1 an Position 2 befindet (beim Start der Zählung bei 0), sieht die dünnbesetzte Darstellung für den vorherigen One-Hot-Vektor so aus:

2

Beachten Sie, dass die sparse Darstellung viel weniger Arbeitsspeicher verbraucht als der One-Hot-Vektor mit acht Elementen. Wichtig ist, dass das Modell auf dem One-Hot-Vektor trainiert wird, nicht mit der dünnbesetzten Darstellung.

Ausreißer in kategorischen Daten

Wie numerische Daten enthalten auch kategorische Daten Ausreißer. Angenommen, car_color enthält nicht nur die beliebten Farben, sondern auch einige selten verwendete Ausreißerfarben wie "Mauve" oder "Avocado". Anstatt jeder dieser Abweichungsfarben eine separate Kategorie zuzuweisen, können Sie sie in einer einzigen „Allgemeinen Kategorie“ namens Out-of-Vocabulary (OOV) zusammenfassen. Mit anderen Worten: Alle Abweichungsfarben werden in einem einzigen Abweichungs-Bucket zusammengefasst. Das System lernt ein einzelnes Gewicht für diesen Ausreißer-Bucket.

Hochdimensionale kategorische Merkmale codieren

Einige kategoriale Merkmale haben eine hohe Anzahl von Dimensionen, wie in der folgenden Tabelle gezeigt:

Name der Funktion Anzahl der Kategorien Beispielkategorien
words_in_english ~ 500.000 „glücklich“, „spazieren“
US_postal_codes ~42.000 „02114“, „90301“
last_names_in_Germany ~ 850.000 „Schmidt“, „Schneider“

Bei einer hohen Anzahl von Kategorien ist die One-Hot-Codierung in der Regel keine gute Wahl. Einbettungen, die in einem separaten Modul zu Einbettungen beschrieben werden, sind in der Regel eine viel bessere Wahl. Durch Einbettungen wird die Anzahl der Dimensionen erheblich reduziert, was Modelle in zwei wichtigen Bereichen nutzen kann:

  • Das Modell wird in der Regel schneller trainiert.
  • Mit dem erstellten Modell lassen sich in der Regel schneller Vorhersagen treffen. Das Modell hat also eine geringere Latenz.

Hash-Technologie (auch Hash-Trick genannt) ist eine weniger gängige Methode, um die Anzahl der Dimensionen zu reduzieren.