Données catégorielles: vocabulaire et encodage one-hot

Le terme dimension est synonyme du nombre d'éléments dans un vecteur de caractéristiques. Certaines caractéristiques catégorielles sont de faible dimension. Exemple :

Nom de la fonctionnalité Nombre de catégories Exemples de catégories
snowed_today 2 True, False
skill_level 3 Débutant, Professionnel, Expert
season 4 Hiver, printemps, été, automne
day_of_week 7 Lundi, mardi, mercredi
planète 8 Mercure, Vénus, Terre

Lorsqu'une caractéristique catégorielle comporte un faible nombre de catégories possibles, vous pouvez l'encoder en tant que vocabulaire. Avec un encodage du vocabulaire, le modèle traite chaque valeur catégorielle possible comme une caractéristique distincte. Pendant l'entraînement, le modèle apprend différentes pondérations pour chaque catégorie.

Par exemple, supposons que vous créez un modèle pour prédire le prix d'une voiture en fonction, en partie, d'une caractéristique catégorielle nommée car_color. Peut-être que les voitures rouges valent plus que les voitures vertes. Étant donné que les fabricants proposent un nombre limité de couleurs extérieures, car_color est une caractéristique catégorielle de faible dimension. L'illustration suivante suggère un vocabulaire (valeurs possibles) pour car_color :

Figure 1. Chaque couleur de la palette est représentée par une caractéristique distincte. Autrement dit, chaque couleur est une caractéristique distincte dans le vecteur de caractéristiques.
      Par exemple, "Rouge" est une caractéristique, "Orange" est une autre caractéristique, etc.
Figure 1. Une fonctionnalité unique pour chaque catégorie.

Exercice : Vérifier vos connaissances

Vrai ou faux : Un modèle de machine learning peut s'entraîner directement sur des valeurs de chaîne brutes, comme "Rouge" et "Noir", sans convertir ces valeurs en vecteurs numériques.
Vrai
Pendant l'entraînement, un modèle ne peut manipuler que des nombres à virgule flottante. La chaîne "Red" n'est pas un nombre à virgule flottante. Vous devez convertir les chaînes telles que "Red" en nombres à virgule flottante.
Faux
Un modèle de machine learning ne peut s'entraîner que sur des caractéristiques avec des valeurs à virgule flottante. Vous devrez donc convertir ces chaînes en valeurs à virgule flottante avant l'entraînement.

Numéros d'index

Les modèles de machine learning ne peuvent manipuler que des nombres à virgule flottante. Vous devez donc convertir chaque chaîne en un numéro d'index unique, comme dans l'illustration suivante :

Figure 2. Chaque couleur est associée à une valeur entière unique. Par exemple, "Rouge" est associé à l'entier 0, "Orange" à l'entier 1, et ainsi de suite.
Figure 2. Caractéristiques indexées.

Après avoir converti les chaînes en numéros d'index uniques, vous devrez traiter les données plus en détail pour les représenter de manière à aider le modèle à apprendre des relations significatives entre les valeurs. Si les données de caractéristiques catégorielles sont laissées sous forme d'entiers indexés et chargées dans un modèle, celui-ci traitera les valeurs indexées comme des nombres à virgule flottante continus. Le modèle considérerait alors que "violet" est six fois plus probable que "orange".

Encodage one-hot

L'étape suivante pour créer un vocabulaire consiste à convertir chaque numéro d'index en encodage one-hot. Dans un encodage one-hot :

  • Chaque catégorie est représentée par un vecteur (tableau) de N éléments, où N est le nombre de catégories. Par exemple, si car_color comporte huit catégories possibles, le vecteur one-hot qui le représente aura huit éléments.
  • Dans un vecteur one-hot, un seul élément a la valeur 1.0, et tous les autres ont la valeur 0.0.

Par exemple, le tableau suivant montre l'encodage one-hot pour chaque couleur dans car_color :

