Opzioni di gestione delle caratteristiche categoriche di Catboost (impostazioni CTR)?


11

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.


Ecco la descrizione di catboost sul valore variabile: tech.yandex.com/catboost/doc/dg/concepts/…
DiveIntoML,

Sì, conosco il link; fornisce una descrizione teorica dettagliata. Eppure non viene fornita una descrizione sufficiente su come usarlo; Intendo istruzioni pratiche per l'uso. L'ho provato qualche mese fa e non è stato semplice.
TwinPenguins,

1
Attualmente sto usando solo il parametro one_hot_max_size e la mia comprensione è che tutto ciò che non è una codifica a caldo, verrà codificato utilizzando la codifica espandibile di destinazione. Non vedo l'ora della documentazione ufficiale aggiuntiva per capire meglio le impostazioni di ctr e come posso giocare con loro.
Garima Jain,

Risposte:


2

Ho scoperto che per impostare i ctrparametri e tutti i componenti si dovrebbe passare un elenco di stringhe, ogni stringa dovrebbe contenere ctrTypee uno dei suoi componenti:

  • La prima parola della stringa dovrebbe essere un ctrTypeesempio Borders:(fare clic qui per i parametri catboost)
  • Quindi ctrTypedovrebbe seguire un componente del . Per esempio TargetBorderType=5.
  • Tutti insieme 'Borders:TargetBorderType=5'.
  • Ripetere la procedura per impostare un altro componente e aggiungere la nuova stringa all'elenco.

Esempio con due componenti impostati:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']

Funziona, grazie per la spiegazione, e mi dispiace di aver impiegato molto tempo per tornare a ricontrollarlo, ma mi è sfuggito di mente.
TwinPenguins il

1

Hai provato a utilizzare il formato fornito di seguito:

['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]']

Questa è una risposta? Sembra più una domanda / commento.
Stephen Rauch

@Interested_Programmer: non funziona, provalo tu stesso nell'esempio che ho appena fornito. L'hai provato o l'hai semplicemente trovato nella documentazione?
TwinPenguins

Mi scuso con @StephenRauch. Non sono riuscito a far funzionare il mio notebook ma l'ho trovato utilizzabile in altre funzioni per seguire il formato. Col senno di poi, avrei dovuto aggiungerlo come commento. Sto anche aspettando che i creatori pubblicino il nuovo tutorial.
Interested_Programmer,

1
anche questo funziona. simple_ctr = ['BinarizedTargetMeanValue'])
Interested_Programmer

1
Grazie. Ma come hai mostrato funziona solo come simple_ctr = ['BinarizedTargetMeanValue'])! Le altre opzioni non possono essere alimentate come [: TargetBorderCount = BorderCount] ecc. Se sai come nutrire gli altri insieme a CtrType, fammi sapere.
TwinPenguins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.