Sommario
1. Riduzione della dimensionalità
2. Come funziona l'analisi delle componenti principali?
3. Implementazione in Python
4. Valutazione e interpretazione
5. Conclusioni e passi successivi
Molti problemi reali nell’apprendimento automatico coinvolgono set di dati con migliaia o addirittura milioni di funzionalità. L’addestramento di tali set di dati può essere impegnativo dal punto di vista computazionale e l’interpretazione delle soluzioni risultanti può essere ancora più impegnativa.
All'aumentare del numero di caratteristiche, i punti dati diventano più sparsi e le metriche della distanza diventano meno informative, poiché le distanze tra i punti sono meno pronunciate rendendo difficile distinguere cosa sono punti vicini e distanti. Questo è noto come maledizione della dimensionalità.
I dati più sparsi rendono i modelli più difficili da addestrare e più inclini a sovrapporsi all’acquisizione del rumore piuttosto che dei modelli sottostanti. Ciò porta a una scarsa generalizzazione a dati nuovi e invisibili.
La riduzione della dimensionalità viene utilizzata nella scienza dei dati e nell'apprendimento automatico per ridurre il numero di variabili o caratteristiche in un set di dati conservando la maggior parte possibile delle informazioni originali. Questa tecnica è utile per semplificare set di dati complessi, migliorare l'efficienza computazionale e facilitare la visualizzazione dei dati.
Una delle tecniche più utilizzate per mitigare la maledizione della dimensionalità è l'analisi delle componenti principali (PCA). La PCA riduce il numero di caratteristiche in un set di dati mantenendo la maggior parte delle informazioni utili trovando gli assi che rappresentano la variazione maggiore nel set di dati. Questi assi sono chiamati componenti principali.
Poiché la PCA mira a trovare una rappresentazione a bassa dimensionalità di un set di dati mantenendo una grande quota della varianza invece di eseguire previsioni, è considerata una apprendimento non supervisionato algoritmo.
Ma perché mantenere la varianza significa conservare informazioni importanti?
Immagina di analizzare un set di dati sui crimini in una città. I dati presentano numerose caratteristiche tra cui “reato contro la persona – con lesioni” e “reato contro la persona – senza lesioni”. Certamente i luoghi con tariffe elevate del primo esempio devono avere anche tariffe elevate del secondo esempio.
In altre parole, le due caratteristiche dell'esempio sono molto correlate, quindi è possibile ridurre le dimensioni di quel dataset diminuendo le ridondanze nei dati (presenza o assenza di lesioni nella vittima).
L'algoritmo PCA non è altro che un modo sofisticato per farlo.
Ora, analizziamo come funziona l'algoritmo PCA nei seguenti passaggi:
Passaggio 1: centratura dei dati
La PCA è influenzata dalla scala dei dati, quindi la prima cosa da fare è sottrarre la media di ciascuna caratteristica del set di dati, assicurandosi così che tutte le caratteristiche abbiano una media pari a 0.
Passaggio 2: calcolo della matrice di covarianza
Ora dobbiamo calcolare la matrice di covarianza per catturare il modo in cui ciascuna coppia di caratteristiche nei dati varia insieme. Se il set di dati ha N caratteristiche, avrà la matrice di covarianza risultante N X N forma.
Nell'immagine sotto, le caratteristiche più correlate hanno colori più vicini al rosso. Naturalmente, ogni caratteristica sarà altamente correlata con se stessa.
Passaggio 3: scomposizione degli autovalori
Successivamente, dobbiamo eseguire la scomposizione degli autovalori della matrice di covarianza. Nel caso non lo ricordi, data la matrice di covarianza Σ (una matrice quadrata), la decomposizione degli autovalori è il processo di ricerca di un insieme di scalari (autovalori) e vettori (autovettori) tali che:
Dove:
- Σ è la matrice di covarianza n×n.
- v è un vettore diverso da zero chiamato autovettore.
- l è uno scalare chiamato autovalore associato all'autovettore v.
Autovettori indicare le direzioni di massima varianza dei dati (le componenti principali), mentre autovalori quantificare la varianza catturata da ciascuna componente principale.
Se una matrice UN può essere scomposto in autovalori e autovettori, può essere rappresentato come:
Dove:
- Q è una matrice le cui colonne sono gli autovettori di UN.
- Λ è una matrice diagonale i cui elementi diagonali sono gli autovalori di UN.
In questo modo, possiamo usare gli stessi passaggi per trovare gli autovalori e gli autovettori della matrice di covarianza.
Nell'immagine sopra, possiamo vedere che il primo autovettore punta alla direzione con la maggiore varianza dei dati e il secondo autovettore punta alla direzione con la seconda maggiore varianza.
Passaggio 4: selezione dei componenti principali
Come detto in precedenza, gli autovalori quantificano la varianza dei dati nella direzione del corrispondente autovettore. Pertanto, ordiniamo gli autovalori in ordine decrescente e manteniamo solo i primi n richiesti componenti principali.
L'immagine seguente illustra la proporzione della varianza catturata da ciascun componente principale in un PCA a due dimensioni.
Passaggio 5: proiettare i dati
Infine, dobbiamo proiettare i dati originali sulle dimensioni rappresentate dalle componenti principali selezionate. Per fare ciò, dobbiamo moltiplicare il set di dati, dopo averlo centrato, per la matrice degli autovettori trovati nella scomposizione della matrice di covarianza.
Ora che abbiamo compreso a fondo i concetti chiave dell'analisi delle componenti principali, è il momento di creare del codice.
Per prima cosa dobbiamo impostare l'ambiente importando il pacchetto numpy per i calcoli matematici e matplotlib per la visualizzazione:
import numpy as np
import matplotlib.pyplot as plt
Successivamente, incapsuleremo tutti i concetti trattati nella sezione precedente in una classe Python con i seguenti metodi:
Metodo di costruzione per inizializzare i parametri dell'algoritmo: il numero di componenti desiderati, una matrice per memorizzare i vettori dei componenti e un array per memorizzare la varianza spiegata di ciascuna dimensione selezionata.
Nel metodo fit, i primi quattro passaggi presentati nella sezione precedente vengono implementati con il codice. Inoltre, vengono calcolate le varianze spiegate di ciascun componente.
Il metodo di trasformazione esegue l'ultimo passaggio presentato nella sezione precedente: proiettare i dati sulle dimensioni selezionate.
L'ultimo metodo è una funzione di supporto per tracciare la varianza spiegata di ciascuna componente principale selezionata come grafico a barre.
Ecco il codice completo:
class PCA:
def __init__(self, n_components):
self.n_components = n_components
self.components = None
self.mean = None
self.explained_variance = Nonedef fit(self, X):
# Step 1: Standardize the data (subtract the mean)
self.mean = np.mean(X, axis=0)
X_centered = X - self.mean
# Step 2: Compute the covariance matrix
cov_matrix = np.cov(X_centered, rowvar=False)
# Step 3: Compute the eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# Step 4: Sort the eigenvalues and corresponding eigenvectors
sorted_indices = np.argsort(eigenvalues)(::-1)
eigenvalues = eigenvalues(sorted_indices)
eigenvectors = eigenvectors(:, sorted_indices)
# Step 5: Select the top n_components
self.components = eigenvectors(:, :self.n_components)
# Calculate explained variance
total_variance = np.sum(eigenvalues)
self.explained_variance = eigenvalues(:self.n_components) / total_variance
def transform(self, X):
# Step 6: Project the data onto the selected components
X_centered = X - self.mean
return np.dot(X_centered, self.components)
def plot_explained_variance(self):
# Create labels for each principal component
labels = (f'PCA{i+1}' for i in range(self.n_components))
# Create a bar plot for explained variance
plt.figure(figsize=(8, 6))
plt.bar(range(1, self.n_components + 1), self.explained_variance, alpha=0.7, align='center', color='blue', tick_label=labels)
plt.xlabel('Principal Component')
plt.ylabel('Explained Variance Ratio')
plt.title('Explained Variance by Principal Components')
plt.show()
Ora è il momento di utilizzare la classe appena implementata su un set di dati simulato creato utilizzando il pacchetto numpy. Il set di dati ha 10 caratteristiche e 100 campioni.
# create simulated data for analysis
np.random.seed(42)
# Generate a low-dimensional signal
low_dim_data = np.random.randn(100, 4)# Create a random projection matrix to project into higher dimensions
projection_matrix = np.random.randn(4, 10)
# Project the low-dimensional data to higher dimensions
high_dim_data = np.dot(low_dim_data, projection_matrix)
# Add some noise to the high-dimensional data
noise = np.random.normal(loc=0, scale=0.5, size=(100, 10))
data_with_noise = high_dim_data + noise
X = data_with_noise
Prima di eseguire la PCA, rimane una domanda: come scegliamo il numero corretto o ottimale di dimensioni? In generale, dobbiamo cercare il numero di componenti che ammontano ad almeno il 95% della varianza spiegata del set di dati.
Per fare ciò, diamo un'occhiata a come ciascuna componente principale contribuisce alla varianza totale del set di dati:
# Apply PCA
pca = PCA(n_components=10)
pca.fit(X)
X_transformed = pca.transform(X)print("Explained Variance:\n", pca.explained_variance)
>> Explained Variance (%):
(55.406, 25.223, 11.137, 5.298, 0.641, 0.626, 0.511, 0.441, 0.401, 0.317)
Successivamente, tracciamo la somma cumulativa della varianza e controlliamo in quale numero di dimensioni raggiungiamo il valore ottimale del 95% della varianza totale.
Come mostrato nel grafico sopra, il numero ottimale di dimensioni per il set di dati è 4, per un totale del 97,064% della varianza spiegata. In altre parole, abbiamo trasformato un dataset con 10 caratteristiche in uno con sole 3 dimensioni mantenendo più del 97% delle informazioni originali.
Ciò significa che la maggior parte delle 10 caratteristiche originali erano molto correlate e l’algoritmo ha trasformato quei dati ad alta dimensione in componenti principali non correlati.
Abbiamo creato una classe PCA utilizzando solo il pacchetto Numpy che ha ridotto con successo la dimensionalità di un set di dati da 10 funzionalità a sole 4 preservando circa il 97% della varianza dei dati.
Inoltre, abbiamo esplorato un metodo per ottenere un numero ottimale di componenti principali dell'analisi PCA che può essere personalizzato a seconda del problema che stiamo affrontando (potremmo essere interessati a conservare solo il 90% della varianza, ad esempio).
Ciò dimostra il potenziale dell’analisi PCA per affrontare la maledizione della dimensionalità spiegata in precedenza. Inoltre, vorrei lasciare alcuni punti per ulteriori approfondimenti:
- Esegui attività di classificazione o regressione utilizzando altri algoritmi di machine learning sul set di dati ridotto utilizzando l'algoritmo PCA e confronta le prestazioni dei modelli addestrati sul set di dati originale rispetto al set di dati trasformato con PCA per valutare l'impatto della riduzione della dimensionalità.
- Utilizza PCA per la visualizzazione dei dati per rendere i dati ad alta dimensione più interpretabili e per scoprire modelli che non erano evidenti nello spazio delle caratteristiche originali.
- Considera l'idea di esplorare altre tecniche di riduzione della dimensionalità, come ad esempio Incorporamento di vicini stocastici distribuiti t (t-SNE) e Analisi discriminante lineare (LDA).
Codice completo disponibile Qui.
Fonte: towardsdatascience.com