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, 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, 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: verifica di aver compreso

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
Falso

Numeri di indice

I modelli di machine learning possono manipolare solo 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. Elementi indicizzati.

Dopo aver convertito le stringhe in numeri di indice univoci, dovrai elaborare ulteriormente i dati per rappresentarli in modo che il modello possa apprendere relazioni significative tra i valori. Se i dati delle caratteristiche categoriche vengono lasciati come interi indicizzati e caricati in un modello, il modello 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 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 ogni incar_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, 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 sparse

Una funzionalità i cui valori sono prevalentemente pari a zero (o vuoti) è definita caratteristica sparsa. Molte caratteristiche categoriche, come car_color, tendono ad essere 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

Tieni presente che la rappresentazione sparsa consuma molta meno memoria rispetto al vettore one-hot di otto elementi. È importante sottolineare che il modello deve addestrarsi 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 "generica" denominata 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 è in genere una cattiva scelta. 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.

In breve, l'hashing mappa una categoria (ad esempio un colore) a un piccolo numero intero, ovvero il numero del "bucket" che conterrà la categoria.

Nello specifico, implementi un algoritmo di hashing come segue:

  1. Imposta il numero di intervalli nel vettore di categorie su N, dove N è inferiore al numero totale di categorie rimanenti. Come esempio arbitrario, supponiamo che N = 100.
  2. Scegli una funzione di hashing. Spesso, dovrai scegliere anche l'intervallo di valori di hash.
  3. Passa ogni categoria (ad esempio un determinato colore) alla funzione di hashing, generando un valore hash, ad esempio 89237.
  4. Assegna a ogni intervallo un numero di indice del valore hash di output modulo N. In questo caso, dove N è 100 e il valore dell'hash è 89237, il risultato del modulo è 37 perché 89237 % 100 è 37.
  5. Crea una codifica one-hot per ogni intervallo con questi nuovi numeri di indice.

Per ulteriori dettagli sull'hashing dei dati, consulta la sezione Randomizzazione del modulo Sistemi di machine learning di produzione.