Quand utiliser One Hot Encoding vs LabelEncoder vs DictVectorizor?

98

Je construis des modèles avec des données catégoriques depuis un certain temps et lorsque, dans cette situation, je par défaut utilise par défaut la fonction LabelEncoder de scikit-learn pour transformer ces données avant de créer un modèle.

Je comprends la différence entre OHE, LabelEncoderet DictVectorizoren termes de ce qu'ils font pour les données, mais ce n'est pas clair pour moi est quand vous pouvez choisir d'employer une technique sur une autre.

Existe-t-il certains algorithmes ou situations dans lesquels l’un présente des avantages / inconvénients par rapport aux autres?

anthr
la source
2
En référence à la réponse de AN6U5 , et à cette affirmation:> Il existe néanmoins des algorithmes tels que des arbres de décision et des forêts aléatoires qui fonctionnent parfaitement avec des variables catégorielles et LabelEncoder peut être utilisé pour stocker des valeurs en utilisant moins d'espace disque. L’utilisation de LabelEncoder n’aurait-elle pas pour effet de transformer une entité catégorique en entité numérique, obligeant ainsi un arbre décisionnel à effectuer des fractionnements à une valeur qui n’a pas vraiment de sens, car le mappage est arbitraire?
Nico
1
Nico, je pense que ce que dit AN6U5 est spécifiquement pour les arbres de décision, cela fonctionne très bien, car l'arbre se divise en chien, chat, souris ou 1,2,3 et la signification du "chat" par rapport à "2" n'est pas importante pour un arbre (pensez à la façon dont il se divise). Dans le cas de quelque chose comme la régression logistique, les valeurs font partie d’une équation puisque vous multipliez les valeurs de poids *, de sorte que cela pourrait poser des problèmes d’entraînement et de poids étant donné que dog: 1 et cat: 2 n’ont pas de relation numérique 1 * 2 (bien que il peut toujours fonctionner avec suffisamment d’exemples et d’époques de formation).
Doug F

Réponses:

127

Il y a des cas où LabelEncoder ou DictVectorizor sont utiles, mais ceux-ci sont assez limités à mon avis en raison de l'ordinalité.

LabelEncoder peut transformer [chien, chat, chien, souris, chat] en [1,2,1,3,2], mais ensuite, l'ordinalité imposée signifie que la moyenne du chien et de la souris est chat. Il existe néanmoins des algorithmes tels que des arbres de décision et des forêts aléatoires qui fonctionnent parfaitement avec des variables catégorielles et LabelEncoder peut être utilisé pour stocker des valeurs en utilisant moins d'espace disque.

One-Hot-Encoding a l'avantage que le résultat est binaire plutôt qu'ordinal et que tout se trouve dans un espace vectoriel orthogonal. L'inconvénient est que, pour une cardinalité élevée, l'espace des fonctions peut vraiment exploser rapidement et que vous commencez à vous battre avec la malédiction de la dimensionnalité. Dans ces cas, j'utilise typiquement un codage à chaud suivi de PCA pour la réduction de la dimensionnalité. Je trouve que la combinaison judicieuse de PCA one-hot plus peut rarement être battue par d'autres schémas de codage. La PCA trouve le chevauchement linéaire et a donc naturellement tendance à regrouper les caractéristiques similaires dans la même caractéristique.

AN6U5
la source
1
Merci beaucoup - cela est très utile et a beaucoup de sens. Existe-t-il d'autres schémas de codage que vous utilisez pour des cas spécifiques / périphériques? Avez-vous déjà constaté que vous utilisiez différents schémas de codage pour différentes fonctionnalités?
anthr
21

Bien que l' AN6U5 ait donné une très bonne réponse, je voulais ajouter quelques points pour référence future. Lors de l'examen de One Hot Encoding (OHE) et de l' encodage d'étiquette , nous devons essayer de comprendre le modèle que vous essayez de créer. À savoir, les deux catégories de modèles que nous allons examiner sont les suivantes:

  1. Modèles basés sur les arbres : arbres décisionnels à gradient amélioré et forêts aléatoires.
  2. Modèles non basés sur des arbres : basés sur des réseaux linéaires, kNN ou neuronaux.

Voyons quand appliquer OHE et quand appliquer l'encodage d'étiquette lors de la création de modèles basés sur des arbres.

Nous appliquons OHE lorsque:

  1. Lorsque les valeurs proches les unes des autres dans le codage d'étiquette correspondent à des valeurs cible qui ne sont pas proches (données non linéaires).
  2. Lorsque la caractéristique catégorielle n'est pas ordinale (chien, chat, souris).

Nous appliquons le codage d'étiquette lorsque:

  1. La caractéristique catégorielle est ordinale (Jr. kg, Sr. kg, école primaire, lycée, etc.).
  2. Lorsque nous pouvons trouver un encodeur d'étiquettes qui assigne des étiquettes proches à des catégories similaires : Cela réduit le nombre de déversements dans le temps, ce qui réduit le temps d'exécution.
  3. Lorsque le nombre d'entités catégorielles dans le jeu de données est énorme: Un encodage à chaud d'une entité catégorielle avec un nombre énorme de valeurs peut conduire à (1) une consommation de mémoire importante et (2) au cas où des entités non catégoriques sont rarement utilisées par le modèle. Vous pouvez traiter le premier cas si vous utilisez des matrices creuses. Le deuxième cas peut se produire si vous créez un arbre en utilisant uniquement un sous-ensemble de fonctionnalités. Par exemple, si vous avez 9 fonctions numériques et 1 catégorie avec 100 valeurs uniques et que vous possédez une fonction catégorisée à chaud, vous obtiendrez 109 fonctions. Si une arborescence est construite avec seulement un sous-ensemble de fonctionnalités, les 9 premières fonctions numériques seront rarement utilisées. Dans ce cas, vous pouvez augmenter la taille du paramètre de contrôle de ce sous-ensemble. Dans xgboost, il s'appelle colsample_bytree, dans Random Forest max_features de sklearn.

Si vous souhaitez continuer avec OHE, comme @ AN6U5 l'a suggéré, vous pouvez combiner PCA avec OHE.

Permet de déterminer quand appliquer OHE et le codage d'étiquette lors de la création de modèles non basés sur des arbres.

Pour appliquer l'encodage d'étiquette, la dépendance entre entité et cible doit être linéaire pour que l'encodage d'étiquette soit utilisé efficacement.

De même, si la dépendance est non linéaire, vous pouvez utiliser OHE pour la même chose.

Remarque: Une partie de l'explication a été référencée dans Comment gagner un concours de science des données de Coursera.

Pushkaraj Joshi
la source
Explication très intuitive. Ne devrait-il pas s'agir de "scissions", pas de "déversements"?
mardi
0

LabelEncoder est destiné aux données ordinales, tandis que OHE est destiné aux données nominales.

vochicong
la source