Darstellung: Feature Engineering

Bei der traditionellen Programmierung liegt der Fokus auf dem Code. Bei ML-Projekten verlagert sich der Fokus auf Repräsentation. Eine Möglichkeit, wie Entwickler ein Modell optimieren, besteht darin, Funktionen hinzuzufügen und zu verbessern.

Rohdaten zu Funktionen zuordnen

Auf der linken Seite von Abbildung 1 sind Rohdaten aus einer Eingabedatenquelle dargestellt. Auf der rechten Seite ist ein Featurevektor dargestellt. Dabei handelt es sich um den Satz von Gleitkommawerten, aus dem die Beispiele in Ihrem Dataset bestehen. Feature Engineering bedeutet die Umwandlung von Rohdaten in einen Featurevektor. Sie müssen damit rechnen, dass Sie viel Zeit mit Feature Engineering verbringen.

Bei vielen Modellen für maschinelles Lernen müssen die Merkmale als Vektoren mit reellen Zahlen dargestellt werden, da die Featurewerte mit den Modellgewichtungen multipliziert werden müssen.

Einem Featurevektor werden Rohdaten über ein Verfahren zugeordnet, das als Feature Engineering bezeichnet wird.

Abbildung 1. Feature Engineering ordnet Rohdaten den ML-Features zu.

Numerische Werte zuordnen

Ganzzahl- und Gleitkommadaten benötigen keine spezielle Codierung, da sie mit einer numerischen Gewichtung multipliziert werden können. Wie in Abbildung 2 vorgeschlagen, ist das Umwandeln des ganzzahligen Rohwerts 6 in den Merkmalswert 6.0 einfach:

Beispiel für ein Feature, das direkt aus den Rohdaten kopiert werden kann

Abbildung 2. Zuordnung von Ganzzahlwerten zu Gleitkommawerten

Kategoriale Werte zuordnen

Kategoriale Merkmale haben einen diskreten Satz möglicher Werte. Es gibt beispielsweise ein Feature namens street_name mit folgenden Optionen:

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

Da Modelle Strings nicht mit den gelernten Gewichtungen multiplizieren können, verwenden wir Feature Engineering, um Strings in numerische Werte umzuwandeln.

Dazu definieren wir eine Zuordnung aus den Featurewerten, die wir als Vokabular möglicher Werte bezeichnen, zu Ganzzahlen. Da nicht jede Straße der Welt in unserem Dataset enthalten ist, können wir alle anderen Straßen in einer Catchall-Kategorie „Sonstige“ gruppieren, die als außerhalb des Vokabulars bezeichnet wird.

Mit diesem Ansatz können wir unsere Straßennamen Nummern zuordnen:

  • Karte Charleston Road nach 0
  • Karte North Shoreline Boulevard Richtung 1
  • Karte Shorebird Way to 2
  • Karte Rengstorff Avenue zu 3
  • Alles andere (OOV) zu 4 zuordnen

Wenn wir diese Indexnummern jedoch direkt in unser Modell einbinden, ergeben sich einige Einschränkungen, die problematisch sein können:

  • Wir werden eine Gewichtung lernen, die für alle Straßen gilt. Wenn wir beispielsweise eine Gewichtung von 6 für street_name erfahren, multiplizieren wir sie mit 0 für die Charleston Road, mit 1 für den North Shoreline Boulevard, mit 2 für den Shorebird Way und so weiter. Betrachten Sie ein Modell, das die Hauspreise mithilfe von street_name als Feature vorhersagt. Es ist unwahrscheinlich, dass es eine lineare Anpassung des Preises auf der Grundlage des Straßennamens gibt. Darüber hinaus wird davon ausgegangen, dass Sie die Straßen anhand ihres durchschnittlichen Hauspreises geordnet haben. Unser Modell benötigt die Flexibilität, für jede Straße unterschiedliche Gewichtungen zu erlernen, die mithilfe der anderen Merkmale zum geschätzten Preis addiert werden.

  • Fälle, in denen street_name mehrere Werte annehmen kann, wird nicht berücksichtigt. Beispielsweise befinden sich viele Häuser an der Ecke von zwei Straßen und es gibt keine Möglichkeit, diese Informationen im Wert street_name zu codieren, wenn dieser einen einzelnen Index enthält.

Um diese beiden Einschränkungen zu entfernen, können wir stattdessen für jedes kategoriale Feature in unserem Modell einen binären Vektor erstellen, der die Werte so darstellt:

  • Legen Sie für Werte, die für das Beispiel gelten, die entsprechenden Vektorelemente auf 1 fest.
  • Legen Sie für alle anderen Elemente 0 fest.

Die Länge dieses Vektors entspricht der Anzahl der Elemente im Vokabular. Diese Darstellung wird als One-Hot-Codierung bezeichnet, wenn ein einzelner Wert 1 ist, und als Multi-Hot-Codierung, wenn mehrere Werte 1 sind.

Abbildung 3 zeigt eine One-Hot-Codierung einer bestimmten Straße: Shorebird Way. Das Element im Binärvektor für den Shorebird-Weg hat den Wert 1, während die Elemente für alle anderen Straßen den Wert 0 haben.

Stringwert (

Abbildung 3. Zuordnung von Straßennamen per One-Hot-Codierung

Bei diesem Ansatz wird für jeden Elementwert (z.B. Straßenname) eine boolesche Variable erstellt. Wenn sich hier ein Haus am Shorebird Way befindet, ist der Binärwert nur für Shorebird Way 1. Daher verwendet das Modell nur die Gewichtung für Shorebird Way.

Ähnlich verhält es sich, wenn sich ein Haus an der Ecke von zwei Straßen befindet, dann werden zwei Binärwerte auf 1 gesetzt und das Modell verwendet beide ihre jeweiligen Gewichtungen.

Dünnbesetzte Darstellung

Angenommen,Ihr Dataset enthält 1.000.000 verschiedene Straßennamen,die Sie als Werte für street_name aufnehmen möchten. Das explizite Erstellen eines binären Vektors mit 1.000.000 Elementen,bei dem nur ein oder zwei Elemente zutreffen,ist eine sehr ineffiziente Darstellung in Bezug auf die Speicher- und Rechenzeit bei der Verarbeitung dieser Vektoren. In dieser Situation wird häufig eine dünnbesetzte Darstellung verwendet, in der nur Werte ungleich null gespeichert sind. In dünnbesetzten Darstellungen wird wie oben beschrieben trotzdem eine unabhängige Modellgewichtung für jeden Featurewert gelernt.