
I modelli di machine learning vengono addestrati su dati di input e output numerici. Quando ci si trova a che fare con variabili categoriali, quindi stringhe o testi, bisogna adottare delle tecniche di preprocessamento dei dati che ne permettano la gestione in modo appropriato.
In altre parole, risulta necessario avvalersi di metodi di codifica categoriali, come l’one hot encoding, o il label encoder, che ci permettono di tramutare queste variabili in numeri interi.
In questo articolo voglio proporre un nuovo modo di gestione di queste variabili, tramite la codifica dummy.
Che cos’è una variabile dummy?
Una variabile dummy (chiamata anche variabile di comodo o fittizia in italiano) è una variabile numerica che rappresenta dati categorici, come sesso, razza, ecc.
Tecnicamente, una variabile dummy è una variabile dicotomica quantitativa. Ciò significa che la sua gamma di valori è piccola e che quindi può assumere solo due valori quantitativi, come da standard 1 o 0. Tipicamente, 1 rappresenta la presenza di un attributo qualitativo e 0 rappresenta l’assenza.
Perché sono utilizzate?
Le variabili dummy vengono spesso utilizzate nell’analisi di regressione multipla, dove le variabili indipendenti (X) vengono considerate tutte come numeriche.
Le variabili numeriche vengono rappresentate da valori che sono direttamente comparabili, ad esempio “10 è il doppio di 5” o “3 meno 1 equivale a 2”.
Spesso, tuttavia, potresti voler includere un attributo o una variabile nominale come “Marchio del prodotto” o “Tipo di difetto” nello studio.
Supponi di avere tre tipi di difetti, numerati “1”, “2” e “3”. Tipo di difetto rappresenta il predittore o variabile categorica, mentre “1”, “2” e “3” sono le categorie.
In questo caso, non è possibile confrontare le categorie: “3 meno 1” non significa nulla, non è possibile sottrarre il difetto 1 dal difetto 3.
I numeri qui sono usati per indicare o identificare i livelli di “Tipo di difetto” e non hanno un significato intrinseco di per sè. In questa situazione vengono create variabili fittizie per “ingannare” correttamente l’algoritmo di regressione.
Esempio di variabile dummy
Di seguito vediamo la rappresentazione di una variabile categorica o nominale con tre categorie (Cristiano 1, Musulmano 2 e Ateo 3):
Codice Religione è una variabile nominale che sarebbe inappropriata come predittore in un problema di regressione lineare multipla. Tuttavia, questa variabile potrebbe essere rappresentata usando una serie di tre variabili dicotomiche (dummy, codificate come 0 o 1), come segue:
E ciò significa che Cristiano non sarà più rappresentato dalla variabile 1, ma dalla codifica dummy [1, 0, 0]. Allo stesso modo Musulmano non è più codificato con il valore 2, bensì con [0, 1, 0], mentre Ateo con [0, 0, 1].
Da una colonna siamo passati a 3, esattamente il numero delle categorie.
In questo set di dati semplificato, se sappiamo che qualcuno non è nè cristiano nè musulmano, capiamo per esclusione che è ateo.
Quindi abbiamo solo bisogno di usare due di queste tre variabili con codice fittizio come predittore. Più in generale, il numero di variabili fittizie necessarie è uno in meno rispetto al numero di categorie.
Se si usano esattamente n codifiche fittizie, pari al numero di categorie, si ottiene quella che si chiama trappola delle variabili dummy, in quanto la k-esima variabile non genera nessuna informazione aggiuntiva a quanto conoscevamo già prima e il risultato della previsione può diventare meno accurato.
Scegliere quale variabile fittizia non usare è arbitraria e dipende dalla logica del ricercatore. Ad esempio, se mi interessa l’effetto dell’essere religioso, la mia caratteristica di riferimento sarebbe ateo.
Sarei quindi interessato a vedere se la misura in cui essere cristiani (0 (No) o 1 (Sì)) o musulmani (0 (No) o 1 (Sì)) prevede la varianza in una variabile dipendente (come la Felicità) in un’analisi di regressione. In questo caso, la codifica fittizia da utilizzare sarebbe il seguente sottoinsieme:
In alternativa, potrei semplicemente essere interessato a ricodificare in una singola variabile dicotomica per indicare, ad esempio, se un partecipante è ateo (0) o religioso (1), dove essere religioso include essere cristiano o musulmano. La codifica sarebbe la seguente:
Come creare variabili dummy in Python
In programmazione le variabili categoriali possono essere gestite tramite 0 o 1 per trasmettere tutte le informazioni necessarie sull’appartenenza al gruppo.
Ciò può essere fatto tramite il modulo pandas.get_dummies.
Vediamo semplicemente come creare l’esempio precedente in python.
Importiamo prima di tutto la libreria pandas e creiamo il dizionario rel, che indica la tabella della religione vista nell’esempio precedente:
Visualizziamo il semplice dizionario:
Avvalendoci della funzione get_dummies otteniamo il seguente risultato (con il metodo index cambiamo i nomi dell’indice delle righe. Al posto di 0, 1 e 2 avremo Cristiano, Musulmano e Ateo):
Se poi non vogliamo visualizzare la colonna Codice e vogliamo portarci a k-1 dimensioni (nell’esempio k è uguale a 3), possiamo utilizzare il metodo drop:
Col parametro drop_first pari a true stiamo dicendo di considerare una dimensione in meno, quindi creiamo le variabili dummy:
Invece se vogliamo essere più generici e dire se una persona è religiosa o meno possiamo creare il dizionario rel2.
Creiamo l’indice Ateo e Credente, e calcoliamo la variabile dummy per questo secondo dizionario (una sola, perché k qua è pari a 2):
Per maggiori informazioni puoi vedere sul sito di pandas a questo link come utilizzare i parametri disponibili del metodo get_dummies.
Differenze con one hot encoding
La codifica one hot e la codifica dummy sono due metodi simili di gestione delle variabili categoriali.
Anche se entrambi modificano il DataFrame originale, si può affermare che la differenza principale tra i due metodi è che la codifica dummy permette di convertire k variabili categoriali in k-1 categorie per quella variabile, mentre la one hot può convertire k variabili categoriali in k categorie.
In pratica con la codifica one-hot si creano per una variabile categoriale con 3 categorie 3 variabili dummy. Al contrario con la codifica dummy, il numero di variabili dummy create saranno 2.
Se si utilizza il parametro drop_first = False (o non lo si indica, perché di default tale parametro è proprio settato a false) nel metodo get_dummies si ottiene di fatto la codifica one hot.
Vediamo questo semplice esempio.
Abbiamo 3 colonne, Giorni, Lezione e Materia, tutte e 3 predittori (per ipotesi non creiamo la variabile target, perché non vogliamo costruire un dataset, ma solo vedere l’effetto di trasformazione di queste variabili in variabili intere di 0 e 1):
Applicando la codifica dummy otteniamo questo risultato.
Importiamo il modulo OneHotEncoder, poi adattiamo e trasformiamo i dati, e infine vediamo che otteniamo lo stesso risultato:
Definendo il parametro drop_first = True otteniamo valori differenti:
Come si può notare è stata cancellata la colonna 0 (“Giorno Giovedì”), la colonna 5 (“Lezione No”) e la colonna 7 (“Materia_”).
In pratica per ogni predittore (Lezione, Giorno e Materia) vengono estratte k-1 variabili con k pari al numero di categorie utilizzate.
Ciò significa che il predittore Giorno che è descritto da 5 categorie può essere convertito in 4 variabili dummy con la codifica get_dummy. Allo stesso modo Lezione era descritta con 2, e ne è stata creata solo una fittizia.
Infine Materia, ha definito 4 variabili dummy rispetto alle 5 variabili categoriali disponibili.
Conclusione
In questo articolo abbiamo visto cosa sono le variabili dummy per gestire le variabili categoriali.
Esse assegnano i numeri “0” e “1” per indicare l’appartenenza esclusiva ad una categoria piuttosto che un’altra.
Per questo tipo di variabili, il numero di colonne costruite per rappresentare una singola variabile di attributo è uguale al numero di livelli (categorie) in quella variabile meno uno.
Otteniamo invece la codifica One-Hot se il numero per rappresentare una singola variabile di attributo è uguale al numero di categorie.
Per l’apprendimento automatico è più facile vedere utilizzata quest’ultima codifica. Per altre attività come analisi più semplici, potresti essere in grado di utilizzare pd.get_dummies, il che è un po’ più conveniente.