Corso
In questo tutorial vedremo come funziona t-SNE, una potente tecnica per la riduzione della dimensionalità e la visualizzazione dei dati. La confronteremo con un'altra tecnica molto diffusa, la PCA, e mostreremo come eseguire sia t-SNE sia PCA con scikit-learn e plotly express su dataset sintetici e reali.

Che cos'è t-SNE?
t-SNE (t-distributed Stochastic Neighbor Embedding) è una tecnica non supervisionata e non lineare di riduzione della dimensionalità per l'esplorazione e la visualizzazione di dati ad alta dimensionalità. Riduzione della dimensionalità non lineare significa che l'algoritmo permette di separare dati che non possono essere separati con una linea retta.

t-SNE ti dà un'idea e un'intuizione su come i dati sono disposti in dimensioni superiori. È spesso usato per visualizzare dataset complessi in due o tre dimensioni, consentendoci di comprendere meglio pattern e relazioni sottostanti nei dati.
Segui il nostro corso Dimensionality Reduction in Python per imparare a esplorare dati ad alta dimensionalità, selezionare le feature ed estrarle.
t-SNE vs PCA
Sia t-SNE che PCA sono tecniche di riduzione della dimensionalità con meccanismi diversi che funzionano al meglio con tipologie di dati differenti.
PCA (Principal Component Analysis) è una tecnica lineare che funziona meglio con dati che presentano una struttura lineare. Cerca di identificare le componenti principali sottostanti nei dati proiettandoli in dimensioni inferiori, minimizzando la varianza residua e preservando grandi distanze a coppie. Leggi il nostro tutorial Principal Component Analysis (PCA) per capire a fondo gli algoritmi con esempi in R.
t-SNE, invece, è una tecnica non lineare che si concentra nel preservare le somiglianze a coppie tra i punti dati in uno spazio a dimensionalità inferiore. t-SNE si preoccupa di preservare le piccole distanze a coppie, mentre PCA si concentra sul mantenimento delle grandi distanze a coppie per massimizzare la varianza.
In sintesi, PCA preserva la varianza nei dati. Al contrario, t-SNE preserva le relazioni tra i punti dati in uno spazio a dimensionalità inferiore, risultando un ottimo algoritmo per visualizzare dati complessi ad alta dimensionalità.
La seguente tabella può aiutarti a confrontare t-SNE e PCA fianco a fianco:
| Caratteristica | t-SNE | PCA |
|---|---|---|
| Tipologia | Riduzione della dimensionalità non lineare | Riduzione della dimensionalità lineare |
| Obiettivo | Preservare le somiglianze locali a coppie | Preservare la varianza globale |
| Ideale per | Visualizzare dati complessi e ad alta dimensionalità | Dati con struttura lineare |
| Output | Rappresentazione a bassa dimensionalità | Componenti principali |
| Casi d'uso | Clustering, rilevamento anomalie, NLP | Riduzione del rumore, estrazione di feature |
| Intensità computazionale | Alta | Bassa |
| Interpretazione | Più difficile da interpretare | Più facile da interpretare |
Come funziona t-SNE
L'algoritmo t-SNE calcola una misura di similarità tra coppie di istanze nello spazio a dimensioni alte e basse. Poi cerca di ottimizzare due misure di similarità. Il tutto avviene in tre passaggi.
- t-SNE modella la probabilità che un punto venga selezionato come vicino di un altro punto sia nelle dimensioni alte che in quelle basse. Inizia calcolando la similarità a coppie tra tutti i punti nello spazio ad alta dimensionalità usando un kernel gaussiano. I punti lontani hanno una probabilità più bassa di essere scelti rispetto ai punti vicini.
- L'algoritmo cerca quindi di mappare i punti ad alta dimensionalità in uno spazio a dimensionalità inferiore preservando le similarità a coppie.
- Questo si ottiene minimizzando la divergenza tra la distribuzione di probabilità originale ad alta dimensionalità e quella a bassa dimensionalità. L'algoritmo usa il gradient descent per minimizzare la divergenza. L'embedding a bassa dimensionalità viene ottimizzato fino a uno stato stabile.
Il processo di ottimizzazione consente la creazione di cluster e sotto-cluster di punti simili nello spazio a bassa dimensionalità, che vengono visualizzati per comprendere la struttura e le relazioni nei dati ad alta dimensionalità.
Esempio in Python con t-SNE
Nell'esempio in Python genereremo dati di classificazione, eseguiremo PCA e t-SNE e visualizzeremo i risultati. Useremo scikit-learn per la riduzione della dimensionalità e useremo Plotly Express per la visualizzazione.
Generare un dataset di classificazione
Useremo la funzione make_classification() di scikit-learn per generare dati sintetici con 6 feature, 1500 campioni e 3 classi.
Dopodiché realizzeremo un grafico 3D delle prime tre feature usando la funzione Plotly Express scatter_3d().
import plotly.express as px
from sklearn.datasets import make_classification
X, y = make_classification(
n_features=6,
n_classes=3,
n_samples=1500,
n_informative=2,
random_state=5,
n_clusters_per_class=1,
)
fig = px.scatter_3d(x=X[:, 0], y=X[:, 1], z=X[:, 2], color=y, opacity=0.8)
fig.show()
Abbiamo un grafico 3D dei dati; puoi anche visualizzare i dati in un grafico 2D usando la funzione scatter() di Plotly Express.

