Encodage de variables catégorielles à l'aide d'une estimation de vraisemblance

22

J'essaie de comprendre comment je peux coder des variables catégorielles en utilisant une estimation de vraisemblance, mais j'ai eu peu de succès jusqu'à présent.

Toutes les suggestions seraient grandement appréciées.

petit nain
la source
Que faire lors de la prévision lorsque nous n'avons pas d'étiquette cible?
Ranjeet Singh

Réponses:

24

J'apprenais aussi ce sujet, et voici ce que j'ai trouvé:

  • Ce type de codage est appelé codage de vraisemblance , codage d'impact ou codage cible

  • L'idée est d'encoder votre variable catégorielle à l'aide de la variable cible (continue ou catégorielle selon la tâche). Par exemple, si vous avez une tâche de régression, vous pouvez encoder votre variable catégorielle avec la moyenne de la cible. Pour chaque catégorie, vous calculez la moyenne correspondante de la cible (parmi cette catégorie) et remplacez la valeur d'une catégorie par cette moyenne.

  • Si vous avez une tâche de classification, vous calculez la fréquence relative de votre cible par rapport à chaque valeur de catégorie.

  • D'un point de vue mathématique, ce codage signifie une probabilité de votre cible, conditionnelle à chaque valeur de catégorie.

  • Si vous le faites de manière simple, comme je l'ai décrit ci-dessus, vous obtiendrez probablement une estimation biaisée. C'est pourquoi dans la communauté Kaggle, ils utilisent généralement 2 niveaux de validation croisée. Lisez ce commentaire de raddar ici . Le carnet correspondant est ici .

La citation:

Il prend la valeur moyenne de y. Mais pas une moyenne simple, mais en validation croisée de manière croisée;

Disons que nous avons une validation croisée 20 fois. nous devons en quelque sorte calculer la valeur moyenne de la fonction pour le pli n ° 1 en utilisant uniquement les informations des plis n ° 2 à 20.

Donc, vous prenez des plis # 2- # 20, créez un autre ensemble de validation croisée (je l'ai fait 10 fois). calculer les moyennes pour chaque pli de sortie (au final, vous obtenez 10 moyennes). Vous faites la moyenne de ces 10 moyennes et appliquez ce vecteur à votre ensemble de validation principal n ° 1. Répétez cela pour les 19 plis restants.

C'est difficile à expliquer, difficile à comprendre et à maîtriser :) Mais si c'est fait correctement, cela peut apporter de nombreux avantages :)

  • Une autre implémentation de ce codage est ici .

  • Dans la bibliothèque R vtreat, ils ont implémenté un codage d'impact. Voir cet article .

  • Dans la bibliothèque CatBoost, ils ont beaucoup d'options pour l'encodage des variables catégorielles, y compris l'encodage cible.

  • Il n'y a pas encore de tel encodage dans sklearn.

Galina Alperovich
la source
1
Il y a un codage cible dans les codeurs de catégorie Sklearn-contrib
josh
Comment implémenteriez-vous l'interaction des fonctionnalités si vous utilisez l'encodage cible? Par exemple, vous ciblez F1 et F2 encodés. Souhaitez-vous simplement multiplier les valeurs encodées F1 * F2?
Michael Larionov
Si vous calculez la moyenne pour chaque pli LOO, puis vous en prenez la moyenne, c'est exactement la même chose que vous prenez la moyenne du pli # 2- # 20, je ne vois pas pourquoi cela peut être considéré comme CV. De plus, je ne comprends pas ce qu'il entend par «vecteur» lorsqu'il fait la moyenne de ces 10 moyennes.
SiXUlm
Un commentaire tardif; l'encodage cible dans les encodeurs de catégorie est un simple encodage moyen; il n'effectue pas la régularisation des plis dans les plis décrite par raddar.
Dan Scally
7

L'encodage cible est désormais disponible dans sklearn via le package category_encoders.

Encodeur cible

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, smoothing = 1)

Encode cible pour les fonctionnalités catégorielles. Basé sur une approche «laisser un».

Comme indiqué par Josh dans le commentaire ci-dessus.

Jeffhale
la source
1

L'encodage de vraisemblance n'est toujours pas disponible sur scikit learn. Vous pouvez le faire en créant un dictionnaire, puis effectuez une fonction de remplacement.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
la source