La vettorizzazione delle categorie del dataset su Sklearn
Nel machine learning la vettorizzazione delle categorie è la trasformazione dei dati non numerici ( es. stringhe ) in dati numerici.
Perché vettorizzare le categorie?
Può capitare di lavorare con dataset in cui alcune caratteristiche (features) contengono stringhe anziché valori numerici.
Molti algoritmi di ML non riescono a elaborare le stringhe. Pertanto, prima di avviare l'addestramento, devo preparare il dataset sostituendo le stringhe in valori numerici.
Come si vettorizzano le categorie?
Esistono diversi metodi per farlo. Uno dei metodi più semplici su Sklearn è la classe OneHotEncoder.
Un esempio pratico
Apro python e creo un semplice array composto da quattro record e tre caratteristiche (features).
X=[
[2001,11,'rosso'],
[2002,7,'verde'],
[2003,5,'rosso'],
[2004,8,'blu']
]
La terza caratteristica contiene i colori in formato stringa (rosso, verde, blu).
Per vettorizzarla importo la classe ColumnTrasformer che mi permette di modificare le colonne del dataset.
from sklearn.compose import ColumnTransformer
Poi importo la classe OneHotEncoder per il preprocessing dei dati.
from sklearn.preprocessing import OneHotEncoder
Creo un transformatore dove specifico la classe di preprocessing da usare (OneHotEncoder) e la colonna del dataset su cui applicarla. In questi casi è la terza colonna, quella con indice [2]
Il nome del transformer (nometrasf) è invece arbitrario.
trasformatore = [
['nometrasf', OneHotEncoder(), [2]]
]
Dopo aver preparato la struttura dati, preparo l'istanza in cui specifico con l'opzione remainder=passthrough di voler usare il trasformatore sulla terza colonna (caratteristica) senza modificare le altre colonne del dataset
ct = ColumnTransformer(trasformatore, remainder='passthrough')
A questo punto uso i metodi fit e transform passandogli l'array X in input.
ct.fit(X)
Y = ct.transform(X)
L'output dell'elaborazione viene scritto nella variabile Y.
Cos'è accaduto?
Stampo il contenuto della variabile Y per vedere cos'è successo
print(Y)
Il contenuto è il seguente array
[[0.0 1.0 0.0 2001 11]
[0.0 0.0 1.0 2002 7]
[0.0 1.0 0.0 2003 5]
[1.0 0.0 0.0 2004 8]]
Come si può subito vedere la vettorizzazione ha eliminato la colonna dei colori.
Al suo posto sono state inserite tre colonne, una per ogni livello della feature eliminata ossia per ogni suo valore possibile (rosso, verde, blu).
- La prima colonna è uguale a 1.0 se il colore è blu.
- La seconda colonna è uguale a 1.0 se il colore è rosso.
- La terza colonna è uguale a 1.0 se il colore è verde.
Il dataset contiene le stesse informazioni ma è composto soltanto da valori numerici.
Nota. La classe OneHotEncoder è utile se la caratteristica da vettorizzare ha pochi valori. Se ha molti valori, la dimensione del dataset potrebbe crescere in modo eccessivo.
E così via