Polydesk-logotype
Polydesk.ai — Header

UMAP (Uniform Manifold Approximation and Projection)

UMAP est un algorithme de réduction de dimensionnalité non linéaire qui projette des données de haute dimension dans un espace de faible dimension en préservant à la fois la structure locale (voisinages) et, dans une certaine mesure, la structure globale (relations entre clusters).

Publié en 2018 par Leland McInnes, John Healy et James Melville, UMAP s’est rapidement imposé comme le successeur de t-SNE pour la visualisation de données de haute dimension. Il est nettement plus rapide, produit des embeddings plus stables, préserve mieux la structure globale, et peut servir à la fois de visualisation et de prétraitement pour le machine learning. UMAP est devenu le standard de facto dans de nombreux domaines, de la bioinformatique single-cell au NLP.

Fiche rapide : UMAP
Nom complet
Uniform Manifold Approximation and Projection
Auteurs
Leland McInnes, John Healy, James Melville (2018)
Type
Réduction de dimensionnalité non linéaire
Préserve
Structure locale + structure globale (partiellement)
Paramètres clés
n_neighbors (défaut : 15), min_dist (défaut : 0,1)
Calcul Python
umap-learn (pip install umap-learn)
Vitesse (MNIST 70K)
~1 min (vs ~45 min pour t-SNE scikit-learn)

Comment fonctionne UMAP

UMAP repose sur trois hypothèses fondamentales : les données sont distribuées uniformément sur une variété (manifold) riemannienne, la métrique riemannienne est localement constante, et la variété est localement connexe. À partir de ces hypothèses, l’algorithme procède en deux grandes étapes.

Étape 1 : Construction du graphe de voisinage

UMAP construit un graphe pondéré reliant chaque point à ses k plus proches voisins (contrôlé par n_neighbors). Les poids des arêtes reflètent la similarité entre les points, avec une adaptation locale qui tient compte de la densité : dans les zones denses, seuls les voisins très proches ont un poids significatif ; dans les zones éparses, des voisins plus éloignés reçoivent un poids non négligeable. Ce graphe est ensuite symétrisé par une union floue (fuzzy union).

Cette construction mathématique, basée sur les ensembles simpliciaux flous (fuzzy simplicial sets) de la topologie algébrique, est l’innovation théorique principale de UMAP. En pratique, elle permet à l’algorithme de s’adapter automatiquement aux variations locales de densité.

Étape 2 : Optimisation de l’embedding

UMAP optimise la position des points dans l’espace de faible dimension (2D, 3D, ou plus) pour que le graphe de voisinage en basse dimension ressemble le plus possible au graphe en haute dimension. L’optimisation minimise la cross-entropy entre les deux graphes via une descente de gradient stochastique.

Les forces attractives rapprochent les points qui sont voisins en haute dimension, tandis que les forces répulsives éloignent les points qui ne sont pas voisins. Le paramètre min_dist contrôle la distance minimale entre les points dans l’embedding, déterminant la compacité des clusters.

Les paramètres clés de UMAP

n_neighbors : le compromis local/global

C’est le paramètre le plus important. Il contrôle la taille du voisinage local considéré pour chaque point, similaire au rôle de la perplexité dans t-SNE.

Valeurs basses (2-5) : UMAP se concentre sur des voisinages très locaux. Produit des chaînes et des fragments déconnectés. Utile pour révéler la microstructure mais perd la vue d’ensemble.

Valeurs moyennes (10-20) : bon compromis local/global. La plage recommandée par défaut. 15 est le défaut de la librairie.

Valeurs élevées (50-200) : UMAP capture la structure globale au détriment des détails locaux. Les clusters se fondent progressivement. Utile pour comprendre les relations entre groupes.

min_dist : la compacité des clusters

Contrôle l’espacement minimum entre les points dans l’embedding.

