Dati categorici: vocabolario e codifica one-hot

Il termine dimensione è sinonimo del numero di elementi in un vettore di caratteristiche. Alcune caratteristiche categoriche sono di bassa dimensione. Ad esempio:

Nome caratteristica # di categorie Categorie di esempio
snowed_today 2 Vero, Falso
skill_level 3 Principiante, medico, esperto
season 4 Inverno, Primavera, Estate, Autunno
day_of_week 7 Lunedì, martedì, mercoledì
pianeta 8 Mercurio, Venere, Terra

Quando una caratteristica categorica ha un numero ridotto di categorie possibili, puoi codificarla come vocabolario. Con una codifica del vocabolario, il modello tratta ogni possibile valore categorico come una caratteristica separata. Durante l'addestramento, il modello apprende diversi pesi per ogni categoria.

Ad esempio, supponiamo che tu stia creando un modello per prevedere il prezzo di un'auto in base, in parte, a una caratteristica categorica denominata car_color. Forse le auto rosse valgono più di quelle verdi. Poiché i produttori offrono un numero limitato di colori esterni, car_color è una caratteristica categorica a bassa dimensione. La seguente illustrazione suggerisce un vocabolario (possibili valori) per car_color:

Figura 1. Ogni colore della tavolozza è rappresentato come caratteristica distinta. In altre parole, ogni colore è una caratteristica separata nel vettore di caratteristiche.
      Ad esempio, "Rosso" è una funzionalità, "Arancione" è una funzionalità distinta e così via.
Figura 1. Una funzionalità univoca per ogni categoria.

Esercizio: controlla il tuo intuito

Vero o falso: un modello di machine learning può essere addestrato direttamente su valori di stringa non elaborati, come "Rosso" e "Nero", senza doverli convertire in vettori numerici.
Vero
Durante l'addestramento, un modello può manipolare solo numeri in virgola mobile. La stringa "Red" non è un numero in virgola mobile. Devi convertire stringhe come "Red" in numeri con virgola mobile.
Falso
Un modello di machine learning può essere addestrato solo su funzionalità con valori di tipo virgola mobile, pertanto dovrai convertire queste stringhe in valori di tipo virgola mobile prima dell'addestramento.

Numeri di indice

I modelli di machine learning possono manipolare solo i numeri in virgola mobile. Pertanto, devi convertire ogni stringa in un numero di indice univoco, come nell'illustrazione seguente:

Figura 2. Ogni colore è associato a un valore intero univoco. Ad esempio, "Rosso" è associato all'intero 0, "Arancia" all'intero 1 e così via.
Figura 2. Caratteristiche indicizzate.

Esercizio: controlla il tuo intuito

Il modello deve essere addestrato direttamente sui numeri di indice mostrati nella Figura 2?
Se il modello viene addestrato con i numeri di indice, tratterebbe erroneamente ciascuno come un valore numerico e considererebbe "Black" (numero di indice 5) come 5 volte più significativo per il modello rispetto a "Orange" (numero di indice 1).
No
Il modello non deve essere addestrato sui numeri di indice. In questo caso, il modello tratterebbe ogni numero di indice come un valore numerico e considererebbe "Black" (numero di indice 5) 5 volte più significativo per il modello rispetto a "Orange" (numero di indice 1).

Codifica one-hot

Il passaggio successivo per creare un vocabolario consiste nel convertire ogni numero di indice nella relativa codifica one-hot. In una codifica one-hot:

  • Ogni categoria è rappresentata da un vettore (array) di N elementi, dove N è il numero di categorie. Ad esempio, se car_color ha otto possibili categorie, il vettore one-hot che lo rappresenta avrà otto elementi.
  • Esattamente uno degli elementi di un vettore one-hot ha il valore 1.0; tutti gli elementi rimanenti hanno il valore 0.0.

Ad esempio, la tabella seguente mostra la codifica one-hot per ciascuno in car_color:

