Cursus
In deze tutorial duiken we in de werking van t-SNE, een krachtige techniek voor dimensiereductie en datavisualisatie. We vergelijken het met een andere populaire techniek, PCA, en laten zien hoe je zowel t-SNE als PCA uitvoert met scikit-learn en plotly express op synthetische en real-world datasets.

Wat is t-SNE?
t-SNE (t-distributed Stochastic Neighbor Embedding) is een onbewaakte, niet-lineaire dimensiereductietechniek voor data-exploratie en het visualiseren van hoog-dimensionale data. Niet-lineaire dimensiereductie betekent dat het algoritme ons in staat stelt data te scheiden die niet door een rechte lijn te scheiden is.

t-SNE geeft je gevoel en intuïtie voor hoe data in hogere dimensies is gerangschikt. Het wordt vaak gebruikt om complexe datasets te visualiseren in twee en drie dimensies, zodat we de onderliggende patronen en relaties in de data beter begrijpen.
Volg onze cursus Dimensiereductie in Python om te leren over het verkennen van hoog-dimensionale data, featureselectie en feature-extractie.
t-SNE vs PCA
Zowel t-SNE als PCA zijn technieken voor dimensiereductie met verschillende mechanismen die het beste werken met verschillende soorten data.
PCA (Principal Component Analysis) is een lineaire techniek die het beste werkt met data met een lineaire structuur. Het probeert de onderliggende hoofdcomponenten in de data te identificeren door te projecteren naar lagere dimensies, de variantie te minimaliseren en grote paargewijze afstanden te behouden. Lees onze tutorial Principal Component Analysis (PCA) om de interne werking van de algoritmen te begrijpen met R-voorbeelden.
t-SNE daarentegen is een niet-lineaire techniek die zich richt op het behouden van de paargewijze gelijkenissen tussen datapunten in een lager-dimensionale ruimte. t-SNE richt zich op het behouden van kleine paargewijze afstanden, terwijl PCA zich richt op het behouden van grote paargewijze afstanden om de variantie te maximaliseren.
Samengevat: PCA behoudt de variantie in de data. t-SNE daarentegen behoudt de relaties tussen datapunten in een lager-dimensionale ruimte, waardoor het een goed algoritme is voor het visualiseren van complexe hoog-dimensionale data.
De volgende tabel helpt je t-SNE en PCA naast elkaar te vergelijken:
| Kenmerk | t-SNE | PCA |
|---|---|---|
| Type | Niet-lineaire dimensiereductie | Lineaire dimensiereductie |
| Doel | Lokale paargewijze gelijkenissen behouden | Globale variantie behouden |
| Beste toepassing voor | Visualiseren van complexe, hoog-dimensionale data | Data met lineaire structuur |
| Uitvoer | Lager-dimensionale representatie | Hoofdcomponenten |
| Use-cases | Clustering, anomaliedetectie, NLP | Ruisreductie, feature-extractie |
| Rekenintensiteit | Hoog | Laag |
| Interpretatie | Moeilijker te interpreteren | Makkelijker te interpreteren |
Hoe t-SNE werkt
Het t-SNE-algoritme bepaalt de gelijkenis tussen paren instanties in hogere en lagere-dimensionale ruimte. Daarna probeert het twee gelijkenismaatstaven te optimaliseren. Dat doet het in drie stappen.
- t-SNE modelleert dat een punt als buur van een ander punt wordt geselecteerd in zowel hogere als lagere dimensies. Het begint met het berekenen van een paargewijze gelijkenis tussen alle datapunten in de hoog-dimensionale ruimte met een Gauss-kernel. Punten die ver uit elkaar liggen hebben een lagere kans om gekozen te worden dan punten die dicht bij elkaar liggen.
- Het algoritme probeert vervolgens hoog-dimensionale datapunten te mappen naar een lager-dimensionale ruimte met behoud van de paargewijze gelijkenissen.
- Dit wordt bereikt door de divergentie tussen de oorspronkelijke hoog-dimensionale en lager-dimensionale waarschijnlijkheidsverdeling te minimaliseren. Het algoritme gebruikt gradient descent om de divergentie te minimaliseren. De lager-dimensionale embedding wordt geoptimaliseerd tot een stabiele staat.
Het optimalisatieproces maakt het mogelijk om clusters en subclusters van vergelijkbare datapunten te creëren in de lager-dimensionale ruimte, die worden gevisualiseerd om de structuur en relaties in de hoog-dimensionale data te begrijpen.
t-SNE Python-voorbeeld
In het Python-voorbeeld genereren we classificatiedata, voeren we PCA en t-SNE uit en visualiseren we de resultaten. We gebruiken scikit-learn voor dimensiereductie en we gebruiken Plotly Express voor visualisatie.
Een classificatiedataset genereren
We gebruiken de functie make_classification() van scikit-learn om synthetische data te genereren met 6 features, 1500 samples en 3 klassen.
Daarna maken we een 3D-plot van de eerste drie features van de data met de Plotly Express-functie 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()
We hebben een 3D-plot van de data; je kunt de data ook in een 2D-grafiek visualiseren met de Plotly Express-functie scatter().