min_dist = 0.0 : les points peuvent être empilés les uns sur les autres. Produit des clusters très denses et compacts avec des séparations nettes. Idéal comme prétraitement avant le clustering (HDBSCAN notamment).

min_dist = 0.1 (défaut) : bon compromis entre compacité et lisibilité. Standard pour la visualisation.

min_dist = 0.5-1.0 : les points sont plus étalés. Donne une vue plus « aérée » et uniforme, mais les clusters sont moins distincts.

metric : la mesure de distance

UMAP supporte un large éventail de métriques de distance, y compris des métriques personnalisées compilées avec Numba. Les plus courantes :

Métrique Quand l’utiliser
euclidean (défaut) Données numériques générales
cosine Embeddings de texte, word vectors, données directionnelles
manhattan Données avec outliers (plus robuste que euclidienne)
correlation Données de profils d’expression génique
precomputed Matrice de distances pré-calculée

n_components : la dimension cible

2 par défaut (visualisation). Contrairement à t-SNE qui fonctionne mal au-delà de 3D, UMAP gère bien des dimensions cibles plus élevées (10, 50, 100). C’est ce qui le rend utilisable comme prétraitement ML : réduire de 10 000 features à 50 dimensions UMAP avant un classifieur.

Réglages recommandés par usage Visualisation : n_neighbors=15, min_dist=0.1, n_components=2 (défauts). Clustering : n_neighbors=30, min_dist=0.0, n_components=2 (clusters compacts). Prétraitement ML : n_neighbors=15, min_dist=0.1, n_components=50-100 (haute dimension cible).

UMAP en Python

Installation

pip install umap-learn
Attention au nom du package Le package s’appelle umap-learn (avec un tiret) sur PyPI, mais s’importe avec import umap (sans tiret). Ne confondez pas avec le package umap qui est un tout autre projet.

Usage de base

import umap
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# Charger et standardiser
X, y = load_digits(return_X_y=True)
X_scaled = StandardScaler().fit_transform(X)

# UMAP en 2D
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1,
                     n_components=2, random_state=42)
X_2d = reducer.fit_transform(X_scaled)

# Visualisation
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_2d[:, 0], X_2d[:, 1],
                      c=y, cmap='tab10', s=5, alpha=0.7)
plt.colorbar(scatter, label='Chiffre')
plt.title('UMAP des chiffres manuscrits')
plt.xlabel('UMAP 1')
plt.ylabel('UMAP 2')
plt.tight_layout()
plt.show()

Pipeline PCA + UMAP (recommandé pour la haute dimension)

from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('pca', PCA(n_components=50)),
    ('umap', umap.UMAP(n_neighbors=15, min_dist=0.1,
                        n_components=2, random_state=42))
])

X_2d = pipeline.fit_transform(X)

Transformer de nouvelles données

Contrairement à t-SNE, UMAP supporte .transform() pour projeter de nouvelles observations sur un embedding existant :

# Entraîner sur le jeu d'entraînement
reducer = umap.UMAP(random_state=42)
reducer.fit(X_train_scaled)

# Projeter le jeu de test
X_test_2d = reducer.transform(X_test_scaled)

Cette capacité est ce qui rend UMAP utilisable dans un pipeline scikit-learn, comme prétraitement avant un classifieur ou un algorithme de clustering.

UMAP + HDBSCAN : le pipeline de clustering moderne

Combiner UMAP (réduction) et HDBSCAN (clustering par densité) est devenu un standard pour le clustering de données de haute dimension :

import hdbscan

# UMAP optimisé pour le clustering
reducer = umap.UMAP(n_neighbors=30, min_dist=0.0,
                     n_components=2, random_state=42)
embedding = reducer.fit_transform(X_scaled)

# HDBSCAN sur l'embedding
clusterer = hdbscan.HDBSCAN(min_cluster_size=50, min_samples=10)
labels = clusterer.fit_predict(embedding)

