Meilleures pratiques pour coder les fonctionnalités catégorielles pour les arbres de décision?

13

Lors du codage des caractéristiques catégorielles pour la régression linéaire, il existe une règle: le nombre de variables muettes doit être inférieur de un au nombre total de niveaux (pour éviter la colinéarité).

Existe-t-il une règle similaire pour les arbres de décision (ensachés, boostés)? Je pose cette question car une pratique standard en Python semble être d'étendre les nniveaux en nmannequins (sklearns OneHotEncoderou Pandas pd.get_dummies), ce qui me semble sous-optimal.

Que suggéreriez-vous comme meilleures pratiques pour coder les caractéristiques catégorielles des arbres de décision?

Sergey Bushmanov
la source

Réponses:

12

Il semble que vous compreniez que vous pouvez avoir des nniveaux, par opposition à n-1, car contrairement à la régression linéaire, vous n'avez pas à vous soucier de la colinéarité parfaite.

(J'y arrive dans une perspective R, mais je suppose que c'est la même chose en Python.) Cela dépend de deux choses, telles que 1) quel package vous utilisez et 2) combien de niveaux de facteur vous avez.

1) Si vous utilisez le randomForestpackage de R , alors si vous avez <33 niveaux de facteur, vous pouvez continuer et les laisser dans une fonction si vous le souhaitez. En effet, dans la mise en œuvre aléatoire de la forêt de R, il vérifiera quels niveaux de facteurs doivent être d'un côté de la division et lesquels de l'autre (par exemple, 5 de vos niveaux peuvent être regroupés sur le côté gauche et 7 peuvent être groupés ensemble à droite). Si vous divisez la caractéristique catégorielle en nvariables muettes, l'algorithme n'aurait pas cette option à sa disposition.

Évidemment, si le package que vous utilisez en particulier ne peut pas gérer les fonctionnalités catégorielles, il vous suffit de créer ndes variables factices.

2) Comme je l'ai mentionné ci-dessus, l'implémentation de forêt aléatoire de R ne peut gérer que 32 niveaux de facteurs - si vous en avez plus, vous devez soit diviser vos facteurs en sous-ensembles plus petits, soit créer une variable fictive pour chaque niveau.

Tchotchke
la source
1
Merci! Est-ce que je vous comprends bien: à moins que je ne modélise en R, où les caractéristiques catégorielles randomForestsont codées automatiquement, je devrais aller avec des nnuls car la colinéarité n'est pas un problème pour RF?
Sergey Bushmanov
3
Le fait d'avoir plus de 32 catégories codées en binaire aura un comportement légèrement différent dans l'arborescence, car RF sélectionnera simplement parmi ces colonnes binaires, plutôt que de sélectionner la seule colonne du facteur à plusieurs niveaux. Cette différence subtile signifie que la répartition sur les colonnes binaires sera moins informative que la répartition sur la colonne facteur, car il n'y a qu'un seul choix (0/1) par rapport à (1 / {2,3}, {2,1} / 3 ) etc.
Sycorax dit Réintégrer Monica
@ user777 Ce n'est pas un problème d'avoir plus de 32 variables. C'est un problème de ne pas avoir de variables de catégorie "groupées" en Python sklearn... Pratiquement parlant, existe-t-il des preuves (expérience pratique, recherche, etc.) que les variables "factices" fonctionneront moins bien que les variables catégorielles "groupées" [dans R]
Sergey Bushmanov
1
Théoriquement, nous pourrions nous attendre à ce que les non-groupés fonctionnent légèrement moins bien, car vous donnez au modèle moins de flexibilité. Dans le cas groupé, s'il était vraiment préférable de traiter cette fonctionnalité comme non groupée, le modèle serait en mesure de le faire (en plaçant un groupe d'un côté, puis tout le reste de l'autre). Cependant, dans la pratique, je serais surpris s'il y avait beaucoup de différence (en particulier dans le cas de RF, où vous créez autant d'arbres)
Tchotchke
2
Je trouve que l'implémentation randomForest utilisant des fonctionnalités avec de nombreux niveaux de facteur (> 15) est lente comme mentionné, mais aussi pour produire des performances de modèle médiocres. Je suppose qu'un nombre très élevé de divisions possibles réduira la décorrélation prévue des arbres dans l'ensemble. extraTrees et Rborist n'essaient qu'un sous-échantillon de divisions catagoriques dans chaque nœud. Cela peut aider à la décorrélation et certainement à la vitesse. Ainsi, une gamme de solutions entre «randomForest try any split» et «sklern dummy-variable only try 1-vs-rest splits» est possible. Des regroupements différents des nombreux niveaux en plusieurs niveaux peuvent également s'avérer utiles.
Soren Havelund Welling,
4

Il existe une autre approche pour traiter les variables catégorielles qui est appelée codage cible / impact.

Dans ce schéma, l'idée est de coder l'entité à l'aide d'une seule colonne flottante dans laquelle la valeur est la moyenne de la variable cible sur toutes les lignes qui partagent la catégorie. Ceci est particulièrement utile pour les modèles arborescents car il impose une relation d'ordre au sein de l'entité (c'est-à-dire que les valeurs à droite de la catégorie ont une réponse moyenne plus élevée que les valeurs à gauche) et il facilite la division de l'espace du prédicteur.

Voici une belle explication du sujet:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Et voici un lien vers l'article qui a initialement proposé l'encodage: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Il y a plus de détails pour éviter d'estimer la moyenne dans les catégories à faible nombre et il y a aussi un autre modèle, CatBoost, proposant une solution au biais introduit par cet encodage, mais d'après mon expérience, c'est un moyen simple et très utile pour encoder des variables catégorielles à cardinalité élevée .

Ludecan
la source