Encodage à chaud vs factice dans Scikit-learn

50

Il existe deux manières différentes d’encoder des variables catégorielles. Disons qu'une variable catégorique a n valeurs. Un codage à chaud le convertit en n variables, alors qu'un codage factice le convertit en n-1 variables. Si nous avons k variables catégorielles, chacune d’elles ayant n valeurs. Un codage à chaud aboutit à des variables kn , tandis qu'un codage factice se termine à des variables kn-k .

J'ai entendu dire que pour un encodage à chaud, l'interception peut conduire à un problème de colinéarité, ce qui rend le modèle non sonore. Quelqu'un l'appelle " piège de variable factice ".

Mes questions:

  1. Le modèle de régression linéaire de Scikit-learn permet aux utilisateurs de désactiver l'interception. Donc, pour l'encodage one-hot, dois-je toujours définir fit_intercept = False? Pour l’encodage factice, fit_intercept doit toujours être défini sur True? Je ne vois aucun "avertissement" sur le site.

  2. Comme l'encodage one-hot génère plus de variables, a-t-il plus de degré de liberté que l'encodage factice?

Munichong
la source

Réponses:

35

Le modèle de régression linéaire de Scikit-learn permet aux utilisateurs de désactiver l'interception. Donc, pour l'encodage one-hot, dois-je toujours définir fit_intercept = False? Pour l’encodage factice, fit_intercept doit toujours être défini sur True? Je ne vois aucun "avertissement" sur le site.

Pour un modèle linéaire non normalisé avec un codage à chaud, oui, vous devez paramétrer l'interception sur faux, sinon la colinéarité sera parfaite. sklearnpermet également une pénalité de retrait de crête et, dans ce cas, cela n’est pas nécessaire. En fait, vous devez inclure à la fois l’interception et tous les niveaux. Pour l’encodage factice, vous devez inclure une interception, sauf si vous avez normalisé toutes vos variables, auquel cas l’interception est égale à zéro.

Comme l'encodage one-hot génère plus de variables, a-t-il plus de degré de liberté que l'encodage factice?

L'interception est un degré de liberté supplémentaire, donc dans un modèle bien spécifié, tout est égal.

Pour le second, que se passe-t-il s'il y a k variables catégoriques? k variables sont supprimées en codage factice. Le degré de liberté est-il toujours le même?

Vous ne pouviez pas adapter un modèle dans lequel vous utilisiez tous les niveaux des deux variables qualitatives, interceptées ou non. Car dès que vous avez codé à chaud tous les niveaux d'une variable du modèle, par exemple avec les variables binaires , vous obtenez une combinaison linéaire de prédicteurs égale au vecteur constantx1,x2,,xn

x1+x2++xn=1

Si vous essayez ensuite d'entrer tous les niveaux d' un autre catégorique dans le modèle, vous obtenez une combinaison linéaire distincte égale à un vecteur constant.x

x1+x2++xk=1

et ainsi vous avez créé une dépendance linéaire

x1+x2+xnx1x2xk=0

Donc, vous devez laisser un niveau dans la deuxième variable, et tout s'aligne correctement.

Dis, j'ai 3 variables catégoriques, chacune ayant 4 niveaux. Dans l’encodage factice, 3 * 4-3 = 9 variables sont construites avec une interception. Dans le codage à chaud, 3 * 4 = 12 variables sont construites sans interception. Ai-je raison?

La deuxième chose ne fonctionne pas réellement. La matrice de conception colonnes que vous créez sera singulière. Vous devez supprimer trois colonnes, une de chacun des trois encodages catégoriels distincts, pour récupérer la non-singularité de votre conception.3×4=12

Matthew Drury
la source
Merci. Pour le second, que se passe-t-il s'il y a k variables catégoriques? k variables sont supprimées en codage factice. Le degré de liberté est-il toujours le même?
Munichong
@ChongWang J'ai intégré une réponse à votre commentaire dans ma réponse.
Matthew Drury
Désolé, je me perd un peu ici. Dis, j'ai 3 variables catégoriques, chacune ayant 4 niveaux. Dans l’encodage factice, 3 * 4-3 = 9 variables sont construites avec une interception. Dans le codage à chaud, 3 * 4 = 12 variables sont construites sans interception. Ai-je raison? Donc, ici, le DF de l’encodage factice est 9-1 alors que le DF de l’encodage à chaud est de 12. Suis-je correct?
Munichong
@ChongWang Edité à nouveau.
Matthew Drury
@ MatthewDrury J'ai le même problème avec linear_model dans Sklearn. Après l’encodage factice de Decision Tree et de KNN, tout fonctionne bien, mais la régression linéaire tombe en singularité. Je comprends de votre réponse que je devrais supprimer un "niveau de la deuxième variable" mais je ne sais pas ce que cela signifie concrètement? Par exemple, j'ai 3 caractéristiques numériques et 3 catégoriques (fabricant, modèle et fuel_type). Le modèle dépend naturellement du fabricant puisqu'un fabricant peut avoir n modèles. Alors, comment procéder dans ce genre de scénario si je veux utiliser la régression linéaire?
Harvey