n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
print(f"Clusters trouvés : {n_clusters}")
print(f"Points non classés : {(labels == -1).sum()}")
Prudence avec UMAP + clustering UMAP ne préserve pas parfaitement la densité et peut créer de fausses séparations entre clusters. Validez toujours les clusters obtenus avec des métriques indépendantes (silhouette score, ARI si vous avez des labels) et une connaissance métier. Ne prenez jamais les clusters d’un embedding UMAP comme vérité absolue.

UMAP vs t-SNE : comparaison détaillée

Critère UMAP t-SNE
Vitesse (MNIST 70K) ~1 min ~45 min (scikit-learn)
Structure globale Mieux préservée Mal préservée
Structure locale Excellente Excellente
.transform() (nouvelles données) Oui Non
Prétraitement ML Oui (dimension cible flexible) Non recommandé
Dimension cible > 3 Bien supporté Mal supporté
Métriques de distance Large choix + métriques custom Euclidienne principalement
Supervisé / semi-supervisé Oui (paramètre y) Non
Fondement théorique Topologie algébrique (variétés) Divergence KL (probabilités)
Maturité dans la littérature Croissante (2018) Très établi (2008)

Notre verdict : UMAP domine t-SNE sur pratiquement tous les critères objectifs. L’unique avantage résiduel de t-SNE est son ancienneté (plus de littérature de référence) et son statut de standard dans certains domaines. Pour tout nouveau projet, commencez par UMAP.

UMAP vs PCA : deux rôles complémentaires

UMAP et PCA ne sont pas en concurrence mais complémentaires. La PCA est linéaire, déterministe, interprétable et offre une transformation inverse. UMAP est non linéaire, stochastique, non interprétable mais révèle des structures que la PCA ne peut pas capturer.

Le pipeline standard combine les deux : PCA réduit d’abord de N dimensions à 50-100 (élimine le bruit, accélère le calcul), puis UMAP affine à 2D pour la visualisation. Ce duo est le workflow de facto en single-cell RNA-seq, en NLP et en computer vision.

Applications de UMAP

Bioinformatique single-cell

Le domaine où UMAP a eu le plus d’impact. Pipeline standard : normalisation → PCA (50 composantes) → UMAP (2D). Visualise des centaines de milliers de cellules (chacune avec 20 000+ gènes) pour identifier les types cellulaires. A largement remplacé t-SNE grâce à sa vitesse et sa meilleure préservation des trajectoires de différenciation cellulaire.

NLP : visualisation d’embeddings

Projeter des embeddings de documents ou de phrases (issus de BERT, Sentence Transformers ou des LLM) en 2D pour explorer les clusters thématiques, valider la qualité des représentations et identifier les outliers. La métrique cosinus est recommandée pour les embeddings normalisés.

Prétraitement pour le clustering

UMAP avec min_dist=0.0 produit des embeddings très clustérisables. Combiné avec HDBSCAN, c’est le pipeline de référence pour le clustering de données complexes de haute dimension. Plus efficace que le clustering direct en haute dimension, où les algorithmes basés sur la densité souffrent du fléau de la dimensionnalité.

Détection d’anomalies visuelle

Les anomalies apparaissent comme des points isolés dans l’embedding UMAP. Combiné avec Isolation Forest ou LOF dans l’espace UMAP, c’est une approche efficace pour la détection d’outliers.

Classification et régression (supervisé)

UMAP supporte un mode supervisé et semi-supervisé via le paramètre y dans .fit(X, y). Les labels orientent la réduction pour mieux séparer les classes. Utile comme prétraitement avant un classifieur quand les frontières de décision sont non linéaires.

Limites et pièges

UMAP ne préserve pas parfaitement la densité

Comme t-SNE, UMAP peut dilater les clusters denses et compresser les clusters épars. Les tailles visuelles des clusters ne reflètent pas nécessairement les densités réelles. La variante densMAP (intégrée dans umap-learn) tente de corriger ce problème en ajoutant un terme de préservation de densité dans l’optimisation.