Funzionalità Rosso Orange Blu Giallo di colore verde Neri Viola di colore marrone
"Rosso" 1 0 0 0 0 0 0 0
"Arancione" 0 1 0 0 0 0 0 0
"Blu" 0 0 1 0 0 0 0 0
"Giallo" 0 0 0 1 0 0 0 0
"Verde" 0 0 0 0 1 0 0 0
"Nero" 0 0 0 0 0 1 0 0
"Viola" 0 0 0 0 0 0 1 0
"Marrone" 0 0 0 0 0 0 0 1

È il vettore one-hot, non la stringa o il numero di indice, che viene passato al vettore di caratteristiche. Il modello apprende un peso separato per ogni elemento del vettore di caratteristiche.

L'illustrazione seguente suggerisce le varie trasformazioni nella representatione del vocabolario:

Figura 3. Diagramma del processo end-to-end per mappare le categorie ai vettori di funzionalità. Nel diagramma, le caratteristiche di input sono "Giallo",
      'Arancione", "Blu" e "Blu" una seconda volta.  Il sistema utilizza un
      vocabolario memorizzato ("Rosso" è 0, "Arancione" è 1, "Blu" è 2, "Giallo" è 3 e così via) per mappare il valore inserito a un ID. Di conseguenza, il sistema mappa "Giallo",
      'Arancione", 'Blu" e 'Blu" a 3, 1, 2, 2. Il sistema poi li converte in un vettore di caratteristiche one-hot. Ad esempio, dato un sistema con otto colori possibili, 3 diventa 0, 0, 0, 1, 0, 0, 0, 0.
Figura 3. La procedura end-to-end per mappare le categorie ai vettori di funzionalità.

Rappresentazione sparsa

Una funzionalità i cui valori sono prevalentemente pari a zero (o vuoti) è definita caratteristica sparsa. Molte caratteristiche categoriche, come car_color, tendono a essere caratteristiche sparse. Per rappresentazione sparsa si intende la memorizzazione della posizione del valore 1.0 in un vettore sparso. Ad esempio, il vettore one-hot per "Blue" è:

[0, 0, 1, 0, 0, 0, 0, 0]

Poiché 1 si trova in posizione 2 (se si inizia il conteggio da 0), la representation sparse per il vettore one-hot precedente è:

2

Nota che la rappresentazione sparsa consuma molta meno memoria del vettore one-hot a otto elementi. È importante sottolineare che il modello deve essere addestrato sul vettore one-hot, non sulla rappresentazione sparse.

Valori anomali nei dati categorici

Come i dati numerici, anche i dati categorici contengono valori anomali. Supponiamo che car_color contenga non solo i colori più diffusi, ma anche alcuni colori outlier usati raramente, come "Mauve" o "Avocado". Anziché assegnare a ciascuno di questi colori outlier una categoria separata, puoi raggrupparli in un'unica categoria "catch-all" chiamata out-of-vocabulary (OOV). In altre parole, tutti i colori degli outlier vengono raggruppati in un unico bucket di outlier. Il sistema apprende un singolo peso per il bucket di valori anomali.

Codifica di caratteristiche categoriche ad alta dimensione

Alcune caratteristiche categoriche hanno un numero elevato di dimensioni, ad esempio quelle riportate nella tabella seguente:

Nome caratteristica # di categorie Categorie di esempio
words_in_english ~500.000 "happy", "walking"
US_postal_codes ~42.000 "02114", "90301"
last_names_in_Germany ~850.000 "Schmidt", "Schneider"

Quando il numero di categorie è elevato, la codifica one-hot di solito è una scelta sbagliata. Gli incorporamenti, descritti in un modulo dedicato, sono in genere una scelta molto migliore. Gli incorporamenti riducono notevolmente il numero di dimensioni, il che è vantaggioso per i modelli in due modi importanti:

  • In genere, il modello viene addestrato più velocemente.
  • In genere, il modello creato deducono le previsioni più rapidamente. In altre parole, il modello ha una latenza inferiore.

L'hashing (chiamato anche trucco di hashing) è un modo meno comune per ridurre il numero di dimensioni.