Dati categorici: vocabolario e codifica one-hot

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

Nome caratteristica Numero di categorie Categorie di esempio
snowed_today 2 Vero, Falso
skill_level 3 Principiante, Professionista, 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 pesi diversi per ogni categoria.

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

Figura 1. Ogni colore della tavolozza è rappresentato come una funzionalità separata. ovvero ogni colore è una funzionalità separata nel vettore delle funzionalità.
      Ad esempio, "Rosso" è una funzionalità, "Arancione" è un'altra funzionalità
      e così via.
Figura 1. Una funzionalità unica per ogni categoria.

Esercizio: verifica la tua comprensione

Vero o falso: un modello di machine learning può essere addestrato direttamente su valori stringa non elaborati, come "Rosso" e "Nero", senza convertire questi valori 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 le stringhe come "Red" in numeri in virgola mobile.
Falso
Un modello di machine learning può essere addestrato solo su funzionalità con valori in virgola mobile, quindi dovrai convertire queste stringhe in valori in virgola mobile prima dell'addestramento.

Numeri indice

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

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

Dopo aver convertito le stringhe in numeri di indice univoci, devi elaborare ulteriormente i dati per rappresentarli in modo da aiutare il modello ad apprendere relazioni significative tra i valori. Se i dati delle caratteristiche categoriche vengono lasciati come numeri interi indicizzati e caricati in un modello, quest'ultimo tratterà i valori indicizzati come numeri in virgola mobile continui. Il modello considererebbe quindi "viola" sei volte più probabile di "arancione".

Codifica one-hot

Il passaggio successivo nella creazione di 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 seguente tabella mostra la codifica one-hot per ogni colore in car_color:

Funzionalità Rosso Orange Blu Giallo Verde Neri Viola di colore marrone
"Rosso" 1 0 0 0 0 0 0 0
"Arancia" 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, a essere passato al vettore delle caratteristiche. Il modello apprende un peso separato per ogni elemento del vettore delle caratteristiche.

La seguente illustrazione suggerisce le varie trasformazioni nella rappresentazione del vocabolario:

Figura 3. Diagramma del processo end-to-end per mappare le categorie ai
      vettori delle caratteristiche. 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 di input a un ID. Pertanto, il sistema mappa "Giallo",
      "Arancione", "Blu" e "Blu" su 3, 1, 2, 2. Il sistema converte
      questi valori 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. Il processo end-to-end per mappare le categorie ai vettori delle caratteristiche.

Rappresentazione sparsa

Una funzionalità i cui valori sono prevalentemente zero (o vuoti) è definita funzionalità sparsa. Molte caratteristiche categoriche, come car_color, tendono a essere caratteristiche sparse. Rappresentazione sparsa significa memorizzare la posizione di 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 (quando si inizia il conteggio da 0), la rappresentazione sparsa per il vettore one-hot precedente è:

2

Tieni presente che la rappresentazione sparsa consuma molta meno memoria rispetto al vettore one-hot a otto elementi. È importante che il modello venga addestrato sul vettore one-hot, non sulla rappresentazione sparsa.

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ù comuni, ma anche alcuni colori anomali usati raramente, come "Mauve" o "Avocado". Invece di assegnare a ciascuno di questi colori anomali una categoria separata, puoi raggrupparli in un'unica categoria "jolly" chiamata fuori vocabolario (OOV). In altre parole, tutti i colori anomali vengono raggruppati in un unico bucket di valori anomali. Il sistema apprende un singolo peso per questo bucket di outlier.

Codifica delle caratteristiche categoriche ad alta dimensionalità

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

Nome caratteristica Numero 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 è in genere una scelta sbagliata. Gli incorporamenti, descritti in un modulo Incorporamenti separato, sono in genere una scelta molto migliore. Gli incorporamenti riducono notevolmente il numero di dimensioni, il che avvantaggia i modelli in due modi importanti:

  • In genere, il modello viene addestrato più rapidamente.
  • Il modello creato in genere inferisce le previsioni più rapidamente. ovvero il modello ha una latenza inferiore.

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