
Nella risoluzione dei problemi di machine learning è prassi comune dover risolvere un problema composto da più di due classi (classificazione binaria).
Pensa solo di dover classificare dei cani (pastore tedesco, labrador, beagle o bassotto tedesco): già in questa situazione non ci troviamo più in un problema di classificazione binario, ma multi classe.
In quest’articolo vediamo un esempio di problema multiclasse e 2 metodi di risoluzione tramite la libreria Scikit-Learn: one-vs-one e one-vs-rest.
Prima di iniziare, vediamo però la differenza tra i problemi multi classe, e i problemi multi etichetta che spesso vengono confusi tra di loro.
Differenza tra classificazione multi classe e classificazione multi etichetta
Come dice la definizione, la classificazione multiclasse indica un’attività di classificazione con più di due classi; ad esempio, classificare una serie di immagini di frutti che possono essere arance, mele o pere.
La classificazione multiclasse parte dal presupposto che ogni campione sia assegnato a una e una sola etichetta: un frutto può essere una mela o una pera ma non entrambe allo stesso tempo.
Al contrario, la classificazione Multilabel (o multi etichetta) assegna a ciascun campione una serie di etichette target. Ciò può essere pensato come una previsione delle proprietà di un punto dati che non si escludono a vicenda, come gli argomenti rilevanti per un documento.
Un testo potrebbe riguardare una qualsiasi religione, politica, finanza o istruzione allo stesso tempo o nessuno di questi.
Per questo tipo di problemi si prevede di assegnare ad ogni campione di studio n classi, con n pari al numero delle classi del problema.
In questa sede ci concentriamo sulla prima tipologia di problemi vedendo le seguenti metodologie di risoluzione.
One vs Rest
One-vs-rest (OvR in breve, indicato anche come One-vs-All o OvA) è un metodo euristico per l’utilizzo di algoritmi di classificazione binaria per la classificazione multiclasse.
Implica la suddivisione del set di dati multiclasse in più problemi di classificazione binaria. Un classificatore binario viene quindi addestrato su ogni problema di classificazione binaria e le previsioni vengono effettuate utilizzando il modello più affidabile.
Ad esempio, dato un problema di classificazione multiclasse con esempi per ogni classe “arancia”, “mela” e “pera”. Questo potrebbe essere suddiviso in tre set di dati di classificazione binaria come segue:
Problema di classificazione binaria 1: arancia vs [mela, pera]
Problema di classificazione binaria 2: mela vs [arancia, pera]
Problema di classificazione binaria 3: pera vs [arancia, mela]
Un possibile svantaggio di questo approccio è che richiede la creazione di un modello per ogni classe. Ad esempio, tre classi richiedono tre modelli.
Ciò potrebbe essere un problema per set di dati di grandi dimensioni (ad esempio milioni di righe), modelli lenti (ad esempio reti neurali) o un numero molto elevato di classi (ad esempio centinaia di classi).
One vs One
L’altro approccio che vediamo si chiama One-vs-One (OvO in breve). Anch’esso rappresenta un altro metodo euristico per l’utilizzo di algoritmi di classificazione binaria per la classificazione multiclasse.
Come la prima tecnica, OvO divide un set di dati di classificazione multiclasse in problemi di classificazione binaria. A differenza di One-vs-Rest che lo divide in un set di dati binario per ogni classe, l’approccio one-vs-one divide il set di dati in un set di dati per ogni classe rispetto a ogni altra classe.
Ad esempio, considera un problema di classificazione multi-classe con quattro classi: “arancia”, “mela”, “pera” e “pesca”. Si può pensare di suddividerlo in sei set di dati di classificazione binaria come segue:
Problema di classificazione binaria 1: arancia contro mela
Problema di classificazione binaria 2: arancia contro pera
Problema di classificazione binaria 3: arancia contro pesca
Problema di classificazione binaria 4: mela contro pera
Problema di classificazione binaria 5: mela contro pesca
Problema di classificazione binaria 6: pera contro pesca
Si tratta di un numero significativamente maggiore di set di dati e, a sua volta, modelli rispetto alla strategia one-vs-rest descritta nella sezione precedente.
La formula per calcolare il numero di set di dati binari e, a sua volta, il numero di modelli necessari è la seguente:
(Numero di classi * (Numero di classi – 1)) / 2
Possiamo vedere che per quattro classi, questo ci dà il valore atteso di sei problemi di classificazione binaria:
(Numero di classi * (Numero di classi – 1)) / 2 = (4 * (4 – 1)) / 2 = (4 * 3) / 2 = 12/2 = 6
Ogni modello di classificazione binaria può prevedere un’etichetta di classe e il modello con il maggior numero di previsioni o voti è previsto dalla strategia OvO.
Vediamo ora un esempio di applicazione in Python.
Esempio in Python
Immaginiamo di voler prevedere la classe di un animale dello zoo.
Per farlo ci avvaliamo dello Zoo Dataset, che puoi reperire a questo link.
Il dataset si prefigge di prevedere una delle 7 classi di appartenenza dei 100 animali di uno zoo. Ogni animale dello zoo è associato solamente ad una delle sette classi.
Le caratteristiche sono composte quasi tutte da attributi booleani, a parte il nome dell’animale in inglese e l’informazione del numero di gambe dell’animale.
Importare le librerie
Il primo passo risulta quello di importare le librerie necessarie all’utilizzo dell’algoritmo:
Tra di esse abbiamo:
- Pandas: una delle librerie fondamentali per preparare e gestire i dati;
- OneHotEncoder: la classe che permette di eseguire la codifica One Hot;
- OneVsRestClassifier: la classe che permette di utilizzare il classificatore OvR;
- SVC: la classe che permette di utilizzare l’algoritmo Support Vector Machine.
Importare il dataset
Il secondo step è quello di importare il dataset. Il percorso dove è salvato il file va inserito interamente tra virgolette e dentro le parentesi. Per abbreviare si sono indicati i puntini prima del file csv:
Creiamo il DataFrame df e lo visualizziamo:
Il DataFrame è composto da 101 righe e 18 colonne.
Preparare il set di dati
Prima della costruzione di un modello è prassi assai comune organizzare al meglio i dati.
In questa sede richiamiamo la funzione di OneHotEncoder() per utilizzare la codifica one hot. Essa permette di suddividere e creare tante colonne quante sono i valori categoriali di una o più colonne. Ad ognuno di essi associerà 1 o 0 in modo da poterle identificare univocamente in termini numerici.
Applichiamo l’OneHotEncoder nella caratteristica animal_name. Il risultato della codifica, salvato nella variabile X1, ci restituisce un array, che trasformiamo subito sotto la variabile dataset in un DataFrame:
Dopodichè possiamo copiare in un nuovo DataFrame df1 il vecchio DataFrame privo della colonna categorica.
Uniamo poi i due DataFrame, quello appena creato e quello ottenuto con la codifica one hot, per averne uno solo.
In questo modo abbiamo trasformato la variabile categoriale in una serie di 1 e 0 e siamo in grado di creare un modello.
Il risultato dell’unione dei due dataset è così rappresentato:
Abbiamo 117 colonne perché 101 sono state create con la codifica one hot, dalla trasformazione dei 101 valori categorici.
La prima variabile Aardvark (in italiano oritteropo) è rappresentata da 1 e poi 100 zeri, la seconda (antelope) da 0 poi 1 e altri 99 zeri, e così fino a rappresentare tutti i valori di animal_name sotto forma numerica.
Costruzione del modello multiclasse: one vs one
Vediamo ora come creare un modello one-vs-one.
Per farlo utilizziamo il vettore di supporto di classificazione. Passiamo al parametro decision_function_shape il valore ‘ovo’ in modo da richiamare questa metodologia.
La libreria Scikit-Learn fornisce anche una classe OneVsOneClassifier separata che consente di utilizzare la strategia OvO con qualsiasi classificatore.
Dopo aver creato un modello, eseguiamo la previsione sulla variabile X con la funzione predict.
Costruzione del modello multiclasse: one vs rest
Allo stesso modo è possibile creare molto similmente il modello one-vs-rest.
In questa sede ci avvaliamo della classe OneVsRestClassifier disponibile in Scikit-Learn per richiamare il classificatore dei vettori di supporto, e dopo aver istanziato e addestrato il modello sui dati di allenamento, come prima, utilizziamo il metodo predict sulla variabile X.
In questa sede non abbiamo fatto test sui due modelli creati, anche se, in fase di utilizzo è un’attività fondamentale da non dimenticare, se si vogliono conoscere le performance e l’affidabilità del modello stesso.
Conclusione
In questo articolo abbiamo introdotto il concetto di problema multiclasse e due metodologie per risolvere tali problemi (one-vs-all e one-vs-rest).
In linea generale con One vs. All è difficile gestire set di dati di grandi dimensioni con molti numeri di istanze di classe.
Poiché generiamo così tanti modelli di classificatori e ci addestriamo a questi modelli, si vengono a creare tanti set di dati di addestramento di input dal set di dati primario.
Nella classificazione multi-classe One vs. One, invece, abbiamo suddiviso il set di dati principale in un set di dati di classificazione binaria per ogni coppia di classi.
In genere, i problemi di classificazione sono spesso di natura complessa. A volte, il problema ci impone di distinguere un’osservazione tra più classi; in altre situazioni, potrebbe essere necessario assegnare diverse etichette a ciascuna osservazione.
Sfruttando la nostra conoscenza dei classificatori binari è possibile creare sistemi di classificazione multiclasse e multilabel in grado di realizzare al meglio questi compiti.