Fitting e trasformazione con PCA
Ora applicheremo l'algoritmo PCA al dataset per ottenere due componenti PCA. fit_transform() apprende e trasforma il dataset allo stesso tempo.
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
Visualizzazione t-SNE in Python
Possiamo ora visualizzare i risultati mostrando due componenti PCA in uno scatter plot.
- x: Prima componente
- y: Seconda componente
- color: variabile target.
Abbiamo anche usato la funzione update_layout() per aggiungere un titolo e rinominare gli assi x e y.
fig = px.scatter(x=X_pca[:, 0], y=X_pca[:, 1], color=y)
fig.update_layout(
title="PCA visualization of Custom Classification dataset",
xaxis_title="First Principal Component",
yaxis_title="Second Principal Component",
)
fig.show()

Fitting e trasformazione di t-SNE
Ora applicheremo l'algoritmo t-SNE al dataset e confronteremo i risultati.
Dopo aver fatto il fit e trasformato i dati, mostreremo la divergenza di Kullback–Leibler (KL) tra le distribuzioni di probabilità ad alta e bassa dimensionalità. Una bassa divergenza KL è in genere indice di risultati migliori.
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
tsne.kl_divergence_
1.1169137954711914
Visualizzazione t-SNE in Python
In modo analogo alla PCA, visualizzeremo due componenti t-SNE in uno scatter plot.
fig = px.scatter(x=X_tsne[:, 0], y=X_tsne[:, 1], color=y)
fig.update_layout(
title="t-SNE visualization of Custom Classification dataset",
xaxis_title="First t-SNE",
yaxis_title="Second t-SNE",
)
fig.show()
Il risultato è nettamente migliore della PCA. Si vedono chiaramente tre grandi cluster.

t-SNE su un dataset di Customer Churn
In questa sezione useremo il dataset di customer churn di una compagnia telefonica iraniana. Il dataset contiene informazioni sull'attività dei clienti, come fallimenti delle chiamate e durata dell'abbonamento, e un'etichetta di churn.
Per churn si intende la percentuale di clienti che smettono di usare un determinato servizio in un dato periodo di tempo.
Nota: Il codice sorgente e il dataset di entrambi gli esempi sono disponibili in questo workbook di DataLab; se vuoi modificare ed eseguire il codice, ti basta farne una copia e sei a posto!
Importare il dataset di customer churn
Caricheremo il dataset con pandas e mostreremo le prime tre righe.
import pandas as pd
df = pd.read_csv("data/customer_churn.csv")
df.head(3)