Passen en transformeren met PCA
We passen nu het PCA-algoritme toe op de dataset om twee PCA-componenten terug te krijgen. De functie fit_transform() leert en transformeert de dataset tegelijk.
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
t-SNE-visualisatie in Python
We kunnen de resultaten nu visualiseren door twee PCA-componenten in een scatterplot weer te geven.
- x: Eerste component
- y: Tweede component
- color: targetvariabele.
We hebben ook de functie update_layout() gebruikt om een titel toe te voegen en de x-as en y-as te hernoemen.
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()

t-SNE passen en transformeren
Nu passen we het t-SNE-algoritme toe op de dataset en vergelijken we de resultaten.
Na het fitten en transformeren van de data tonen we de Kullback-Leibler (KL) divergentie tussen de hoog- en laag-dimensionale waarschijnlijkheidsverdelingen. Een lage KL-divergentie is normaal gesproken een teken van betere resultaten.
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
tsne.kl_divergence_
1.1169137954711914
t-SNE-visualisatie in Python
Net als bij PCA visualiseren we twee t-SNE-componenten in een scatterplot.
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()
Het resultaat is duidelijk beter dan PCA. We zien drie grote clusters.

t-SNE op een Customer Churn-dataset
In deze sectie gebruiken we de customer churn-dataset van een Iraans telecombedrijf. De dataset bevat informatie over de activiteit van klanten, zoals mislukte oproepen en abonnementsduur, en een churn-label.
Churn betekent het percentage klanten dat in een bepaalde periode stopt met het gebruik van een specifieke dienst.
Let op: De broncode en dataset van beide voorbeelden zijn beschikbaar in deze DataLab-werkmap; als je de code wilt aanpassen en uitvoeren, maak dan gewoon een kopie, en je kunt aan de slag!
De customer churn-dataset importeren
We laden de dataset met pandas en tonen de eerste drie rijen.
import pandas as pd
df = pd.read_csv("data/customer_churn.csv")
df.head(3)

PCA-dimensiereductie
Daarna zullen we:
- Features (X) en target (y) maken met behulp van de kolom Churn.
- De features normaliseren met een standaardscaler.
- De dataset splitsen in een trainings- en testset.
- PCA toepassen op de trainingsdataset.
- De score ophalen met de testdataset. De score vertegenwoordigt de gemiddelde log-likelihood van alle samples.
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
De PCA-resultaten visualiseren
We visualiseren nu het PCA-resultaat met de Plotly Express-scatterplot.
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()
PCA was niet goed in het maken van clusters. De data ziet er in de lage dimensie willekeurig uit. Het kan ook betekenen dat de features in de dataset sterk scheef verdeeld zijn, of dat er geen sterke correlatiestructuur is.

Perplexity vs. divergentie controleren
Perplexity is een belangrijke hyperparameter voor het t-SNE-algoritme. Het bepaalt het effectieve aantal buren dat elk punt in aanmerking neemt tijdens het dimensiereductieproces.
We draaien een lus om de KL-divergentie te verkrijgen bij verschillende perplexity-waarden van 5 tot 55 met stappen van 5. Vervolgens tonen we het resultaat met de Plotly Express-lijngrafiek.
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()
De KL-divergentie wordt constant na een perplexity van 40. Daarom gebruiken we een perplexity van 40 in het t-SNE-algoritme.

t-SNE-dimensiereductie
We fitten nu t-SNE en transformeren de data naar lagere dimensies met een perplexity van 40 om de laagste KL-divergentie te krijgen.
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
De t-SNE visualiseren
We gebruiken nu de Plotly-scatterplot om componenten en targetklassen weer te geven.
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()
Zoals we zien, zijn er meerdere clusters en subclusters. We kunnen deze informatie gebruiken om het patroon te begrijpen en een strategie te ontwikkelen om bestaande klanten te behouden.

