Codifica one-hot vs dummy in Scikit-learn


50

Esistono due modi diversi per codificare le variabili categoriali. Supponiamo che una variabile categoriale abbia n valori. La codifica one-hot lo converte in n variabili, mentre la codifica fittizia lo converte in n-1 variabili. Se abbiamo k variabili categoriali, ognuna delle quali ha n valori. Una codifica a caldo termina con variabili kn , mentre la codifica fittizia termina con variabili kn-k .

Ho sentito che per la codifica one-hot, l'intercettazione può portare a problemi di collinearità, il che rende il modello non valido. Qualcuno lo chiama " trappola variabile fittizia ".

Le mie domande:

  1. Il modello di regressione lineare di Scikit-learn consente agli utenti di disabilitare l'intercettazione. Quindi, per la codifica one-hot, devo sempre impostare fit_intercept = False? Per la codifica fittizia, fit_intercept deve essere sempre impostato su True? Non vedo alcun "avviso" sul sito web.

  2. Poiché la codifica one-hot genera più variabili, ha più grado di libertà rispetto alla codifica fittizia?

Risposte:


35

Il modello di regressione lineare di Scikit-learn consente agli utenti di disabilitare l'intercettazione. Quindi, per la codifica one-hot, devo sempre impostare fit_intercept = False? Per la codifica fittizia, fit_intercept deve essere sempre impostato su True? Non vedo alcun "avviso" sul sito web.

Per un modello lineare non regolamentato con codifica one-hot, sì, è necessario impostare l'intercetta su false o altrimenti incorrere in una perfetta collinearità. sklearnconsente anche una penalità per il restringimento della cresta, e in quel caso non è necessario, e in effetti dovresti includere sia l'intercettazione che tutti i livelli. Per la codifica fittizia è necessario includere un'intercettazione, a meno che non siano state standardizzate tutte le variabili, nel qual caso l'intercettazione è zero.

Poiché la codifica one-hot genera più variabili, ha più grado di libertà rispetto alla codifica fittizia?

L'intercettazione è un ulteriore grado di libertà, quindi in un modello ben specificato equivale a tutto.

Per il secondo, cosa succede se ci sono k variabili categoriche? k variabili vengono rimosse con codifica fittizia. Il grado di libertà è sempre lo stesso?

Non è stato possibile adattare un modello in cui sono stati utilizzati tutti i livelli di entrambe le variabili categoriali, intercettare o meno. Perché, non appena hai codificato a caldo tutti i livelli in una variabile nel modello, ad esempio con le variabili binarie , allora hai una combinazione lineare di predittori uguale al vettore costantex1,x2,,xn

x1+x2++xn=1

Se poi provi ad inserire tutti i livelli di un'altra categoriale nel modello, finisci con una combinazione lineare distinta uguale a un vettore costantex

x1+x2++xk=1

e così hai creato una dipendenza lineare

x1+x2+xnx1x2xk=0

Quindi è necessario tralasciare un livello nella seconda variabile e tutto si allinea correttamente.

Supponiamo che io abbia 3 variabili categoriali, ognuna delle quali ha 4 livelli. Nella codifica fittizia, 3 * 4-3 = 9 variabili sono costruite con una intercettazione. Nella codifica one-hot, le variabili 3 * 4 = 12 sono costruite senza intercettazione. Ho ragione?

La seconda cosa in realtà non funziona. La matrice di progettazione colonne creata sarà singolare. È necessario rimuovere tre colonne, una da ciascuna di tre distinte codificazioni categoriche, per ripristinare la non singolarità del progetto.3×4=12


Grazie. Per il secondo, cosa succede se ci sono k variabili categoriche? k variabili vengono rimosse con codifica fittizia. Il grado di libertà è sempre lo stesso?
Monaco,

@ChongWang Ho modificato una risposta al tuo commento nella mia risposta.
Matthew Drury,

Scusa, mi perdo un po 'qui. Supponiamo che io abbia 3 variabili categoriali, ognuna delle quali ha 4 livelli. Nella codifica fittizia, 3 * 4-3 = 9 variabili sono costruite con una intercetta. Nella codifica one-hot, le variabili 3 * 4 = 12 sono costruite senza intercettazione. Ho ragione? Quindi qui il DF della codifica fittizia è 9-1 mentre il DF della codifica one-hot è 12. Ho ragione?
Munichong,

@ChongWang Modificato di nuovo.
Matthew Drury,

@MatthewDrury Ho lo stesso problema con linear_model in sklearn. Dopo la codifica fittizia Decision Tree e KNN funzionano bene, ma la regressione lineare cade nella singolarità. Capisco dalla tua risposta che dovrei rimuovere un "livello dalla seconda variabile" ma non so cosa significhi praticamente? Ad esempio, ho 3 funzioni numeriche e 3 categoriche (produttore, modello e tipo_carburante). Il modello è naturalmente affidabile dal produttore poiché un produttore può avere n modelli. Quindi, come procedere in questo tipo di scenario comune se voglio usare la regressione lineare?
Harvey,
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.