Accueil / Factory / Algos ML / t-SNE — factory / algos ML / visualisation

PROJECTION T-SNE.

t-SNE place chaque ligne d'un tableau de dizaines de colonnes sur une carte en 2D, en s'efforçant que les voisins d'origine restent voisins. Les groupes naturels apparaissent comme des îlots. C'est un outil d'exploration et de contrôle visuel, pas un modèle : la taille des îlots et les distances entre eux ne se lisent pas.

VisualisationRéduction de dimensionNon linéaireExplorationNiveau : intermédiaire

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceExcellente préservation des voisinages locaux
InterprétabilitéAxes sans signification, distances entre îlots trompeuses
VitesseLent au-delà de quelques dizaines de milliers de lignes
Facilité de réglagePerplexité à tester, carte variable selon la graine
Tolérance aux données brutesStandardisation et réduction préalable conseillées
EN 30 SECONDES

Un plan de table pour 1 800 invités décrits chacun par 64 caractéristiques : chacun doit être assis près de ceux qui lui ressemblent le plus, quitte à déformer la salle.

1. On mesure qui est voisin de qui

Dans l'espace d'origine, chaque point répartit une probabilité de voisinage sur les autres, forte pour les plus proches. La perplexité règle le nombre effectif de voisins pris en compte.

2. On pose les points sur une carte 2D

Au hasard ou selon une ACP. On y définit les mêmes probabilités avec une loi de Student (le t de t-SNE), à queues épaisses, qui laisse de la place pour écarter les groupes.

3. On déplace les points

Par descente de gradient, les points bougent jusqu'à ce que les voisinages de la carte ressemblent le plus possible à ceux d'origine (divergence de Kullback-Leibler minimale).

LE CAS MÉTIER

qualité des données · documents scannés / OCR
EN ENTRÉE

1 797 images de chiffres manuscrits

Chaque image de 8 x 8 pixels devient une ligne de 64 valeurs. Avant d'entraîner un modèle de lecture automatique, on veut voir si les chiffres forment des groupes distincts et repérer les images ambiguës.

EN SORTIE

Une carte à îlots

La carte 2D regroupe les images en îlots qui correspondent presque chacun à un chiffre. Une image isolée dans l'îlot d'un autre chiffre est à revoir : chiffre mal écrit ou étiquette fausse. Le chiffre ne sert qu'à colorer la carte, t-SNE ne l'utilise pas.

CE QU'ON MESURE

Les voisins sont-ils du même chiffre ?

On classe chaque image d'après ses 5 plus proches voisins sur la carte. Sur le jeu d'exemple, 97,6 % des images sont bien classées avec t-SNE, contre 60,3 % avec une ACP à 2 axes : t-SNE garde les voisinages que l'ACP écrase.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Explorer visuellement des données de dizaines ou centaines de colonnes
  • Vérifier avant un modèle que des classes sont séparables
  • Repérer des étiquettes douteuses ou des sous-groupes inattendus
  • Montrer la structure d'embeddings (textes, images) à un public non technique

NON

  • Mesurer des distances ou des tailles de groupes sur la carte : elles ne veulent rien dire
  • Placer de nouvelles lignes sur une carte existante : t-SNE ne sait pas, UMAP oui
  • Plus de 100 000 lignes environ : UMAP est bien plus rapide
  • Créer des variables pour un modèle : utiliser l'ACP ou UMAP
LES 3 RÉGLAGES QUI COMPTENT

Noms donnés pour R (Rtsne) et Python (scikit-learn).

perplexity

Nombre effectif de voisins considérés, 30 par défaut, en général entre 5 et 50. Petite, elle fait éclater les groupes en petits îlots ; grande, elle privilégie la structure d'ensemble. On compare deux ou trois valeurs.

pca / initial_dims

Rtsne réduit d'abord les données à 50 axes par ACP, ce qui accélère et débruite. En Python, on applique soi-même une ACP au-delà de 50 colonnes environ.

max_iter et graine

Trop peu d'itérations laissent une carte inachevée. Deux graines donnent des cartes différentes mais des groupes semblables : on fixe la graine pour reproduire une présentation.

LE CODE MINIMAL

jeu d'exemple : chiffres_manuscrits.csv ↓
# Chiffres manuscrits : t-SNE en R
library(Rtsne)
library(class)

chiffres <- read.csv("chiffres_manuscrits.csv")
X <- as.matrix(chiffres[, names(chiffres) != "chiffre"]) / 16   # 64 pixels entre 0 et 1
y <- factor(chiffres$chiffre)   # pas utilisé par t-SNE, seulement pour vérifier

set.seed(42)
tsne <- Rtsne(X, dims = 2, perplexity = 30, check_duplicates = FALSE)
acp <- prcomp(X)$x[, 1:2]

# Les voisins sur la carte 2D sont-ils du même chiffre ? (k plus proches voisins, leave-one-out)
cat("t-SNE :", round(mean(knn.cv(tsne$Y, y, k = 5) == y), 3), "\n")
cat("ACP   :", round(mean(knn.cv(acp, y, k = 5) == y), 3), "\n")

# Position moyenne de chaque chiffre, puis la carte colorée par chiffre
print(round(rowsum(tsne$Y, y) / as.vector(table(y)), 1))
plot(tsne$Y, col = rainbow(10)[as.integer(y)], pch = 19, cex = 0.5, xlab = "t-SNE 1", ylab = "t-SNE 2")

QUESTIONS FRÉQUENTES

Comment interpréter un graphique t-SNE ?

On lit les voisinages : des points proches se ressemblent dans les données d'origine. La taille des îlots, la distance entre îlots et les axes n'ont pas de sens. Deux îlots éloignés ne sont pas forcément plus différents que deux îlots proches.

Quelle perplexité choisir pour t-SNE ?

La valeur par défaut, 30, convient souvent. On la teste entre 5 et 50 : une structure stable sur plusieurs valeurs est fiable, une structure qui n'apparaît qu'à une seule valeur est suspecte. La perplexité doit rester nettement inférieure au nombre de lignes.

t-SNE ou UMAP ?

UMAP est plus rapide sur les gros volumes, garde en général mieux la structure d'ensemble et sait projeter de nouvelles lignes. t-SNE reste très bon pour séparer finement des groupes locaux. UMAP est devenu le choix par défaut, t-SNE sert de point de comparaison.

LES ALGOS VOISINS

à comparer avant de choisir
le successeur

UMAP

Plus rapide, garde en général mieux la structure d'ensemble et sait placer de nouvelles lignes sur la carte.

Voir la fiche →
le premier réflexe

ACP

Linéaire, rapide et reproductible. Ses axes s'interprètent, mais les groupes se chevauchent souvent en 2D.

Voir la fiche →
l'autre approche non linéaire

Isomap

Suit les distances le long des données. Utile pour une structure continue, moins pour des groupes séparés.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →