
L’idea principale dell’analisi delle componenti principali (PCA) è quella di ridurre la dimensionalità di un set di dati costituito da molte variabili più o meno correlate tra loro, mantenendo la variazione presente nel set di dati, nella misura massima.
Ciò viene fatto trasformando le variabili in un nuovo insieme di variabili, che sono conosciute come le componenti principali (o semplicemente, PC, dall’inglese principal component).
Queste componenti principali sono calcolate ricavando gli autovettori di una matrice di covarianza.
Ognuna di esse sono tra di loro ortogonali, ed ordinate in modo tale che la variazione presente nelle variabili originali diminuisca dal valore più alto al valore più basso.
Quindi, in questo modo, la prima componente principale mantiene la massima variazione che era presente nei dati originali, la seconda componente principale la seconda massima variazione, e così via. Verrà eliminata la componente (o le componenti) che ha minore varianza.
Abbiamo già visto come calcolare un esempio di algoritmo PCA manualmente in questo articolo: in questo invece, vediamo un esempio di riduzione della dimensionalità di un problema utilizzando l’algoritmo PCA in linguaggio Python.
Riduzione della dimensionalità: che significa?
Nei problemi di classificazione dell’apprendimento automatico, ci sono spesso troppi fattori sulla base dei quali viene effettuata la classificazione finale. Questi fattori sono sostanzialmente variabili chiamate funzionalità o caratteristiche.
Maggiore è il numero di queste variabili, più diventa difficile visualizzare il set di allenamento e quindi lavorarci su.
A volte, la maggior parte di queste funzionalità sono correlate e quindi ridondanti. È qui che entrano in gioco gli algoritmi di riduzione della dimensionalità. Un esempio di questo algoritmo è il PCA, o Principal Component Analysis, che vedremo nel proseguo dell’articolo.
La riduzione della dimensionalità, detta anche riduzione dimensionale, è quindi 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.
Esempio di algoritmo PCA in Python per la riduzione della dimensionalità
Partiamo ora da un esempio a due dimensioni, in modo da comprendere, nel modo più semplice possibile come l’algoritmo PCA funziona.
L’analisi delle componenti principali è un metodo rapido e flessibile non supervisionato per la riduzione della dimensionalità dei dati. Il suo comportamento è più facile da visualizzare guardando un set di dati bidimensionale. Vediamo l’esempio proposto nel testo “Python Data Science Handbook: Tools and Techniques for Developers” di Jake VanderPlas.
Il primo step è quello di importare le librerie principali in python: Numpy per eseguire le operazioni e i calcoli matematici, Matplotlib per la visualizzazione dei dati.
Creiamo 200 punti casuali nello spazio bidimensionale.
Per farlo utilizziamo un array a due dimensioni popolato da campioni casuali che seguono una distribuzione uniforme (rand): questo array viene moltiplicato da un altro array 2 x 200 (dove questi valori rappresentano campioni di una distribuzione normale standard).
A questo valore, viene calcolata la trasposta e il risultato è assegnato alla variabile X. L’obiettivo è avere una relazione tra le varie variabili anche se generate casualmente.
Le righe 3 e 4 ci permettono di rappresentare sugli assi x,y il risultato dei numeri casuali così ottenuti. Abbiamo:
Sembrerebbe che la relazione tra x e y sia lineare. Però stiamo affrontando un problema non supervisionato: ciò vuol dire che si deve cercare di conoscere la relazione tra i valori x e y, piuttosto che tentare di prevedere i valori y dai valori x.
Richiamiamo il metodo PCA
Nell’analisi delle componenti principali, questa relazione viene quantificata trovando un elenco degli assi principali nei dati e utilizzando tali assi per descrivere il set di dati. Usando lo stimatore PCA di Scikit-Learn, possiamo calcolare ciò come segue.
Utilizziamo due dimensioni e tramite fit(X) andiamo ad adattare il modello alla X. Otteniamo come risultato i parametri del modello PCA, descritti maggiormente nella documentazione Sklearn. L’unica cosa definita da noi è n_components pari a 2, ossia due componenti principali, gli altri parametri sono quelli di default:
L’adattamento apprende alcune quantità dai dati, soprattutto i “componenti” e la “varianza”:
I valori della varianza possono essere rappresentati e compresi maggiormente in un grafico bidimensionale a istogramma, con l’asse verticale che misura la varianza e l’asse orizzontale le componenti principali. Eseguendo il seguente script è possibile generare il grafico, dopo aver importato Seaborn e Pandas (altre due librerie chiave nel machine learning):
Ed otterremo:
Visualizzazione delle componenti principali
Per vedere cosa significano questi numeri, visualizziamoli come vettori sui dati di input, usando i “componenti” per definire la direzione del vettore e la “varianza spiegata” per definire la lunghezza quadrata del vettore:
Questi vettori rappresentano gli assi principali dei dati e la lunghezza del vettore è un’indicazione di quanto “importante” sia l’asse nel descrivere la distribuzione dei dati: più precisamente, è una misura della varianza dei dati quando proiettati su quell’asse. La proiezione di ciascun punto dato sugli assi principali sono le “componenti principali” dei dati.
Se tracciamo questi componenti principali accanto ai dati originali, vediamo i grafici mostrati qui:
Tali grafici si sono ottenuti eseguendo le seguenti righe di codice: nel primo blocco di righe definiamo i nostri dati (come impostato nelle righe iniziali); nel secondo blocco creiamo il primo grafico a sinistra e nel secondo proiettiamo le componenti principali su un asse cartesiano, potendo vedere che sono effettivamente ortogonali tra di loro:
Questa trasformazione da assi di dati ad assi principali è una trasformazione affine, che in pratica significa che è composta da traslazione, rotazione e ridimensionamento uniforme.
Mentre questo algoritmo per trovare le componenti principali può sembrare solo una curiosità matematica, risulta avere applicazioni di vasta portata nel mondo dell’apprendimento automatico e dell’esplorazione dei dati.
Da 2 a una dimensione
L’uso della PCA per la riduzione della dimensionalità implica l’azzeramento di uno o più componenti principali più piccoli, con conseguente proiezione a dimensione inferiore dei dati. Questa riduzione però ha il vantaggio di preservare la massima varianza dei dati.
Ecco un esempio dell’utilizzo di PCA come trasformazione di riduzione della dimensionalità:
I dati trasformati sono stati ridotti a un’unica dimensione. Per comprendere l’effetto di questa riduzione di dimensionalità, possiamo eseguire la trasformazione inversa di questi dati ridotti e tracciarli insieme ai dati originali:
Ed otterremo:
I punti in arancio nell’immagine appena mostrata sono i dati originali, mentre i punti di colore azzurro sono la versione proiettata. Ciò chiarisce cosa significa una riduzione della dimensionalità della PCA: le informazioni lungo l’asse o gli assi principali meno importanti vengono rimosse, lasciando solo la componente o le componenti dei dati con la varianza più elevata.
La frazione di varianza che viene ritagliata (proporzionale alla diffusione dei punti attorno alla linea formata in questa figura) è approssimativamente una misura di quante “informazioni” vengono scartate in questa riduzione di dimensionalità.
Questo set di dati di dimensioni ridotte è in alcuni sensi “abbastanza buono” per codificare le relazioni più importanti tra i punti: nonostante la riduzione della dimensione dei dati del 50%, la relazione generale tra i punti dati è per lo più preservata.
Conclusione
In questo articolo abbiamo visto un esempio di riduzione della dimensionalità tramite l’utilizzo dell’algoritmo PCA in linguaggio python.
Si è preso spunto da un esempio di Jake VanderPlas, che mostra in maniera intuitiva come l’algoritmo pca viene utilizzato nella riduzione dimensionale di un problema. Si è partiti da un problema bidimensionale, si sono calcolati i vettori per capire quale delle due dimensioni ha più rilevanza.
Dopodichè si è applicata la riduzione, togliendo la dimensione con minore varianza, e si sono proiettati in esso i dati originali.
Ovviamente, l’utilità della riduzione della dimensionalità potrebbe non essere del tutto evidente in sole due dimensioni, ma diventa molto più chiara quando si osservano dati ad alta dimensione. Questo è un motivo per cui viene utilizzata anche in altri algoritmi come la Random Forest o gli alberi decisionali.