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 der 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, basierend unter anderem auf einem kategorischen Feature namens car_color. Vielleicht sind rote Autos mehr wert als grüne. Da Hersteller nur eine begrenzte Anzahl von Außenfarben anbieten, ist car_color ein niedrigdimensionales kategorisches Merkmal. 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.
      „Rot“ ist beispielsweise ein Merkmal, „Orange“ ein anderes usw.
Abbildung 1. Ein eindeutiges Merkmal für jede Kategorie.

Übung: Wissen testen

Wahr oder falsch: Ein Machine-Learning-Modell kann direkt mit Rohstringwerten wie „Rot“ und „Schwarz“ trainiert werden, ohne diese Werte in numerische Vektoren umzuwandeln.
Richtig
Falsch

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

Nachdem Sie Strings in eindeutige Indexnummern umgewandelt haben, müssen Sie die Daten weiter verarbeiten, um sie so darzustellen, dass das Modell aussagekräftige Beziehungen zwischen den Werten lernen kann. Wenn die kategorischen Feature-Daten als indexierte Ganzzahlen belassen und in ein Modell geladen werden, werden die indexierten Werte im Modell als kontinuierliche Gleitkommazahlen behandelt. Das Modell würde dann „lila“ sechsmal wahrscheinlicher als „orange“ betrachten.

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 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
„Brown“ 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 bei der Wortschatzrepräsentation:

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.

Sparse 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 das 1 an Position 2 befindet (wenn die Zählung bei 0 beginnt), lautet die spärliche Darstellung für den obigen One-Hot-Vektor:

2

Beachten Sie, dass die sparse Darstellung viel weniger Arbeitsspeicher verbraucht als der One-Hot-Vektor mit acht Elementen. Das Modell muss mit dem One-Hot-Vektor und nicht mit der spärlichen Darstellung trainiert werden.

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 kategorische Merkmale haben eine große Anzahl von Dimensionen, wie die in der folgenden Tabelle:

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. Mithilfe von Einbettungen lässt sich die Anzahl der Dimensionen erheblich reduzieren. Das hat zwei wichtige Vorteile für Modelle:

  • 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.

Kurz gesagt: Beim Hashing wird einer Kategorie (z. B. einer Farbe) eine kleine Ganzzahl zugeordnet – die Nummer des „Buckets“, in dem diese Kategorie gespeichert wird.

Im Detail implementieren Sie einen Hash-Algorithmus so:

  1. Legen Sie die Anzahl der Bins im Vektor der Kategorien auf N fest, wobei N kleiner als die Gesamtzahl der verbleibenden Kategorien ist. Angenommen, N = 100.
  2. Wählen Sie eine Hash-Funktion aus. Oft wird auch der Bereich der Hashwerte ausgewählt.
  3. Jede Kategorie (z. B. eine bestimmte Farbe) wird durch diese Hash-Funktion übergeben, wodurch ein Hashwert generiert wird, z. B. 89237.
  4. Weisen Sie jedem Bin eine Indexnummer des Ausgabe-Hashwerts modulo N zu. In diesem Fall, in dem N = 100 und der Hashwert 89237 ist, ist das Modulo-Ergebnis 37, da 89237 ÷ 100 = 37 ist.
  5. Erstellen Sie mit diesen neuen Indexnummern eine One-Hot-Codierung für jeden Bin.

Weitere Informationen zum Hashing von Daten finden Sie im Abschnitt Zufallsmix des Moduls Produktionssysteme für maschinelles Lernen.