
Ci si trova spesso, nei problemi di classificazione dell’apprendimento automatico, a dover confrontare e analizzare troppe caratteristiche sulla base delle quali viene effettuata la classificazione finale.
Maggiore è il numero di esse, più diventa difficile visualizzare il set di allenamento e quindi lavorarci su.
Proprio in questi contesti, entra in gioco la riduzione della dimensionalità.
Detta anche riduzione dimensionale, rappresenta il processo di riduzione del numero di variabili casuali in esame, ottenendo un insieme di variabili principali, che ci aiutano a semplificare l’analisi al problema di studio. Ad esempio, ridurre la dimensione di un problema a 3 dimensioni, significa portarlo a 2 o ad una, a seconda dell’esigenza specifica.
In questo articolo vediamo una tecnica di riduzione della dimensionalità: Linear Discriminat Analysis (LDA).
Cos’è la Linear Discriminant Analysis (LDA)?
Linear Discriminant Analysis (LDA) è una generalizzazione del discriminante lineare di Fisher, un metodo utilizzato in Statistica, riconoscimento dei modelli e apprendimento automatico per trovare una combinazione lineare di caratteristiche che caratterizza o separa due o più classi di oggetti o eventi.
Questo metodo proietta un set di dati su uno spazio di dimensione inferiore rendendo le classi “facilmente” separabili al fine di evitare un eccesso di adattamento e per ridurre i costi di calcolo. La combinazione risultante può essere utilizzata come classificatore lineare o, più comunemente, per la riduzione della dimensionalità prima della successiva classificazione.
Come la PCA (Principal Component Analysis), aiuta a ridurre il set di dati ad alta dimensione su uno spazio di dimensione inferiore.
Quindi, l’obiettivo di un algoritmo LDA è di proiettare uno spazio di caratteristiche (un set di dati campioni n-dimensionali) su un sottospazio minore (dove k ≤ n − 1) mantenendo le informazioni discriminatorie di classe. In altre parole, trovare quel vettore che al meglio permette di dividere la rappresentazione delle classi.
In generale, la riduzione della dimensionalità non solo aiuta a ridurre i costi di calcolo per un determinato compito di classificazione, ma può anche essere utile per evitare un eccesso di adattamento minimizzando l’errore nella stima dei parametri.
Applicazioni
Alcune delle più importanti applicazioni che si avvalgono dell’analisi discriminante lineare rientrano nel:
Riconoscimento facciale: nel campo di Computer Vision, il riconoscimento facciale è un’applicazione molto popolare in cui ogni volto è rappresentato da un numero molto elevato di valori di pixel. L’analisi discriminante lineare (LDA) viene utilizzata qui per ridurre il numero di caratteristiche a un numero più gestibile prima del processo di classificazione.
Ciascuna delle nuove dimensioni generate è una combinazione lineare di valori di pixel, che formano un modello. Le combinazioni lineari ottenute usando il discriminante lineare di Fisher sono chiamate facce di Fisher.
Settore Healthcare: in questo campo, l’analisi discriminante lineare (LDA) viene utilizzata per classificare lo stato della malattia come lieve, moderato o grave in base ai vari parametri del paziente e al trattamento medico che sta attraversando. Questo aiuta i medici a intensificare o ridurre il ritmo del loro trattamento.
Identificazione del cliente: supponiamo di voler identificare il tipo di clienti che hanno maggiori probabilità di acquistare un determinato prodotto in un centro commerciale. Effettuando un semplice sondaggio di domande e risposte, possiamo raccogliere tutte le funzionalità dei clienti.
Qui, l’analisi discriminante lineare ci aiuterà a identificare e selezionare le “componenti” che possono descrivere le caratteristiche del gruppo di clienti che hanno maggiori probabilità di acquistare quel particolare prodotto nel centro commerciale.
Calcolare LDA in 7 passaggi
Di seguito sono elencati 7 passaggi per eseguire un’analisi discriminante lineare.
1) Calcola la media delle classi: per ogni classe calcoliamo la media tramite la seguente formula (N rappresenta il numero dei campioni appartenenti alla classe w i-esima e x sono gli esempi delle caratteristiche del nostro problema):2) Calcola la matrice within Scatter: Siccome la media delle proiezioni delle classi non è una buona misura in quanto non tiene conto della deviazione standard all’interno delle classi, per ottenere la migliore proiezione di divisione tra le due classi ci servono due matrici. La prima è la within matrix scatter (Sw), che rappresenta la somma delle varie matrici di correlazione Si delle varie classi del problema in esame.
Si si può calcolare, con la seguente formula:
Con μ (mu) pari alla media della classe i-esima, trovata al punto precedente.
3) Calcola la matrice between scatter: La seconda matrice che ci serve è la between matrix scatter, in cui la differenza tra le proiezioni delle medie viene espressa in termini di media dello spazio originale di caratteristiche.
Dove
Dove Ni è il numero dei campioni appartenenti alla classe wi, mentre N è il numero di tutti i dati del problema.
4) Calcola la miglior proiezione LDA: Unendo i risultati che abbiamo trovato sopra possiamo trovare l’equazione che ci permette di trovare la migliore proiezione che separa le classi del problema. Ossia:
Per trovare ora la migliore proiezione, dobbiamo tuttavia trovare la soluzione all’equazione appena rappresentata, tramite il calcolo degli autovettori e autovalori corrispondenti. Ciò significa risolvere:
Con w che diventa il vettore proiezione, quindi wi, vettore per la classe i-esima.
5) Scegli i migliori autovalori: Una volta trovati gli autovalori, li ordiniamo in modo decrescente e selezioniamo il k superiore (quelli che hanno lambda più alto ottenuto dal punto 4);
6) Crea una matrice di autovettori trovati: Creiamo una nuova matrice W* contenente autovettori che mappano ai k autovalori;
7) Ottieni le nuove caratteristiche dalla Linear Discriminant Analysis: Ottieni le nuove funzionalità (ovvero i componenti LDA) in una matrice Y, ottenuta dal prodotto di X e W*:
Y = X · W*
dove X è una matrice n × d con n campioni e dimensioni d (è la matrice delle caratteristiche del problema), e Y è una matrice n × k con n campioni e dimensioni k (k < n). In altre parole, Y è composto dai componenti LDA, o detto ancora un altro modo, il nuovo spazio delle funzionalità.
Esempio a due classi
Ipotizziamo per semplicità di avere due classi e di voler applicare la Linear Discriminant Analysis (l’esempio è stato tratto da questo link).
La prima classe W1 è composta da questi valori: X1= (x1, x2) = {(4,2),(2,4),(2,3),(3,6),(4,4)}
La seconda classe W2, invece è composta da questi altri valori X2= (x1, x2) = {(9,10),(6,8),(9,5),(8,7),(10,8)}
Step 1: Calcola la media delle classi
Per la prima classe avremo
Per la seconda classe invece avremo:
Step 2: Calcola la matrice Within Scatter
Calcoliamo le due matrici di covarianza per la prima e la seconda classe:
Il valore della matrice within scatter Sw sarà pari alla somma di S1 e S2:
Step 3: Calcola la matrice Scatter Between
Calcoliamo la matrice SB
Step 4: Calcola la miglior proiezione LDA
Risolviamo l’equazione seguente per trovare gli autovalori:
Step 5: Scegli i migliori autovalori
Scegliamo l’autovalore più grande tra i due:
Step 6: Crea una matrice di autovettori trovati
La matrice creata, che rappresenta l’autovettore trovato (è quella trovata già allo step precedente e che qui riportiamo, ma che si può calcolare anche al seguente modo) è la seguente:
Step 7: Ottieni le nuove caratteristiche dalla Linear Discriminant Analysis
Nella seguente immagine calcoliamo le matrici Y1 (prima classe) e Y2 (relativa alla seconda classe) e possiamo vedere i calcoli eseguiti (n= 5, d= 2 e k = 1). Da due dimensioni siamo passati a una:
I risultati di Y1 (in rosso) e Y2 (in blu) vengono di seguito rappresentati sull’asse orizzontale:
Esempio di applicazione in Python
Vediamo ora un esempio Python dove è possibile utilizzare la Linear Discriminant Analysis. Utilizziamo la libreria Scikit-learn e quindi non vediamo gli step appena visti, ma un altro modo per applicarla.
Come esempio prendiamo un dataset che mostra dei dati sul tasso di abbandono di personale correlato con altri fattori quali l’educazione, la soddisfazione lavorativa, il coinvolgimento, l’ambiente lavorativo e altro.
Il dataset è stato inventato da data scientist di IBM che cercavano di comprendere quali di questi fattori maggiormente portano i dipendenti a lasciare l’azienda per cui lavorano.
Il dataset si compone di 35 caratteristiche; di seguito vediamo ad esempio quelle che vengono espresse sotto forma di numeri (e che cosa tali numeri rappresentano):
- Education: 1 ‘Pre-College’ 2 ‘College’ 3 ‘Laurea triennale’ 4 ‘Master’ 5 ‘Dottorato’;
- EnvironmentSatisfaction: 1 ‘Bassa’ 2 ‘Media’ 3 ‘Alta’ 4 ‘Molto alta’;
- JobInvolvement: 1 ‘Basso’ 2 ‘Medio’ 3 ‘Alto’ 4 ‘Molto alto’;
- JobSatisfaction: 1 ‘Basso’ 2 ‘Medio’ 3 ‘Alto’ 4 ‘Molto alto’;
- PerformanceRating: 1 ‘Basso’ 2 ‘Buono’ 3 ‘Eccellente’ 4 ‘Eccezionale’
- RelationshipSatisfaction: 1 ‘Basso’ 2 ‘Medio’ 3 ‘Alto’ 4 ‘Molto alto’
- WorkLifeBalance: 1 ‘Basso’ 2 ‘Buono’ 3 ‘Eccellente’ 4 ‘Eccezionale’.
La variabile target è l’attrition, che sta ad indicare se un dipendente ha lasciato l’azienda oppure no. In questo dataset assume valore pari a Yes (quindi ha abbandonato) e No (non ha abbandonato).
Importare le librerie
Importiamo le librerie che ci serviranno all’esecuzione dell’algoritmo.
Abbiamo:
- Pandas: una delle librerie fondamentali nel machine learning;
- LabelEncoder: per codificare i valori stringa in campi numerici;
- Train Test Split: per suddividere il dataset in set di addestramento e set di test;
- LinearDiscriminantAnalysis: la classe per eseguire l’analisi discriminante lineare;
- RandomForestClassifier: la classe che ci permette di prevedere la risposta al modello;
- Metriche (Accuracy Score e Classification Report): per valutare l’accuratezza del modello di previsione.
Caricare il dataset
Carichiamo il dataset, utilizzando il metodo read_csv (siccome il file è salvato in tale formato). I due puntini stanno ad indicare che si deve indicare il percorso corretto dove è salvato il file:
Visualizziamo il dataset importato:
Siccome abbiamo 35 colonne, visualizziamole per una maggior comprensione:
Preprocessamento e analisi dei dati
Eliminiamo alcune colonne del dataset, non necessarie al momento alla nostra analisi:
Dopodiché ci avvaliamo della classe label encoder per convertire, in numero intero, il target Attrition e la feature Gender:
E controlliamo il formato di ogni caratteristica:
Abbiamo infatti che tutte le caratteristiche sono di tipo intero:
Calcoliamo la matrice di correlazione tra le varie caratteristiche richiamando il metodo corr():
Si noti che tra due caratteristiche medesime otteniamo una correlazione pari a 1, poichè ogni variabile è sempre perfettamente correlata con sè stessa, vedi attributo Age:
Test Train Split
Associamo ora ad x_train il valore delle caratteristiche e ad y_train il valore del target:
Suddividiamo ora il dataset in set di addestramento (70%) e in set di test (30%):
Con l’ultima riga stampiamo la lunghezza del dataset di test e abbiamo:
Creazione del modello
Con le seguenti righe di codice, richiamiamo la classe LinearDiscriminantAnalysis().
Nello script sopra la classe LinearDiscriminantAnalysis viene importata come lda. Successivamente, passiamo il valore per il parametro n_components di LDA, che si riferisce al numero di discriminanti lineari che vogliamo recuperare. In questo caso impostiamo n_components su 1, poiché prima vogliamo verificare le prestazioni del nostro classificatore con un singolo discriminante lineare. Infine eseguiamo i metodi di adattamento e trasformazione per recuperare effettivamente i discriminanti lineari.
Richiamiamo il classificatore Random Forest per creare il modello ed eseguire la classificazione:
Valutare il modello
La prima metrica che utilizziamo è l’accuratezza (accuracy):
Otteniamo un valore dell’87%:
Infine visualizziamo il report di classificazione:
Senza l’utilizzo della classe LinearDiscriminantAnalysis, avremmo ottenuto un valore di accuratezza leggermente più basso:
Con questi valori, possiamo concludere che:
Precision: l’algoritmo di foresta casuale ha individuato l’89% delle istanze come negative (ossia che il dipendente ha abbandonato l’azienda). Per le previsioni positive (Si, il dipendente non si è licenziato), l’algoritmo ne ha individuate correttamente solo il 69%.
Recall: per tutte le istanze che erano effettivamente positive, solo il 34% è stata classificata correttamente per i Si, mentre tale percentuale raggiunge il 97% se si tratta dei No.
F1-score: è una media armonica ponderata delle due precedenti metriche, come visto nell’articolo dedicato alla matrice di confusione.
L’accuratezza complessiva del modello si attesta all’87%, e scende all’84% se non si utilizza l’analisi discriminante lineare.
Conclusione
L’analisi discriminante lineare è un metodo semplice ed efficace per la classificazione, e permette di ridurre la dimensionalità di dataset grandi, con dimensione elevata.
È adatto in quelle situazioni in cui si analizzano dati etichettati, quindi non adatto ad esempio se ci si trova a che fare con dataset di immagini non etichettate.
Questo poiché l’analisi discriminante lineare stima la probabilità che una nuova serie di input appartenga a ogni classe: la classe di output prevista è quella che ha la più alta probabilità. Senza un’etichetta l’algoritmo non saprebbe la classe di appartenenza, né tanto meno prevederne una con efficacia.
Anche se esistono varie varianti, (come ad esempio la Quadratic Discriminant Analysis, la Flexible Discriminant Analysis o la Regular Discriminant Analysis), l’algoritmo Linear Discriminant Analysis risulta un buono strumento che vale la pena utilizzare prima della creazione di modelli con molte caratteristiche.