Fausses séparations entre clusters

UMAP peut créer des « déchirures » artificielles dans des clusters continus, fragmentant un groupe unique en sous-groupes apparents. Validez toujours les séparations observées avec des métriques de clustering et une connaissance du domaine.

Sensibilité aux hyperparamètres

Des valeurs différentes de n_neighbors et min_dist peuvent produire des embeddings visuellement très différents. Comme pour t-SNE, testez plusieurs combinaisons et fiez-vous aux structures qui persistent à travers les réglages.

Reproductibilité

UMAP est stochastique : des initialisations différentes produisent des embeddings différents. Fixez random_state pour la reproductibilité. Même avec un seed fixe, la position absolue et l’orientation des clusters peuvent varier entre versions de la librairie.

Verdict

UMAP est le meilleur outil polyvalent de réduction de dimensionnalité non linéaire disponible. Il combine vitesse, qualité d’embedding, flexibilité (visualisation + prétraitement + clustering) et facilité d’utilisation. Pour la visualisation exploratoire, il a remplacé t-SNE dans la plupart des cas d’usage. Pour le prétraitement, il complète la PCA quand les relations sont non linéaires.

La combinaison PCA (50 composantes) → UMAP (2D ou n composantes) est le pipeline standard pour l’exploration de données de haute dimension. Ajoutez HDBSCAN après UMAP pour du clustering. C’est le trio moderne qui a remplacé le duo PCA + K-Means dans de nombreux workflows.


Questions fréquentes sur UMAP

Quelles valeurs de n_neighbors et min_dist choisir ?

Pour la visualisation, les défauts (n_neighbors=15, min_dist=0.1) sont un bon point de départ. Augmentez n_neighbors (30-50) si vous voulez mieux voir la structure globale. Réduisez min_dist à 0.0 si vous préparez les données pour le clustering. Pour les grands datasets (> 100K points), augmentez n_neighbors à 30-50. Testez toujours 2-3 combinaisons et comparez visuellement.

UMAP peut-il servir de prétraitement pour un modèle ML ?

Oui, c’est l’un de ses avantages majeurs par rapport à t-SNE. UMAP supporte .transform() pour projeter de nouvelles données, fonctionne bien avec des dimensions cibles élevées (10-100), et s’intègre dans un pipeline scikit-learn. C’est particulièrement utile quand la PCA ne capture pas suffisamment la structure non linéaire des données. Attention cependant : UMAP en prétraitement est stochastique, ce qui peut affecter la reproductibilité du pipeline complet.

UMAP est-il meilleur que t-SNE ?

Sur des critères objectifs, oui dans la plupart des cas. UMAP est 10-50x plus rapide, préserve mieux la structure globale, supporte la transformation de nouvelles données, et offre plus de flexibilité (métriques, supervisé, dimension cible). t-SNE reste pertinent dans les domaines où il est le standard historique (publications bioinformatiques antérieures à 2018) et pour reproduire des résultats existants. Pour un nouveau projet, UMAP est le choix par défaut.

Faut-il standardiser les données avant UMAP ?

Oui, si les features ont des échelles différentes et que vous utilisez la distance euclidienne (défaut). Comme pour la PCA et t-SNE, les variables à grande échelle domineront le calcul de distance. Standardisez avec StandardScaler(). Exception : si vous utilisez la distance cosinus (embeddings normalisés) ou une matrice de distance pré-calculée, la standardisation est moins critique.

Comment installer et utiliser UMAP avec scikit-learn ?

Installez avec pip install umap-learn (attention : le package s’appelle umap-learn, pas umap). Importez avec import umap. UMAP est compatible avec l’API scikit-learn : il a les méthodes .fit(), .transform() et .fit_transform(), et s’intègre dans les Pipeline scikit-learn. Pour de meilleures performances, installez aussi pynndescent (recherche de voisins approchée) qui est utilisé automatiquement s’il est disponible.

Polydesk.ai — Footer