Sto lavorando con un set di dati con un gran numero di caratteristiche categoriche (> 80%) che prevedono una variabile target continua (cioè Regressione). Ho letto parecchi modi per gestire le caratteristiche categoriche. E ho imparato che la codifica one-hot che ho usato in passato è davvero una pessima idea, specialmente quando si tratta di molte caratteristiche categoriche con molti livelli (leggi questo post e questo ).
Mentre mi sono imbattuto in metodi come la codifica basata sul target (smoothing) di caratteristiche categoriche spesso basata sulla media dei valori target per ogni caratteristica, forse questo post / kernel in Kaggle. Sto ancora lottando per trovare un modo più concreto fino a quando ho trovato CatBoost un gradiente open-source che aumenta gli alberi decisionali rilasciati lo scorso anno dal gruppo Yandex. Sembrano offrire opzioni di conteggio statistico extra per le caratteristiche categoriche probabilmente molto più efficienti della semplice codifica o smoothing one-hot.
Il problema è che la documentazione non è utile su come configurare le impostazioni CTR . Ho provato diversi modi ma non funziona. Il documento dice l' impostazione CTR come simple_ctr , da dare come ( sezione impostazioni 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]',
...]
Ecco un esempio semplicissimo, i dati si presentano così:
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)
Ecco un semplice Regressor 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);
Il simple_ctr , una delle impostazioni CTR, è il problema !! È un peccato perché sembra che il pacchetto offra vari metodi, finora non c'è modo di accedervi.
AGGIORNAMENTO 9 agosto 2018: Qualche giorno fa ho sollevato questo problema allo sviluppatore Catboost, vedi qui e hanno aperto un ticket per fornire un tutorial.