Représentation: extraction de caractéristiques

En programmation classique, l'accent est mis sur le code. Dans les projets de ML, l'accent est mis sur la représentation. Pour perfectionner un modèle, les développeurs utilisent l'ajout et l'amélioration de ses caractéristiques.

Mettre en correspondance des données brutes avec des caractéristiques

La partie gauche de la figure 1 illustre des données brutes provenant d'une source de données d'entrée. La partie droite illustre un vecteur de caractéristiques, qui est l'ensemble de valeurs à virgule flottante comprenant les exemples de votre ensemble de données. L'extraction de caractéristiques consiste à transformer des données brutes en un vecteur de caractéristiques. Attendez-vous à consacrer beaucoup de temps à l'extraction de caractéristiques.

De nombreux modèles de machine learning doivent représenter les caractéristiques sous forme de vecteurs à nombres réels, car les valeurs des caractéristiques doivent être multipliées par les pondérations du modèle.

Les données brutes sont mises en correspondance avec un vecteur de caractéristiques via un processus appelé "extraction de caractéristiques".

Figure 1. L'extraction de caractéristiques mappe les données brutes aux caractéristiques ML.

Mettre en correspondance des valeurs numériques

Les nombres entiers et à virgule flottante ne nécessitent pas d'encodage spécial, car ils peuvent être multipliés par une pondération numérique. Comme suggéré sur la figure 2, la conversion de la valeur entière brute 6 en valeur de caractéristique 6,0 est simple:

Exemple de caractéristique qui peut être copiée directement des données brutes

Figure 2 Mapper des valeurs entières avec des valeurs à virgule flottante

Mapper des valeurs catégorielles

Les caractéristiques catégorielles ont un ensemble discret de valeurs possibles. Par exemple, vous pourriez avoir une fonctionnalité appelée street_name avec les options suivantes:

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

Étant donné que les modèles ne peuvent pas multiplier des chaînes par les pondérations apprises, nous utilisons l'extraction de caractéristiques pour convertir les chaînes en valeurs numériques.

Pour ce faire, il faut mettre en correspondance les valeurs des caractéristiques, que nous appellerons le vocabulaire des valeurs possibles, avec des entiers. Étant donné que toutes les rues du monde n'apparaissent pas dans notre ensemble de données, nous pouvons regrouper toutes les autres rues dans une catégorie générique "autre", appelée ensemble hors vocabulaire.

En utilisant cette approche, nous pouvons mapper les noms de nos rues à des numéros:

  • La chaîne "Charleston Road" sera mise en correspondance avec la valeur "0".
  • La carte "North Shoreline Boulevard" sera mise en correspondance avec la valeur "1".
  • Mapper Shorebird Way sur 2
  • La chaîne "Rengstorff Avenue" sera mise en correspondance avec la valeur "3".
  • mettre en correspondance tout le reste avec 4

Toutefois, si nous incorporons ces numéros d'index directement dans notre modèle, certaines contraintes peuvent s'avérer problématiques:

  • Nous allons apprendre une pondération unique qui s'appliquera à toutes les rues. Par exemple, si nous apprenons une pondération de 6 pour street_name, nous la multiplions par 0 pour Charleston Road, par 1 pour North Shoreline Boulevard, par 2 pour Shorebird Way, etc. Prenons l'exemple d'un modèle qui prédit les prix d'une maison en utilisant la caractéristique street_name. Il est peu probable qu'il y ait un ajustement linéaire du prix en fonction du nom de la rue. De plus, cela supposerait que vous ayez classé les rues en fonction du prix moyen de l'habitation. Notre modèle a besoin de la flexibilité nécessaire pour apprendre des pondérations différentes pour chaque rue. Ces pondérations seront ajoutées au prix estimé à l'aide des autres caractéristiques.

  • Nous ne tenons pas compte des cas où street_name peut prendre plusieurs valeurs. Par exemple, de nombreuses maisons sont situées à l'angle de deux rues, et il n'est pas possible d'encoder ces informations dans la valeur street_name si elles ne contiennent qu'un seul index.

Pour supprimer ces deux contraintes, nous pouvons créer un vecteur binaire pour chaque caractéristique catégorielle de notre modèle, qui représente les valeurs comme suit:

  • Pour les valeurs qui s'appliquent à l'exemple, définissez les éléments vectoriels correspondants sur 1.
  • Définissez tous les autres éléments sur 0.

La longueur de ce vecteur est égale au nombre d'éléments dans le vocabulaire. Cette représentation est appelée encodage one-hot si une seule valeur est égale à 1, et encodage multi-hot si plusieurs valeurs sont égales à 1.

La figure 3 illustre l'encodage one-hot d'une rue en particulier, Shorebird Way. L'élément dans le vecteur binaire pour Shorebird Way a une valeur de 1, tandis que les éléments pour toutes les autres rues ont des valeurs de 0.

Mapper une valeur de chaîne (

Figure 3. Mapper l'adresse postale via l'encodage one-hot

Cette approche crée efficacement une variable booléenne pour chaque valeur de caractéristique (par exemple, nom de rue). Ici, si une maison se trouve sur Shorebird Way, la valeur binaire est 1 uniquement pour Shorebird Way. Ainsi, le modèle n'utilise que la pondération de Shorebird Way.

De même, si une maison se trouve à l'angle de deux rues, deux valeurs binaires sont définies sur 1, et le modèle utilise leurs pondérations respectives.

Représentation creuse

Supposons que votre ensemble de données comporte 1 000 000 de noms de rues différents que vous souhaitiez inclure en tant que valeurs pour street_name. Créer explicitement un vecteur binaire de 1 000 000 d'éléments où seulement un ou deux éléments sont vrais est une représentation très inefficace en termes de stockage et de temps de calcul lors du traitement de ces vecteurs. Dans ce cas, une approche courante consiste à utiliser une représentation creuse dans laquelle seules les valeurs non nulles sont stockées. Dans les représentations creuses, une pondération de modèle indépendante est toujours apprise pour chaque valeur de caractéristique, comme décrit ci-dessus.