Riduzione della dimensionalità con PCA
Dopodiché, procederemo così:
- Creare feature (X) e target (y) usando la colonna Churn.
- Normalizzare le feature con uno standard scaler.
- Suddividere il dataset in training set e test set.
- Applicare la PCA al training set.
- Ottenere lo score usando il test set. Lo score rappresenta la log-verosimiglianza media di tutti i campioni.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X = df.drop('Churn', axis=1)
y = df['Churn']
scaler = StandardScaler()
X_norm = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
X_norm, y, random_state=13, test_size=0.25, shuffle=True
)
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train)
pca.score(X_test)
-17.04482851288105
Visualizzare i risultati della PCA
Ora visualizzeremo il risultato della PCA usando lo scatter plot di Plotly Express.
fig = px.scatter(x=X_train_pca[:, 0], y=X_train_pca[:, 1], color=y_train)
fig.update_layout(
title="PCA visualization of Customer Churn dataset",
xaxis_title="First Principal Component",
yaxis_title="Second Principal Component",
)
fig.show()
La PCA non è stata efficace nel creare cluster. I dati nello spazio a bassa dimensionalità sembrano casuali. Potrebbe anche significare che le feature del dataset sono fortemente asimmetriche o che non presentano una forte struttura di correlazione.

Verificare perplexity vs divergence
La perplexity è un iperparametro importante per l'algoritmo t-SNE. Controlla il numero effettivo di vicini che ogni punto considera durante il processo di riduzione della dimensionalità.
Eseguiremo un ciclo per ottenere la metrica di divergenza KL su varie perplexity da 5 a 55 con passo 5. Poi mostreremo il risultato con un line plot di Plotly Express.
import numpy as np
perplexity = np.arange(5, 55, 5)
divergence = []
for i in perplexity:
model = TSNE(n_components=2, init="pca", perplexity=i)
reduced = model.fit_transform(X_train)
divergence.append(model.kl_divergence_)
fig = px.line(x=perplexity, y=divergence, markers=True)
fig.update_layout(xaxis_title="Perplexity Values", yaxis_title="Divergence")
fig.update_traces(line_color="red", line_width=1)
fig.show()
La divergenza KL diventa costante dopo una perplexity di 40. Quindi useremo perplexity 40 nell'algoritmo t-SNE.

Riduzione della dimensionalità con t-SNE
Ora eseguiremo il fit di t-SNE e trasformeremo i dati in dimensioni inferiori usando perplexity 40 per ottenere la divergenza KL più bassa.
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2,perplexity=40, random_state=42)
X_train_tsne = tsne.fit_transform(X_train)
tsne.kl_divergence_
0.258713960647583
Visualizzare t-SNE
Ora useremo lo scatter plot di Plotly per mostrare componenti e classi target.
fig = px.scatter(x=X_train_tsne[:, 0], y=X_train_tsne[:, 1], color=y_train)
fig.update_layout(
title="t-SNE visualization of Customer Churn dataset",
xaxis_title="First t-SNE",
yaxis_title="Second t-SNE",
)
fig.show()
Come possiamo vedere, ci sono più cluster e sotto-cluster. Possiamo usare queste informazioni per comprendere il pattern e sviluppare una strategia per trattenere i clienti esistenti.