Fonctionnalité Rouge Orange Bleu Jaune Vert Noir Violet Brown
"Rouge" 1 0 0 0 0 0 0 0
"Orange" 0 1 0 0 0 0 0 0
"Bleu" 0 0 1 0 0 0 0 0
"Jaune" 0 0 0 1 0 0 0 0
"Vert" 0 0 0 0 1 0 0 0
"Noir" 0 0 0 0 0 1 0 0
"Violet" 0 0 0 0 0 0 1 0
"Marron" 0 0 0 0 0 0 0 1

C'est le vecteur one-hot, et non la chaîne ni le numéro d'index, qui est transmis au vecteur de caractéristiques. Le modèle apprend une pondération distincte pour chaque élément du vecteur de caractéristiques.

L'illustration suivante suggère les différentes transformations dans la représentation du vocabulaire :

Figure 3. Schéma du processus de bout en bout permettant de mapper les catégories aux vecteurs de caractéristiques. Dans le diagramme, les caractéristiques d'entrée sont "Yellow", "Orange", "Blue" et "Blue" une deuxième fois.  Le système utilise un vocabulaire stocké ("Rouge" correspond à 0, "Orange" à 1, "Bleu" à 2, "Jaune" à 3, etc.) pour mapper la valeur d'entrée à un ID. Le système mappe donc "Jaune", "Orange", "Bleu" et "Bleu" sur 3, 1, 2 et 2. Le système convertit ensuite ces valeurs en vecteur de caractéristiques one-hot. Par exemple, pour un système avec huit couleurs possibles, 3 devient 0, 0, 0, 1, 0, 0, 0, 0.
Figure 3 : Processus complet pour mapper des catégories à des vecteurs de caractéristiques.

Représentation creuse

Une caractéristique dont les valeurs sont principalement nulles (ou vides) est appelée caractéristique creuse. De nombreuses caractéristiques catégorielles, telles que car_color, ont tendance à être des caractéristiques éparses. La représentation creuse consiste à stocker la position de la valeur 1.0 dans un vecteur creux. Par exemple, le vecteur one-hot pour "Blue" est le suivant :

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

Étant donné que 1 se trouve à la position 2 (en commençant le décompte à 0), la représentation creuse du vecteur one-hot précédent est la suivante :

2

Notez que la représentation creuse consomme beaucoup moins de mémoire que le vecteur one-hot à huit éléments. Il est important que le modèle soit entraîné sur le vecteur one-hot, et non sur la représentation creuse.

Valeurs aberrantes dans les données catégorielles

Comme les données numériques, les données catégorielles contiennent également des valeurs aberrantes. Supposons que car_color contienne non seulement les couleurs populaires, mais aussi des couleurs aberrantes rarement utilisées, telles que "Mauve" ou "Avocado". Au lieu d'attribuer une catégorie distincte à chacune de ces couleurs aberrantes, vous pouvez les regrouper dans une seule catégorie "fourre-tout" appelée hors vocabulaire (OOV). En d'autres termes, toutes les couleurs aberrantes sont regroupées dans un seul bucket d'aberrations. Le système apprend une seule pondération pour ce bucket de valeurs aberrantes.

Encoder des caractéristiques catégorielles de grande dimension

Certaines caractéristiques catégorielles comportent un grand nombre de dimensions, comme celles du tableau suivant :

Nom de la fonctionnalité Nombre de catégories Exemples de catégories
words_in_english ~500 000 "happy", "walking"
US_postal_codes ~42 000 "02114", "90301"
last_names_in_Germany ~850 000 "Schmidt", "Schneider"

Lorsque le nombre de catégories est élevé, l'encodage one-hot est généralement un mauvais choix. Les embeddings, détaillés dans un module d'embeddings distinct, sont généralement un bien meilleur choix. Les embeddings réduisent considérablement le nombre de dimensions, ce qui présente deux avantages importants pour les modèles :

  • L'entraînement du modèle est généralement plus rapide.
  • Le modèle créé infère généralement les prédictions plus rapidement. Autrement dit, le modèle présente une latence plus faible.

Le hachage (également appelé astuce de hachage) est une méthode moins courante pour réduire le nombre de dimensions.