Options de gestion des fonctionnalités catégorielles Catboost (paramètres CTR)?

11

Je travaille avec un ensemble de données avec un grand nombre de caractéristiques catégorielles (> 80%) prédisant une variable cible continue (c.-à-d. Régression). J'ai lu pas mal de choses sur la façon de gérer les fonctionnalités catégorielles. Et j'ai appris que l'encodage à chaud que j'utilisais dans le passé est vraiment une mauvaise idée, surtout quand il s'agit de nombreuses fonctionnalités catégoriques avec de nombreux niveaux (lisez ces articles , et ce ).

Bien que je suis tombé sur des méthodes telles que l'encodage basé sur les cibles (lissage) des fonctionnalités catégorielles, souvent basées sur la moyenne des valeurs cibles pour chaque fonctionnalité, peut-être ce post / noyau dans Kaggle. Je continue de me battre pour trouver un moyen plus concret jusqu'à ce que je trouve CatBoost un gradient open source boostant les arbres de décision publié l'année dernière par le groupe Yandex. Ils semblent offrir des options de comptage statistique supplémentaires pour les fonctionnalités catégorielles, probablement beaucoup plus efficaces qu'un simple codage ou lissage à chaud.

Le problème est que la documentation n'est pas utile pour définir les paramètres CTR . J'ai essayé différentes manières mais cela ne fonctionne pas. Le document dit que le paramètre CTR est simple_ctr , à donner comme ( section de réglage CTR ):

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
 'CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
  ...]

Voici un exemple super simple, les données ressemblent à ceci:

import pandas as pd
import catboost
data = [{'profit': '342','country': 'holland','account': 'Jones LLC', 'saving': 150, 'debt': -60, 'age': 28},
         {'profit': '875','country': 'germany','account': 'Alpha Co',  'saving': 200, 'debt': -10, 'age': 42},
         {'profit': '127','country': 'italy','account': 'Blue Inc',  'saving': 50,  'debt': -300,  'age': 38 }]
df = pd.DataFrame(data)

Voici un simple régresseur Catboost:

X_train = df.drop(['profit'],axis=1)
Y_train = df['profit']
categorical_features_indices = [0,2]

train_pool = catboost.Pool(X_train, Y_train, cat_features=categorical_features_indices)

model = catboost.CatBoostRegressor(
    depth=3,
    iterations=5,
    eval_metric='RMSE',
    simple_ctr=None)

model.fit(train_pool);

Le simple_ctr , l'un des paramètres CTR, est le problème !! C'est dommage car on dirait que le package propose différentes méthodes, jusqu'ici aucun moyen d'y accéder.

MISE À JOUR le 9 août 2018: il y a quelques jours, j'ai soulevé ce problème au développeur Catboost, voir ici , et ils ont ouvert un ticket pour qu'il fournisse un tutoriel.

TwinPenguins
la source
Voici la description de catboost sur vaiable catégorique: tech.yandex.com/catboost/doc/dg/concepts/…
DiveIntoML
Oui, je connais le lien; il donne une description théorique détaillée. Pourtant, la description de son utilisation est insuffisante; Je veux dire des instructions d'utilisation pratiques. Je l'ai essayé il y a quelques mois et ce n'était pas simple.
TwinPenguins
1
Je n'utilise actuellement que le paramètre one_hot_max_size et ma compréhension est que tout ce qui n'est pas un codage à chaud sera codé en utilisant le codage d'expansion de la cible moyenne. J'attends avec impatience la documentation officielle supplémentaire pour mieux comprendre les paramètres ctr et comment je peux jouer avec eux.
Garima Jain

Réponses:

2

J'ai découvert que pour définir les ctrparamètres et tous les composants, il fallait passer une liste de chaînes, chaque chaîne devrait contenir le ctrTypeet l'un de ses composants:

  • Le premier mot de la chaîne doit être ctrTypepar exemple Borders:(cliquez ici pour les paramètres catboost)
  • Ensuite, un élément du ctrTypedevrait suivre. Par exemple TargetBorderType=5.
  • Tous ensemble 'Borders:TargetBorderType=5'.
  • Répétez la procédure pour définir un autre composant et ajouter la nouvelle chaîne à la liste.

Exemple avec deux composants définis:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']
Giannis Krilis
la source
Cela fonctionne, merci pour l'explication, et désolé d'avoir pris beaucoup de temps pour revenir pour le vérifier, m'a glissé dans l'esprit.
TwinPenguins
1

Avez-vous essayé d'utiliser le format fourni comme ci-dessous:

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]'

['BinarizedTargetMeanValue[:TargetBorderCount=1][:TargetBorderType=Uniform][:CtrBorderCount=5][:CtrBorderType=Uniform][:Prior=1]']
Programmeur_intéressé
la source
Est-ce une réponse? Cela ressemble plus à une question / commentaire.
Stephen Rauch
@Interested_Programmer: Cela ne fonctionne pas, essayez-le vous-même dans l'exemple que je viens de fournir. L'avez-vous testé ou vous l'avez simplement trouvé dans la documentation?
TwinPenguins
Je m'excuse @StephenRauch. Je n'ai pas pu exécuter mon ordinateur portable mais je l'ai trouvé utilisable dans d'autres fonctions pour suivre le format. Avec le recul, j'aurais dû l'ajouter en commentaire. J'attends également que les créateurs sortent le nouveau tutoriel.
Interested_Programmer
1
cela fonctionne aussi. simple_ctr = ['BinarizedTargetMeanValue'])
Interested_Programmer
1
Merci. Mais comme vous l'avez montré, cela ne fonctionne que comme simple_ctr = ['BinarizedTargetMeanValue'])! Les autres options ne peuvent pas être alimentées comme [: TargetBorderCount = BorderCount] etc. Si vous savez comment nourrir les autres avec CtrType, faites le moi savoir.
TwinPenguins