Le migliori pratiche per la codifica di caratteristiche categoriche per gli alberi decisionali?


13

Quando si codificano le caratteristiche categoriche per la regressione lineare, esiste una regola: il numero di manichini dovrebbe essere uno in meno del numero totale di livelli (per evitare la collinearità).

Esiste una regola simile per gli alberi decisionali (in sacchi, potenziati)? Lo sto chiedendo perché una pratica standard in Python sembra essere quella di espandere i nlivelli in nmanichini (sklearns ' OneHotEncodero Panda' pd.get_dummies) che mi sembrano non ottimali.

Quali consigli suggeriresti come best practice per la codifica delle caratteristiche categoriche per gli alberi decisionali?

Risposte:


12

Sembra che tu capisca che sei in grado di avere nlivelli, al contrario n-1, perché a differenza della regressione lineare non devi preoccuparti della perfetta colinearità.

(Sto arrivando da questo punto di vista R, ma presumo che sia lo stesso in Python.) Dipende da un paio di cose, come 1) quale pacchetto stai usando e 2) quanti livelli di fattori hai.

1) Se stai usando il randomForestpacchetto di R , allora se hai <33 livelli di fattore, puoi andare avanti e lasciarli in una funzione se vuoi. Questo perché nell'implementazione della foresta casuale di R, controllerà quali livelli di fattore dovrebbero essere su un lato della divisione e quali sull'altro (ad esempio, 5 dei tuoi livelli potrebbero essere raggruppati sul lato sinistro e 7 potrebbero essere raggruppati insieme a destra). Se dividi la caratteristica categorica in nmanichini, l'algoritmo non avrebbe questa opzione a sua disposizione.

Ovviamente se il pacchetto in particolare che stai usando non è in grado di gestire le caratteristiche categoriche, dovrai solo creare nvariabili fittizie.

2) Come ho accennato in precedenza, l'implementazione della foresta casuale di R può gestire solo 32 livelli di fattore: se ne hai di più, devi dividere i fattori in sottoinsiemi più piccoli o creare una variabile fittizia per ogni livello.


1
Grazie! Ti sto ottenendo correttamente: a meno che non stia modellando in R, dove le caratteristiche categoriche randomForestsono codificate automaticamente, dovrei andare con i nmanichini perché la collinearità non è un problema per RF?
Sergey Bushmanov,

3
Avere più di 32 categorie codificate a livello binario avrà un comportamento leggermente diverso nella struttura, poiché RF selezionerà semplicemente tra quelle colonne binarie, piuttosto che selezionare la singola colonna del fattore con molti livelli. Questa sottile differenza significa che la divisione sulle colonne binarie sarà meno informativa rispetto alla divisione sulla colonna del fattore, poiché esiste solo una scelta (0/1) rispetto a (1 / {2,3}, {2,1} / 3 ) ecc.
Sycorax dice Reinstate Monica il

@ user777 Non è un problema avere oltre 32 variabili. È un problema di non avere variabili di categoria "raggruppate" in Python sklearn... In pratica, c'è una prova (esperienza pratica, ricerca, ecc.) Che le variabili "dummified" funzioneranno peggio delle variabili categoriali "raggruppate" [in R]
Sergey Bushmanov,

1
In teoria, potremmo aspettarci che i non raggruppati si comportino in modo leggermente peggiore, perché stai dando al modello una minore flessibilità. Nel caso raggruppato, se fosse davvero meglio trattare quella caratteristica come non raggruppata, allora il modello sarebbe in grado di farlo (mettendo un gruppo da una parte e poi tutto il resto dall'altra). Tuttavia, in pratica, sarei sorpreso se ci fossero molte differenze (in particolare nel caso della RF, dove stai creando così tanti alberi)
Tchotchke,

2
Trovo che l'implementazione randomForest usando funzionalità con molti livelli di fattore (> 15) sia lenta come detto, ma anche per produrre prestazioni di modello mediocri. Immagino che un numero molto elevato di possibili spaccature ridurrà la decorrelazione prevista degli alberi nell'insieme. extraTrees e Rborist provano solo un sottocampione di divisioni catagoriche in ciascun nodo. Ciò può aiutare la decorrelazione e sicuramente la velocità. Pertanto è possibile una gamma di soluzioni tra "randomForest try any split" e "sklern dummy-variabile only try 1-vs-rest split". Anche i diversi cluster di molti livelli in meno livelli possono rivelarsi utili.
Soren Havelund Welling,

4

C'è un altro approccio alla gestione delle variabili categoriche che si chiama codifica target / impatto.

In questo schema l'idea è di codificare la funzione usando una singola colonna float in cui il valore è la media della variabile target su tutte le righe che condividono la categoria. Ciò è particolarmente utile per i modelli basati su alberi poiché impone una relazione d'ordine all'interno della funzione (ovvero i valori a destra della categoria hanno una risposta media più elevata rispetto ai valori a sinistra) e facilita la divisione dello spazio predittore.

Ecco una bella spiegazione dell'argomento:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Ed ecco un link al documento che originariamente ha proposto la codifica: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Ci sono alcuni dettagli in più per evitare di stimare la media in categorie con conteggi bassi e c'è anche un altro modello, CatBoost, che propone una soluzione alla distorsione introdotta da questa codifica, ma nella mia esperienza è un modo semplice e molto utile per codificare variabili categoriche di alta cardinalità .

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.