Représentation : extraction de caractéristiques

Dans la programmation traditionnelle, l'accent est mis sur le code. En machine learning, il est mis sur la représentation. En d'autres termes, les développeurs affûtent un modèle en y ajoutant des caractéristiques et en les améliorant.

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 représente un vecteur de caractéristiques, qui est l'ensemble des valeurs en virgule flottante comprenant les exemples de votre ensemble de données. L'extraction de caractéristiques consiste à transformer les données brutes en un vecteur de caractéristiques. Notez que cette opération prend beaucoup de temps.

Pour de nombreux modèles de machine learning, vous devrez représenter les caractéristiques sous forme de vecteurs de 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éristique grâce à un processus appelé "extraction de caractéristiques".

Figure 1 : Mise en correspondance des données brutes avec les caractéristiques ML par le biais de l'extraction de caractéristiques

Mettre en correspondance des valeurs numériques

Les entiers et les nombres à virgule flottante n'ont pas besoin d'encodage spécifique, 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 : Mise en correspondance de valeurs entières avec des valeurs en virgule flottante

Mise en correspondance de valeurs catégorielles

Les caractéristiques catégorielles ont un ensemble discret de valeurs possibles. Par exemple, vous pourriez avoir une caractéristique intitulé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 des pondérations apprises, nous utilisons l'extraction de caractéristiques pour convertir ces chaînes en valeurs numériques.

Pour cela, il faut mettre en correspondance les valeurs des caractéristiques, que nous appellerons le vocabulaire des valeurs possibles, avec des entiers. Dans la mesure où toutes les rues du monde n'apparaissent pas dans notre ensemble de données, nous pouvons grouper toutes les autres rues dans une catégorie fourre-tout de type "Autre", également appelée Ensemble hors vocabulaire.

En suivant cette approche, voici comment nous allons mettre en correspondance les noms de rues avec des nombres :

  • La chaîne "Charleston Road" sera mise en correspondance avec la valeur "0".
  • La chaîne "North Shoreline Boulevard" sera mise en correspondance avec la valeur "1".
  • La chaîne "Shorebird Way" sera mise en correspondance avec la valeur "2".
  • La chaîne "Rengstorff Avenue" sera mise en correspondance avec la valeur "3".
  • Les autres noms de rues (hors vocabulaire) seront mis en correspondance avec la valeur "4".

Cependant, si nous incorporons ces valeurs d'index directement dans notre modèle, nous risquons d'introduire certaines contraintes problématiques.

  • Nous allons apprendre une pondération unique, applicable à tous les noms de rues. Par exemple, si nous apprenons une pondération de 6 pour street_name, cette pondération sera multipliée par 0 pour "Charleston Road", par 1 pour "North Shoreline Boulevard", par 2 pour "Shorebird Way", etc. Prenons un modèle qui prédit les prix de l'immobilier et qui utilise la caractéristique street_name. Il est peu probable que les prix varient de façon linéaire en fonction du nom de la rue. De plus, cela supposerait de classer préalablement les noms de rues en fonction du prix moyen de l'immobilier dans ces dernières. Notre modèle doit avoir la souplesse nécessaire pour apprendre des pondérations différentes pour chaque rue. Ces pondérations viendront ensuite compléter le prix de l'immobilier 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 habitations sont situées à l'angle de deux rues, et il n'y a pas moyen d'encoder cette information dans la valeur street_name si elle ne contient qu'un seul index.

Pour nous débarrasser de ces deux contraintes, nous pouvons créer à la place un vecteur binaire pour chaque caractéristique catégorique de notre modèle, ce qui donnerait les valeurs suivantes :

  • Les éléments vectoriels correspondant aux valeurs applicables à notre exemple prendront la valeur 1.
  • Tous les autres éléments prendront la valeur 0.

La dimension de ce vecteur est égale au nombre d'éléments dans le vocabulaire. On parle alors d'encodage one-hot si une seule valeur est définie sur 1, et d'encodage multi-hot si plusieurs valeurs sont définies sur 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.

Mise en correspondance d'une valeur de chaîne ("Shorebird Way") avec un vecteur creux, grâce à l'encodage one-hot

Figure 3 : Mise en correspondance des adresses postales avec l'encodage one-hot

Cette approche permet de créer une variable booléenne pour chaque valeur de caractéristique (par exemple, le nom de rue). Dans cet exemple, si une habitation se trouve dans la rue "Shorebird Way", la valeur binaire sera 1 pour "Shorebird Way" uniquement. De cette manière, le modèle n'utilise de pondération que pour la rue "Shorebird Way".

De même, si une habitation se situe à l'angle de deux rues, deux valeurs binaires seront définies sur 1. Ainsi, le modèle pourra utiliser les pondérations de ces deux rues.

Représentation creuse

Supposons que vous ayez un million de noms de rues différents dans votre ensemble de données et que vous vouliez les inclure sous forme de valeurs pour street_name. Si vous choisissez de représenter ces données à l'aide d'un vecteur binaire pour un million d'éléments où seulement un ou deux éléments seront vrais, cela s'avérera vraiment inefficace en matière de stockage et de temps de calcul. Dans ce cas, une approche courante consiste à utiliser une représentation creuse dans laquelle seules les valeurs non définies sur 0 seront stockées. Dans les représentations creuses, le modèle continue d'apprendre des pondérations indépendantes pour chaque valeur de caractéristique, comme décrit plus haut.

Envoyer des commentaires concernant…

Cours d'initiation au machine learning