Limitazioni e sfide di t-SNE
Sebbene t-SNE sia un potente strumento di visualizzazione per dati ad alta dimensionalità, presenta alcune limitazioni:
- Costo computazionale: t-SNE è computazionalmente costoso, soprattutto per dataset di grandi dimensioni. I suoi calcoli di similarità a coppie scalano male con la dimensione del dataset, rendendolo meno adatto a dataset con milioni di punti.
- Sensibilità agli iperparametri: le prestazioni di t-SNE dipendono molto da iperparametri come perplexity e learning rate. Trovare i valori ottimali richiede spesso tentativi ed errori, attività che può richiedere tempo.
- Scarsa interpretabilià: gli embedding risultanti in t-SNE sono spesso non deterministici (a causa dell'inizializzazione casuale e del gradient descent) e non hanno una relazione direttamente interpretabile con i dati originali ad alta dimensionalità.
- Non adatto a dati out-of-sample: t-SNE non può generalizzare a nuovi dati non visti senza ricalcolare gli embedding da zero, il che è inefficiente per dataset dinamici.
t-SNE vs UMAP: un confronto
Negli ultimi anni, UMAP (Uniform Manifold Approximation and Projection) è emersa come un'alternativa popolare a t-SNE. Sebbene entrambe siano tecniche non lineari di riduzione della dimensionalità pensate per la visualizzazione, UMAP affronta alcune delle limitazioni di t-SNE:
- UMAP è più veloce e usa meno memoria di t-SNE, risultando adatta a dataset grandi.
- UMAP è migliore nel preservare sia le strutture locali sia quelle globali nei dati, mentre t-SNE si concentra principalmente sulle somiglianze locali a coppie.
- UMAP ha meno iperparametri da regolare rispetto a t-SNE e i suoi risultati sono generalmente più consistenti tra le esecuzioni.
- A differenza di t-SNE, UMAP supporta trasformazioni per nuovi punti dati, rendendola più adatta a dataset dinamici.
Complessità computazionale: t-SNE vs UMAP vs PCA
La tabella seguente riassume la complessità computazionale di t-SNE rispetto a UMAP e PCA:
| Tecnica | Complessità computazionale | Caratteristiche | Adatta a dataset grandi |
|---|---|---|---|
| t-SNE | O(N2) | Preserva la struttura locale, altamente personalizzabile | Moderata (lenta per dataset grandi) |
| UMAP | O(N log N) | Bilancia struttura locale e globale, più veloce | Alta (gestisce in modo efficiente dataset grandi) |
| PCA | O(Nd2) | Riduzione lineare, componenti interpretabili | Alta (molto efficiente) |
- N: Numero di punti dati
- d: Numero di feature nei dati
In sintesi, mentre t-SNE fornisce informazioni dettagliate sulle relazioni locali, UMAP è spesso una scelta più efficiente e scalabile per i dataset moderni. PCA resta un'opzione veloce e interpretabile per dati lineari. A seconda del dataset e degli obiettivi, la scelta della tecnica giusta implica bilanciare interpretabilità, costo computazionale e natura dei dati.
Applicazioni di t-SNE
Oltre a visualizzare dati complessi multidimensionali, t-SNE ha altri utilizzi:
- Clustering e classificazione: per raggruppare insieme punti dati simili in uno spazio a dimensionalità inferiore. Può essere usato anche per la classificazione e per trovare pattern nei dati.
- Rilevamento anomalie: per identificare outlier e anomalie nei dati.
- Elaborazione del linguaggio naturale: per visualizzare word embedding generati da un ampio corpus di testo, facilitando l'identificazione di somiglianze e relazioni tra parole.
- Sicurezza informatica: per visualizzare pattern di traffico di rete e rilevare anomalie.
- Ricerca sul cancro: per visualizzare i profili molecolari di campioni tumorali e identificare sottotipi di cancro.
- Interpretazione nel dominio geologico: per visualizzare attributi sismici e identificare anomalie geologiche.
- Elaborazione di segnali biomedici: per visualizzare elettroencefalogrammi (EEG) e rilevare pattern di attività cerebrale.
Conclusione
t-SNE è un potente strumento di visualizzazione per rivelare pattern e strutture nascoste in dataset complessi. Puoi usarlo con immagini, audio, dati biologici e dati tabellari per identificare anomalie e pattern.
In questo post abbiamo visto t-SNE, una tecnica popolare di riduzione della dimensionalità che può visualizzare dati non lineari ad alta dimensionalità in uno spazio a bassa dimensionalità. Abbiamo spiegato l'idea di base di t-SNE, come funziona e le sue applicazioni. Inoltre, abbiamo mostrato alcuni esempi di applicazione di t-SNE a dataset sintetici e reali e come interpretarne i risultati.
t-SNE fa parte dell'apprendimento non supervisionato e il passo successivo naturale è comprendere il clustering gerarchico, la PCA, la decorrelazione e la scoperta di feature interpretabili. Impara tutti questi argomenti con il nostro corso Unsupervised Learning in Python.
FAQs
t-SNE può essere usato con dataset grandi? Quali sono le limitazioni?
t-SNE può incontrare difficoltà con dataset molto grandi a causa della sua complessità computazionale e dell'uso di memoria. Spesso si consiglia di usare t-SNE su un sottoinsieme dei dati o di considerare alternative come UMAP per dataset più grandi.
In che modo la scelta della perplexity influisce sui risultati di t-SNE?
La perplexity è un iperparametro cruciale in t-SNE che influenza l'equilibrio tra la preservazione della struttura locale e quella globale dei dati. Una perplexity bassa enfatizza le relazioni locali, mentre una perplexity alta cattura strutture più ampie. Spesso è necessario sperimentare valori diversi per trovare l'impostazione ottimale per i tuoi dati.
Oltre alla perplexity, quali altri iperparametri dovrei considerare in t-SNE?
Oltre alla perplexity, dovresti considerare il learning rate e il numero di iterazioni. Il learning rate influisce sulla velocità di convergenza dell'algoritmo, mentre il numero di iterazioni determina la durata del processo di ottimizzazione.
Come gestisce t-SNE il rumore nei dati?
t-SNE può essere sensibile al rumore perché cerca di preservare le somiglianze a coppie, che possono essere distorte da feature rumorose. Passaggi di preprocessing come selezione delle feature o denoising possono aiutare a migliorare i risultati di t-SNE.
I risultati di t-SNE possono essere usati per analisi quantitative, come il clustering?
t-SNE è principalmente uno strumento di visualizzazione e non è ideale per analisi quantitative o clustering, poiché non preserva distanze o densità reali. Per il clustering, tecniche come K-means o DBSCAN dovrebbero essere applicate ai dati originali ad alta dimensionalità.
C'è un modo per migliorare l'interpretabilità dei grafici t-SNE?
Per migliorare l'interpretabilità, puoi etichettare i punti con categorie note, usare grafici interattivi o sovrapporre informazioni aggiuntive come confini di cluster o centroidi.
Come si confronta t-SNE con UMAP in termini di prestazioni e risultati?
UMAP è spesso più veloce di t-SNE e può gestire dataset più grandi con embedding di qualità simile o migliore. UMAP tende anche a preservare più struttura globale rispetto a t-SNE.
t-SNE può essere integrato in una pipeline di visualizzazione dati in tempo reale?
A causa dell'intensità computazionale, t-SNE in genere non è adatto alla visualizzazione in tempo reale. Tuttavia, se la dimensione del dataset è gestibile e gli aggiornamenti sono poco frequenti, potrebbe essere fattibile con ottimizzazioni e campionamento.
Come si dovrebbero interpretare i cluster formati in un grafico t-SNE?
I cluster in un grafico t-SNE indicano gruppi di punti con alta similarità nello spazio originale ad alta dimensionalità. Tuttavia, le distanze e le forme esatte nei grafici t-SNE non dovrebbero essere interpretate eccessivamente, poiché non sono significative nello stesso modo dello spazio originale.
Ci sono applicazioni specifiche in cui t-SNE è particolarmente vantaggioso?
t-SNE è particolarmente utile nell'analisi esplorativa dei dati, ad esempio per visualizzare profili di espressione genica, dati di immagini o word embedding, dove è cruciale comprendere la struttura locale e le relazioni.
In quanto data scientist certificato, sono appassionato di sfruttare tecnologie all’avanguardia per creare applicazioni di machine learning innovative. Con una solida esperienza in riconoscimento vocale, analisi e reportistica dei dati, MLOps, AI conversazionale e NLP, ho affinato le mie competenze nello sviluppo di sistemi intelligenti in grado di avere un impatto concreto. Oltre alla mia expertise tecnica, sono anche un comunicatore efficace, con il talento di rendere chiari e sintetici concetti complessi. Di conseguenza, sono diventato un blogger molto seguito in ambito data science, condividendo idee ed esperienze con una community in crescita di professionisti dei dati. Attualmente mi concentro sulla creazione e sull’editing di contenuti, lavorando con large language model per sviluppare contenuti potenti e coinvolgenti che possano aiutare aziende e singoli a valorizzare al meglio i propri dati.


