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.