Beperkingen en uitdagingen van t-SNE
Hoewel t-SNE een krachtig visualisatie-instrument is voor hoog-dimensionale data, zijn er enkele beperkingen:
- Rekenkosten: t-SNE is rekenintensief, vooral voor grote datasets. De paargewijze gelijkenisberekeningen schalen slecht met de omvang van de dataset, waardoor het minder geschikt is voor datasets met miljoenen punten.
- Gevoeligheid voor hyperparameters: De prestaties van t-SNE hangen sterk af van hyperparameters zoals perplexity en learning rate. Het vinden van optimale waarden vereist vaak trial-and-error, wat tijdrovend kan zijn.
- Gebrek aan interpreteerbaarheid: De resulterende embeddings in t-SNE zijn vaak niet-deterministisch (door willekeurige initialisatie en gradient descent) en missen een direct interpreteerbare relatie met de oorspronkelijke hoog-dimensionale data.
- Niet geschikt voor out-of-sample data: t-SNE kan niet generaliseren naar nieuwe, ongeziene data zonder de embeddings volledig opnieuw te berekenen, wat inefficiënt is voor dynamische datasets.
t-SNE vs. UMAP: Een vergelijking
De afgelopen jaren is UMAP (Uniform Manifold Approximation and Projection) opgekomen als een populair alternatief voor t-SNE. Hoewel beide niet-lineaire dimensiereductietechnieken zijn die ontworpen zijn voor visualisatie, pakt UMAP enkele beperkingen van t-SNE aan:
- UMAP is sneller en efficiënter met geheugen dan t-SNE, waardoor het geschikt is voor grote datasets.
- UMAP behoudt zowel lokale als globale structuren in de data beter, terwijl t-SNE zich primair richt op het behouden van lokale paargewijze gelijkenissen.
- UMAP heeft minder hyperparameters om af te stemmen dan t-SNE en de resultaten zijn over het algemeen consistenter tussen runs.
- In tegenstelling tot t-SNE ondersteunt UMAP transformaties voor nieuwe datapunten, waardoor het geschikter is voor dynamische datasets.
Rekencomplexiteit: t-SNE vs. UMAP vs. PCA
De volgende tabel vat de rekencomplexiteit van t-SNE samen in vergelijking met UMAP en PCA:
| Techniek | Rekencomplexiteit | Kenmerken | Geschiktheid voor grote datasets |
|---|---|---|---|
| t-SNE | O(N2) | Behoudt lokale structuur, sterk aanpasbaar | Gemiddeld (traag voor grote datasets) |
| UMAP | O(N log N) | Balanceert lokale en globale structuur, sneller | Hoog (verwerkt grote datasets efficiënt) |
| PCA | O(Nd2) | Lineaire reductie, interpreteerbare componenten | Hoog (zeer efficiënt) |
- N: Aantal datapunten
- d: Aantal features in de data
Samengevat: hoewel t-SNE gedetailleerde inzichten geeft in lokale relaties, is UMAP vaak een efficiëntere en schaalbaardere keuze voor moderne datasets. PCA blijft een snelle en interpreteerbare optie voor lineaire data. Afhankelijk van de dataset en doelen vraagt de juiste keuze om een balans tussen interpreteerbaarheid, rekenkosten en de aard van de data.
Toepassingen van t-SNE
Naast het visualiseren van complexe multidimensionale data heeft t-SNE andere toepassingen:
- Clustering en classificatie: om vergelijkbare datapunten samen te clusteren in een lager-dimensionale ruimte. Het kan ook worden gebruikt voor classificatie en het vinden van patronen in de data.
- Detectie van anomalieën: om uitschieters en anomalieën in de data te identificeren.
- Natural language processing: om word embeddings te visualiseren die zijn gegenereerd uit een groot tekstcorpus, waardoor overeenkomsten en relaties tussen woorden makkelijker te identificeren zijn.
- Computerbeveiliging: om netwerkverkeerspatronen te visualiseren en anomalieën te detecteren.
- Kankeronderzoek: om moleculaire profielen van tumorsamples te visualiseren en kankersubtypen te identificeren.
- Geologische domeininterpretatie: om seismische attributen te visualiseren en geologische anomalieën te identificeren.
- Biomedische signaalverwerking: om elektro-encefalogrammen (EEG) te visualiseren en patronen van hersenactiviteit te detecteren.
Conclusie
t-SNE is een krachtig visualisatie-instrument om verborgen patronen en structuren in complexe datasets te onthullen. Je kunt het gebruiken voor afbeeldingen, audio, biologisch materiaal en individuele data om anomalieën en patronen te identificeren.
In deze blogpost hebben we t-SNE behandeld, een populaire dimensiereductietechniek die hoog-dimensionale niet-lineaire data kan visualiseren in een laag-dimensionale ruimte. We hebben het hoofdidee achter t-SNE, de werking en de toepassingen uitgelegd. Bovendien hebben we enkele voorbeelden laten zien van het toepassen van t-SNE op synthetische en echte datasets en hoe je de resultaten interpreteert.
t-SNE maakt deel uit van Unsupervised Learning, en de volgende logische stap is het begrijpen van hiërarchische clustering, PCA, decorrelatie en het ontdekken van interpreteerbare features. Leer al deze onderwerpen in onze cursus Unsupervised Learning in Python.
FAQs
Kan t-SNE worden gebruikt voor grote datasets, en wat zijn de beperkingen?
t-SNE kan moeite hebben met zeer grote datasets vanwege de rekencomplexiteit en het geheugengebruik. Het wordt vaak aangeraden om t-SNE op een subset van de data te gebruiken of voor grotere datasets alternatieven zoals UMAP te overwegen.
Hoe beïnvloedt de keuze van perplexity de resultaten van t-SNE?
Perplexity is een cruciale hyperparameter in t-SNE die de balans beïnvloedt tussen het behouden van lokale en globale datastructuren. Lage perplexity benadrukt lokale relaties, terwijl hoge perplexity bredere structuren vastlegt. Experimenteren met verschillende waarden is vaak nodig om de optimale instelling voor jouw data te vinden.
Welke andere hyperparameters moet ik in t-SNE overwegen om af te stemmen, naast perplexity?
Naast perplexity kun je de learning rate en het aantal iteraties overwegen. De learning rate beïnvloedt hoe snel het algoritme convergeert, terwijl het aantal iteraties de duur van het optimalisatieproces bepaalt.
Hoe gaat t-SNE om met ruis in de data?
t-SNE kan gevoelig zijn voor ruis omdat het probeert paargewijze gelijkenissen te behouden, die door ruisachtige features verstoord kunnen raken. Voorverwerkingsstappen zoals featureselectie of denoising kunnen de t-SNE-resultaten verbeteren.
Kunnen t-SNE-resultaten worden gebruikt voor kwantitatieve analyse, zoals clustering?
t-SNE is primair een visualisatietool en niet ideaal voor kwantitatieve analyse of clustering, omdat het geen echte afstanden of dichtheden behoudt. Voor clustering moeten technieken zoals K-means of DBSCAN op de oorspronkelijke hoog-dimensionale data worden toegepast.
Is er een manier om de interpreteerbaarheid van t-SNE-plots te verbeteren?
Om de interpreteerbaarheid te vergroten, kun je de datapunten labelen met bekende categorieën, interactieve plots gebruiken of extra informatie zoals clustergrenzen of centroiden overlayen.
Hoe vergelijkt t-SNE met UMAP qua prestaties en resultaten?
UMAP is vaak sneller dan t-SNE en kan grotere datasets aan met vergelijkbare of betere kwaliteit van embeddings. UMAP behoudt ook doorgaans meer van de globale structuur van de data in vergelijking met t-SNE.
Kan t-SNE worden geïntegreerd in een real-time datavisualisatie-pijplijn?
Vanwege de rekenintensiteit is t-SNE over het algemeen niet geschikt voor real-time visualisatie. Als de dataset echter beheersbaar is en updates niet frequent zijn, kan het met optimalisatie en sampling wellicht haalbaar zijn.
Hoe moet je de clusters in een t-SNE-plot interpreteren?
Clusters in een t-SNE-plot duiden op groepen datapunten met hoge gelijkenis in de oorspronkelijke hoog-dimensionale ruimte. De exacte afstanden en vormen in t-SNE-plots moeten echter niet te letterlijk worden geïnterpreteerd, omdat ze niet dezelfde betekenis hebben als in de oorspronkelijke ruimte.
Zijn er specifieke toepassingen waar t-SNE bijzonder voordelig is?
t-SNE is bijzonder nuttig bij exploratieve data-analyse, zoals het visualiseren van genexpressieprofielen, beelddata of word embeddings, waar begrip van lokale structuur en relaties cruciaal is.
Als gecertificeerd data scientist haal ik met passie het maximale uit de nieuwste technologie om innovatieve machinelearning-toepassingen te bouwen. Met een sterke achtergrond in spraakherkenning, data-analyse en -rapportage, MLOps, conversationele AI en NLP heb ik mijn vaardigheden aangescherpt in het ontwikkelen van intelligente systemen die echt impact maken. Naast mijn technische expertise ben ik ook een sterke communicator met een talent om complexe concepten terug te brengen tot heldere, beknopte taal. Daardoor ben ik uitgegroeid tot een veelgelezen blogger over data science, waar ik mijn inzichten en ervaringen deel met een groeiende community van data-professionals. Op dit moment richt ik me op contentcreatie en redactie, waarbij ik met large language models werk aan krachtige en aansprekende content die zowel bedrijven als individuen helpt het beste uit hun data te halen.

