Codifica di variabili categoriali utilizzando la stima della probabilità


22

Sto cercando di capire come posso codificare le variabili categoriali usando la stima della probabilità, ma finora ho avuto scarso successo.

Ogni suggerimento sarà molto apprezzato.


Cosa fare durante il tempo di previsione quando non abbiamo un'etichetta target?
Ranjeet Singh,

Risposte:


24

Stavo imparando anche questo argomento, e questi sono ciò che ho trovato:

  • Questo tipo di codifica si chiama codifica di probabilità , codifica di impatto o codifica target

  • L'idea sta codificando la variabile categoriale con l'uso della variabile target (continua o categorica a seconda dell'attività). Ad esempio, se si dispone di un'attività di regressione, è possibile codificare la variabile categoriale con la media della destinazione. Per ogni categoria, si calcola la media corrispondente del target (tra questa categoria) e si sostituisce il valore di una categoria con questa media.

  • Se si dispone di un'attività di classificazione, si calcola la frequenza relativa del proprio target rispetto a ogni valore di categoria.

  • Da un punto di vista matematico, questa codifica indica una probabilità del tuo target, subordinata al valore di ciascuna categoria.

  • Se lo fai in modo semplice, come ho descritto sopra, probabilmente otterrai una stima distorta. Ecco perché nella comunità Kaggle di solito usano 2 livelli di validazione incrociata. Leggi questo commento di Raddar qui . Il notebook corrispondente è qui .

La citazione:

Sta prendendo il valore medio di y. Ma non mediamente semplice, ma in convalida incrociata in modo convalida incrociata;

Diciamo che abbiamo 20 convalide incrociate. dobbiamo in qualche modo calcolare il valore medio della funzione per la piega n. 1 utilizzando solo le informazioni dalle pieghe n. 2-20.

Quindi, prendi le pieghe da 2 a 20, crei un altro set di convalida incrociata (ho fatto 10 volte). calcola le medie per ogni piega per una partita (alla fine ottieni 10 medie). In media questi 10 mezzi e applichi quel vettore per il tuo set di convalida principale n. 1. Ripetere l'operazione per le restanti 19 pieghe.

È difficile da spiegare, difficile da capire e da padroneggiare :) Ma se fatto correttamente può portare molti benefici :)

  • Un'altra implementazione di questa codifica è qui .

  • Nella libreria R vtreat hanno l'implementazione della codifica di impatto. Vedi questo post .

  • Nella libreria CatBoost hanno molte opzioni per la codifica delle variabili categoriche inclusa la codifica target.

  • Non esiste ancora tale codifica in sklearn.


1
Esiste la codifica target negli encoder di categoria Sklearn-contrib
josh

Come implementeresti l'interazione delle funzionalità nel caso in cui utilizzassi la codifica target? Ad esempio, hai codificato come target F1 e F2. Moltiplicherebbe semplicemente i valori codificati F1 * F2?
Michael Larionov,

Se calcoli la media per ogni piega LOO, poi ne prendi la media, è esattamente la stessa che stai prendendo la media di piega # 2- # 20, non vedo perché questo possa essere considerato come CV. Inoltre non capisco cosa intende per "vettore" quando fa una media di quei 10 mezzi.
SiXUlm

Un commento in ritardo; la codifica target in Encoder di categoria è una semplice codifica media; non esegue la regolarizzazione delle pieghe all'interno delle pieghe descritta da raddar.
Dan Scally

7

La codifica target è ora disponibile in sklearn tramite il pacchetto category_encoders.

Encoder target

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, smoothing = 1)

Codifica target per funzioni categoriali. Basato sull'approccio one one out.

Come notato da Josh nel commento sopra.


1

La codifica del rischio non è ancora disponibile su scikit learn. È possibile farlo creando un dizionario e quindi eseguire una funzione di sostituzione.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
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.