k-means et choix de k, DBSCAN, classification hiérarchique, ACP, t-SNE, détection d’anomalies et évaluation sans étiquettes : le clustering en entretien.
Cliquez sur une question pour dérouler la réponse attendue.
C’est apprendre une structure dans les données sans étiquette. Il n’y a pas de réponse attendue à reproduire : l’algorithme cherche une organisation déjà présente dans les données, et c’est à nous de juger si elle a un sens.
Les trois tâches à nommer :
La conséquence qui change tout, et qu’il faut énoncer d’emblée : sans étiquette, il n’y a pas de bonne réponse à comparer, donc pas de métrique objective. Un modèle supervisé se mesure — 0,84 d’AUC, on sait où l’on est. Un clustering ne se mesure pas ainsi : deux découpages différents peuvent être tous les deux corrects, et le seul juge final est l’utilité pour le métier.
C’est pour cela que ces projets échouent différemment des projets supervisés. Un modèle supervisé échoue en donnant un mauvais score, ce qui se voit. Un clustering échoue en donnant des groupes que personne ne sait interpréter ni utiliser, ce qui ne se voit qu’à la présentation des résultats.
Et la raison pour laquelle on s’y intéresse malgré tout : les données non étiquetées sont abondantes, les étiquettes sont rares et coûteuses. C’est cette asymétrie qui explique l’importance prise par l’apprentissage auto-supervisé, où le modèle fabrique sa propre supervision à partir des données brutes — c’est ce qui a rendu possibles les grands modèles de langage.
L’étiquette, et tout ce qui en découle.
| Supervisé | Non supervisé | |
|---|---|---|
| Données | paires (entrées, réponse) | entrées seules |
| Objectif | prédire la réponse | trouver une structure |
| Évaluation | métrique sur données réservées | indices internes, puis jugement métier |
| Vérité de référence | connue | inexistante |
| Échec typique | mauvais score | groupes ininterprétables |
La différence pratique la plus importante n’est pas l’algorithme, c’est la façon de conclure. En supervisé, la validation croisée tranche : ce modèle est meilleur que celui-là. En non supervisé, on peut produire quatre découpages plausibles et aucun critère mathématique ne dira lequel est le bon — il faut le confronter à un usage.
Les deux régimes intermédiaires à connaître, parce qu’ils sont souvent la vraie réponse en entreprise :
Et le cas à part, à citer pour compléter le tableau : l’apprentissage par renforcement, où il n’y a ni étiquette ni structure à trouver, mais une récompense obtenue en agissant sur un environnement.
Regrouper les observations de façon que celles d’un même groupe se ressemblent davantage entre elles qu’avec celles des autres groupes. La ressemblance est mesurée par une distance, et le choix de cette distance est une décision aussi importante que le choix de l’algorithme.
Les usages réels, à donner en exemples concrets :
Ce qu’il faut ajouter pour montrer qu’on connaît le piège du sujet : un algorithme de clustering renvoie toujours des groupes. Même sur des données uniformément réparties, sans aucune structure, k-means découpera consciencieusement l’espace en k morceaux. L’existence d’un résultat ne prouve donc rien, et la première question à se poser n’est pas « combien de groupes » mais « y a-t-il une structure de groupes dans ces données ».
Et la distinction à faire, si on veut être précis : la plupart des algorithmes produisent une partition stricte — chaque point appartient à un groupe et un seul. D’autres produisent une appartenance graduée, où un point relève de plusieurs groupes avec des probabilités : c’est le cas des mélanges gaussiens, et c’est souvent plus fidèle à la réalité d’un comportement client.
La méthode du coude et le coefficient de silhouette donnent une plage plausible, jamais une valeur. C’est la contrainte d’usage qui tranche, parce qu’aucun critère mathématique ne le fait.
Lire la réponse détailléeElles découlent toutes de ce qu’il optimise : la somme des distances au carré à un centre unique par groupe.
make_moons, et savoir le citer montre qu’on a manipulé le sujet.k-means++ et par plusieurs départs.Ce qu’il faut ajouter, parce que la question invite à jeter l’algorithme et que ce serait une erreur : k-means reste le bon premier essai. Il est linéaire en nombre de points, prévisible, disponible partout, et il fournit une base de comparaison en quelques secondes. On l’essaie, on regarde ce qu’il donne, et on change d’algorithme quand ses hypothèses ne tiennent pas.
Les remplaçants, avec le défaut qu’ils corrigent :
| Limite | Algorithme à préférer |
|---|---|
| formes non convexes | DBSCAN, clustering spectral |
| groupes de tailles inégales | mélange gaussien |
| k inconnu | DBSCAN, hiérarchique |
| bruit et valeurs extrêmes | DBSCAN, k-médoïdes |
| appartenance graduée | mélange gaussien |
Parce que la fonction qu’il minimise n’est pas convexe : elle possède plusieurs minima locaux, et l’alternance affectation-recalcul descend jusqu’au premier atteint sans jamais en ressortir. Deux départs différents mènent donc à deux découpages différents, tous deux stables.
Le cas d’école : deux centres initiaux tombés dans le même vrai groupe. Ils se le partagent, et deux autres vrais groupes se retrouvent fusionnés. L’algorithme converge, l’inertie est stable, et le résultat est faux.
Les deux réponses à donner :
k-means++, qui est le défaut de scikit-learn depuis longtemps. Le premier centre est tiré au hasard, puis chaque centre suivant est tiré avec une probabilité proportionnelle au carré de sa distance aux centres déjà placés. Les centres partent donc écartés les uns des autres, ce qui rend le mauvais cas beaucoup plus rare — avec une garantie théorique sur la qualité obtenue.
Plusieurs départs, et on garde le meilleur au sens de l’inertie :
KMeans(n_clusters=5, init='k-means++', n_init=10, random_state=42)Le n_init fait dix exécutions complètes et retient la meilleure. C’est du calcul en plus, sur un algorithme rapide, donc c’est un très bon échange — et le baisser à 1 pour gagner du temps est une fausse économie.
Ce qu’il faut ajouter pour montrer qu’on va plus loin que le réglage : l’instabilité résiduelle est une information, pas seulement un défaut à corriger. Si dix départs avec k-means++ donnent dix découpages nettement différents, le problème n’est plus l’initialisation — c’est que les données ne contiennent pas k groupes bien séparés. Comparer les découpages obtenus, par indice de Rand ajusté, transforme ce symptôme en diagnostic.
Et la précision qui compte pour la reproductibilité : fixer random_state rend le résultat reproductible, ce qui est indispensable dès qu’un clustering alimente un traitement en aval. Sans cela, les identifiants de groupes changent à chaque exécution — et même avec, les numéros de groupes n’ont aucune signification stable entre deux entraînements. Un groupe se désigne par son contenu, jamais par son numéro.
Oui, presque toujours, et pour une raison mécanique : un clustering repose sur une distance, et une distance additionne des écarts exprimés dans des unités différentes.
L’exemple qui règle la question. Sur une segmentation client avec un âge en années — de 18 à 80 — et un revenu annuel en euros — de 20 000 à 200 000 — un écart de revenu de 10 000 pèse 10 000 dans la distance, un écart d’âge de trente ans pèse 30. Le clustering obtenu est un découpage par tranches de revenu, et l’âge n’a rien décidé. Ce n’est pas un choix, c’est un accident d’unité.
Ce qui s’applique donc à tout ce qui utilise une distance ou une variance : k-means, DBSCAN, classification hiérarchique, ACP, k plus proches voisins.
Les transformations, avec leur cas d’usage :
RobustScaler — médiane et écart interquartile. Le bon choix sur des données à valeurs aberrantes, fréquentes sur des montants.Deux nuances qui font la différence, parce qu’elles montrent qu’on ne suit pas une recette :
Normaliser est un choix de pondération, pas une opération neutre. Standardiser revient à décider que toutes les variables comptent autant. Si le métier estime que le revenu doit compter davantage que l’ancienneté, cela s’exprime en pondérant les variables après normalisation — explicitement, plutôt que par le hasard des unités.
Il y a des cas où il ne faut pas normaliser. Quand les variables sont déjà dans la même unité et que leurs amplitudes relatives portent le sens : des coordonnées géographiques, les canaux d’une image, ou des dépenses par catégorie exprimées en euros. Standardiser colonne par colonne détruirait alors l’information « ce client dépense dix fois plus en une catégorie qu’en une autre ».
Il regroupe par densité plutôt que par distance à un centre : il trouve des formes quelconques, décide lui-même du nombre de groupes et isole le bruit au lieu de le répartir.
Lire la réponse détailléeUne construction emboîtée de groupes, qui produit non pas une partition mais un arbre — le dendrogramme — que l’on coupe ensuite à la hauteur voulue.
La version courante est agglomérative, ascendante : chaque point commence seul, puis on fusionne à chaque étape les deux groupes les plus proches, jusqu’à n’en avoir qu’un. La version descendante, divisive, part du tout et sépare ; elle est beaucoup moins utilisée.
Son intérêt principal, à énoncer d’emblée : on n’a pas à choisir le nombre de groupes avant de voir la structure. On lit l’arbre, on repère les fusions qui se font à grande distance — signe que les groupes réunis étaient réellement distincts — et on coupe là. C’est l’inverse de la démarche k-means, où il faut parier sur k d’abord.
Le paramètre qui compte vraiment est le critère de liaison, c’est-à-dire la définition de la distance entre deux groupes :
| Liaison | Distance entre groupes | Comportement |
|---|---|---|
| minimale | les deux points les plus proches | suit les formes allongées, sujette au chaînage |
| maximale | les deux points les plus éloignés | groupes compacts, sensible aux extrêmes |
| moyenne | moyenne des paires | compromis |
| Ward | hausse d’inertie induite | groupes de tailles proches, le défaut recommandé |
L’effet de chaînage de la liaison minimale mérite une phrase, parce que c’est le piège classique : une passerelle de quelques points entre deux groupes denses suffit à les fusionner, puisqu’il existe un chemin de proche en proche. Ward, qui fusionne les paires dont la réunion augmente le moins l’inertie, est le choix par défaut sur des données tabulaires normalisées.
Les limites, à donner honnêtement : le coût est quadratique en mémoire — il faut la matrice des distances entre toutes les paires — ce qui plafonne l’usage vers quelques dizaines de milliers de points. Et les fusions sont définitives : une erreur commise tôt dans l’arbre ne se corrige jamais.
Ce qui explique une pratique courante en entreprise, et qu’il est bon de citer : sur un gros volume, on lance d’abord un k-means à quelques centaines de groupes, puis une classification hiérarchique sur les centres obtenus. On garde la lisibilité de l’arbre pour un coût compatible avec les données.
Un mélange gaussien modélise les données comme provenant de plusieurs lois normales, et estime pour chaque point la probabilité d’appartenir à chacune. k-means affecte chaque point à un groupe et un seul.
Trois différences qui comptent :
L’appartenance est graduée. Un point situé entre deux groupes reçoit 0,55 et 0,45 au lieu d’être arbitrairement rangé d’un côté. Sur une segmentation client, cela change la nature du livrable : on peut réserver un traitement particulier aux clients ambigus au lieu de les forcer dans une case.
La forme des groupes est libre. k-means impose implicitement des groupes sphériques de même taille. Un mélange gaussien apprend une matrice de covariance par composante, donc des groupes allongés, inclinés, de tailles différentes. Le paramètre covariance_type règle jusqu’où va cette liberté, et le restreindre à spherical redonne à peu près k-means.
Le critère de sélection est statistique. Puisqu’il s’agit d’un modèle probabiliste, on dispose d’une vraisemblance, donc de l’AIC et du BIC pour choisir le nombre de composantes. C’est un critère mieux fondé que le coude de k-means, et le seul de cette famille qui pénalise formellement la complexité.
Le lien à connaître, parce qu’il fait bonne impression : k-means est un cas limite du mélange gaussien. L’algorithme espérance-maximisation qui ajuste le mélange alterne lui aussi deux étapes — estimer les appartenances, puis remettre à jour les paramètres. Avec des covariances sphériques identiques et des appartenances forcées à 0 ou 1, on retrouve exactement k-means. C’est la même mécanique, en version dure contre version souple.
Les contreparties, à donner sans les cacher : plus de paramètres à estimer donc plus de données nécessaires — une covariance complète en vingt dimensions représente deux cent dix paramètres par composante ; une convergence plus lente et toujours vers un minimum local ; et l’hypothèse gaussienne elle-même, qui n’est pas gratuite. Sur des données franchement non gaussiennes, la souplesse annoncée ne se matérialise pas.
Et le cas où le choix est évident : quand la question métier est « à quel point ce client ressemble-t-il au segment premium », il faut une probabilité, donc un mélange gaussien. Quand la question est « dans quel groupe le ranger », k-means suffit et coûte dix fois moins.
Par un indice interne, par la stabilité sur des sous-échantillons, et par l’utilité pour le métier. Les deux premiers écartent les mauvais découpages ; seul le troisième valide le bon.
Lire la réponse détailléePour un point donné, il compare deux distances : sa distance moyenne aux points de son propre groupe, et sa distance moyenne aux points du groupe voisin le plus proche. Le coefficient est la différence des deux, ramenée entre −1 et 1 par la plus grande des deux.
La lecture est directe :
Le score global est la moyenne sur tous les points, et c’est ce nombre qu’on utilise pour comparer des valeurs de k.
Ce qu’il faut savoir ajouter, et qui vaut mieux que la formule : la moyenne cache l’essentiel, il faut regarder le diagramme. Un score global de 0,45 peut correspondre à trois groupes nets à 0,7 et un groupe informe à 0,05 — auquel cas l’action n’est pas de changer k mais d’examiner ce quatrième groupe. Le tracé des silhouettes par groupe, trié, montre en un coup d’œil quels groupes tiennent et lesquels sont douteux.
Les trois limites à connaître :
Et l’ordre de grandeur utile en entretien, parce qu’on demande souvent « qu’est-ce qu’un bon score » : au-delà de 0,5, la structure est nette ; entre 0,25 et 0,5, elle est faible mais peut être exploitable ; en dessous, il n’y a probablement pas de groupes — et il vaut mieux le dire que de livrer une segmentation.
Elle réexprime les données dans de nouveaux axes, orthogonaux, classés par la variance qu’ils portent. Garder les premiers réduit la dimension en conservant l’essentiel de l’information.
Lire la réponse détailléeCela dépend de l’objectif, et c’est la première chose à dire : le nombre de composantes n’est pas une propriété des données, c’est une conséquence de l’usage.
Pour visualiser : deux ou trois, sans discussion. On note simplement la part de variance conservée, parce qu’un graphique qui n’en explique que 18 % ne prouve pas grand-chose.
Pour réduire avant un modèle : on fixe une part de variance à conserver, typiquement 90 ou 95 %, et on laisse le nombre s’en déduire.
# Garde le nombre minimal de composantes couvrant 95 % de la variance.
acp = PCA(n_components=0.95).fit(X_entrainement)
print(acp.n_components_)Pour débruiter : on garde peu de composantes, en assumant que les dernières sont du bruit.
Les critères classiques, à connaître avec leur valeur réelle :
Ce qui distingue une réponse expérimentée : le vrai critère est la performance en aval. Quand l’ACP sert de prétraitement à un modèle supervisé, le nombre de composantes est un hyperparamètre comme un autre, et on le règle par validation croisée sur la métrique finale — pas sur un pourcentage de variance choisi par habitude.
pipeline = make_pipeline(StandardScaler(), PCA(), LogisticRegression())
grille = {'pca__n_components': [5, 10, 20, 40]}Et l’avertissement qui va avec, parce qu’il est contre-intuitif : la variance n’est pas l’information utile. L’ACP ignore la cible ; rien ne garantit que les directions les plus étalées soient celles qui la prédisent. Il arrive qu’une composante mineure porte le signal discriminant, et qu’on l’élimine en gardant 95 % de la variance. Quand la prédiction est l’objectif, une sélection de variables supervisée ou une analyse discriminante linéaire répondent mieux au problème.
L’ACP pour réduire et pour interpréter, t-SNE et UMAP pour visualiser. Les deux derniers ne préservent pas les distances globales : leurs graphiques se regardent, ils ne se mesurent pas.
Lire la réponse détailléeÀ mesure que le nombre de variables augmente, l’espace se vide et les distances perdent leur pouvoir de discrimination. C’est le second point qui compte pour l’apprentissage non supervisé, et c’est celui que la plupart des réponses omettent.
Le phénomène central, à énoncer précisément : en grande dimension, la distance au plus proche voisin et la distance au plus lointain se rapprochent l’une de l’autre. Quand tous les points sont à peu près à la même distance de tous les autres, « le plus proche voisin » ne veut plus rien dire — et tout ce qui repose sur cette notion s’effondre : k-means, DBSCAN, k plus proches voisins, silhouette.
Les autres facettes, plus connues :
Et la nuance qui fait une bonne fin de réponse : la dimension apparente n’est pas la dimension réelle. Une image de mille pixels ne vit pas dans un espace à mille dimensions utiles ; les données réelles se concentrent sur une variété de dimension bien inférieure. C’est l’hypothèse de la variété, et c’est précisément ce qui rend la réduction de dimension possible — et ce qui explique que les modèles profonds fonctionnent malgré cette malédiction.
En modélisant le normal pour mesurer l’écart : densité, isolation, reconstruction ou frontière. La difficulté n’est pas l’algorithme, c’est le seuil et l’absence de vérité pour le régler.
Lire la réponse détailléeElle renverse la logique habituelle : au lieu de modéliser ce qui est normal pour mesurer l’écart, elle mesure la facilité avec laquelle un point s’isole du reste.
Le mécanisme : on construit des arbres en choisissant à chaque nœud une variable au hasard et un seuil au hasard entre son minimum et son maximum, jusqu’à isoler chaque point dans sa propre feuille. Le score d’un point est alors sa profondeur moyenne dans la forêt.
L’intuition qui fait tout comprendre : un point situé loin des autres est séparé du nuage dès les premières coupures aléatoires, parce qu’il occupe une région vide où n’importe quel seuil le détache. Un point au cœur d’une zone dense demande beaucoup de coupures avant d’être seul. Faible profondeur, forte anomalie.
Pourquoi c’est un bon choix par défaut :
Les paramètres qui comptent : contamination, la proportion d’anomalies attendue, qui ne change pas les scores mais le seuil appliqué pour trancher ; et max_samples, la taille des sous-échantillons — que les auteurs recommandent de garder petite, autour de 256, parce qu’un sous-échantillon réduit isole mieux les anomalies qu’un échantillon complet où elles se noient.
detecteur = IsolationForest(contamination=0.01, max_samples=256, random_state=42)
scores = -detecteur.fit(X).score_samples(X) # plus le score est haut, plus c'est atypiqueLes limites à donner honnêtement :
C’est une décision aussi structurante que le choix de l’algorithme, et souvent plus : la distance définit ce que « se ressembler » veut dire pour le problème traité.
L’exemple qui montre l’enjeu, et qu’il vaut la peine de donner : deux clients qui achètent les mêmes catégories dans les mêmes proportions, l’un dépensant dix fois plus que l’autre. En euclidien, ils sont très éloignés — le clustering séparera les gros et les petits budgets. En cosinus, ils sont quasi identiques — le clustering séparera les styles de consommation. Aucune des deux n’est fausse ; ce sont deux segmentations qui répondent à deux questions différentes, et c’est le métier qui dit laquelle il veut.
Deux contraintes pratiques à connaître :
Le problème est réel et fréquent : k-means calcule des moyennes, ce qui n’a aucun sens pour une variable catégorielle. Encoder la catégorie en un-parmi-n puis lancer k-means fonctionne mécaniquement, mais mélange deux géométries — et le résultat est difficile à défendre.
Les quatre approches, de la plus simple à la plus fondée :
Un-parmi-n puis k-means. L’écart entre deux modalités différentes vaut alors racine de deux, quelle que soit la paire. Cela marche à peu près quand les catégories ont peu de modalités et qu’on pondère pour qu’elles ne dominent pas le total. Le piège est là : une variable à vingt modalités devient vingt colonnes, donc pèse vingt fois plus qu’un âge normalisé.
La distance de Gower. Elle calcule une distance adaptée à chaque type — écart normalisé pour le numérique, égalité pour le catégoriel — et en fait une moyenne pondérée. C’est la réponse propre au problème, et elle s’utilise avec une classification hiérarchique ou k-médoïdes, puisque k-means n’accepte pas une matrice de distances.
k-prototypes. Une variante de k-means qui utilise la moyenne pour les variables numériques et le mode pour les catégorielles, avec un paramètre pondérant les deux contributions. Conçue exactement pour ce cas, et elle passe à l’échelle.
Un plongement appris. On réduit d’abord les données mixtes à une représentation dense — auto-encodeur, ou UMAP qui accepte des métriques distinctes par bloc de variables — puis on regroupe dans cet espace. C’est ce qui donne les meilleurs résultats sur des données larges, au prix de l’interprétabilité.
Le point de méthode qui vaut mieux que le choix de l’outil, et qu’il faut poser d’abord : les variables catégorielles doivent-elles vraiment entrer dans le clustering ? Segmenter sur le comportement — variables numériques — puis croiser les groupes obtenus avec les catégories est souvent plus utile et beaucoup plus lisible. On obtient des phrases exploitables du type « le groupe des gros acheteurs réguliers est à 70 % en région parisienne », là où un clustering mixte produit des groupes que personne ne sait décrire.
Et la précaution qui reste vraie dans tous les cas : la pondération entre les blocs numérique et catégoriel est un choix explicite. Si on ne le fait pas, il est fait par le nombre de colonnes que produit l’encodage, ce qui n’est pas une décision.
En partant de la décision que la segmentation doit servir, pas des données disponibles. Le nombre de groupes se déduit de ce que l’équipe peut exécuter, et chaque groupe doit se nommer en une phrase.
Lire la réponse détailléeD’abord distinguer les deux causes possibles, parce qu’elles n’appellent pas la même réponse.
Une différence d’étiquetage seulement. Les groupes sont les mêmes, leurs numéros ont changé. C’est le cas le plus fréquent et ce n’est pas un problème : les identifiants de groupes n’ont aucune signification stable. On le vérifie par un indice de Rand ajusté entre les deux découpages — s’il vaut 0,97, il n’y a rien à corriger, seulement une numérotation à ne jamais utiliser comme référence durable.
Une différence réelle de découpage. Les frontières ne sont pas au même endroit. Là il y a quelque chose à comprendre.
Les causes, dans l’ordre de fréquence :
k-means++ et plusieurs départs — n_init=10 — ce qui règle la plupart des cas.La phrase qui montre la maturité : l’instabilité n’est pas seulement un défaut à masquer, c’est un critère de validation. On peut la mesurer volontairement — refaire le clustering sur des sous-échantillons et comparer les découpages par indice de Rand ajusté — puis choisir le k qui donne les résultats les plus reproductibles. C’est la sélection par stabilité, et elle est souvent plus fiable que le coude ou la silhouette.
scores = []
for germe in range(20):
echantillon = rng.choice(len(X), size=int(0.8 * len(X)), replace=False)
scores.append(KMeans(k, random_state=germe).fit_predict(X[echantillon]))
# puis comparer les paires de decoupages sur leurs points communsEt les deux mesures d’hygiène qui vont avec, indispensables dès qu’un clustering alimente un traitement en aval : fixer le germe pour la reproductibilité, et désigner les groupes par leur contenu — un profil, un nom métier — jamais par leur numéro. Le jour où le modèle est réentraîné, les numéros changent, et tout code qui s’appuyait sur « le groupe 3 » devient faux sans erreur visible.
Ce n’est presque jamais un défaut de l’algorithme : c’est un symptôme, et il faut le lire avant de changer quoi que ce soit. Les causes, dans l’ordre où on les vérifie.
Des variables non normalisées ou très asymétriques. La cause la plus fréquente. Sur des montants ou des fréquences à longue queue, quelques valeurs énormes s’écartent tellement du reste que l’algorithme dépense ses groupes à les isoler — parfois un groupe pour trois clients — et laisse tout le monde ensemble dans le dernier. Le remède est en amont : passage au logarithme, puis standardisation, ou RobustScaler.
Des valeurs aberrantes. Même mécanisme en plus concentré : un seul point à 1000 fois l’échelle habituelle capte un groupe entier. On les traite avant, en les écartant ou en les bornant, et on les examine — ce sont souvent des erreurs de saisie ou des comptes techniques, pas des clients.
Une seule variable qui domine. Si une colonne a une variance très supérieure aux autres après normalisation — parce que sa distribution est bimodale, par exemple — elle décide seule du découpage. On le vérifie en profilant les groupes : si un seul écart explique tout, on a la réponse.
Une structure réellement déséquilibrée. C’est parfois la bonne réponse : la clientèle est peut-être composée d’une masse homogène et de quelques niches. Dans ce cas, la conclusion n’est pas de forcer l’équilibre mais de reconnaître que k-means est le mauvais outil, puisqu’il favorise les groupes de tailles comparables.
Un k mal choisi, ou une distance inadaptée — l’euclidienne quand seule la direction compte.
Deux voies, selon ce que le diagnostic a montré :
Et le réflexe qui doit venir avant tout : regarder les points du gros groupe. Combien sont-ils, à quoi ressemblent-ils, et le métier les reconnaît-il comme un ensemble ? La réponse à cette question tranche entre « défaut de préparation » et « réalité de la clientèle » plus sûrement que n’importe quel indice.
C’est apprendre à partir de quelques exemples étiquetés et de beaucoup d’exemples sans étiquette. C’est la situation réelle de la plupart des projets : des millions de lignes en base, et deux cents cas qu’un expert a pris le temps de qualifier.
Les méthodes, par ordre de simplicité :
L’auto-apprentissage (self-training). On entraîne un modèle sur les exemples étiquetés, on lui fait prédire les autres, on ajoute à l’entraînement ceux dont il est le plus sûr, et on recommence. Simple et efficace, avec un danger évident : les erreurs se renforcent. Une prédiction fausse mais confiante devient une étiquette, que le modèle suivant apprend comme une vérité. On s’en protège par un seuil de confiance élevé et un nombre limité d’itérations.
Le co-apprentissage (co-training). Deux modèles voient deux ensembles de variables différents et s’étiquettent mutuellement les exemples. La diversité des points de vue limite le renforcement des erreurs.
La propagation d’étiquettes sur un graphe de voisinage : une étiquette se diffuse aux points proches. C’est l’usage direct de l’hypothèse fondatrice du domaine.
La pré-formation non supervisée. On apprend une représentation sur toutes les données — auto-encodeur, apprentissage contrastif — puis on entraîne un petit modèle supervisé sur cette représentation avec les quelques étiquettes disponibles. C’est l’approche moderne, et de loin la plus efficace.
L’hypothèse à énoncer, parce qu’elle conditionne tout : les données non étiquetées ne servent que si les classes sont séparées par des zones de faible densité. Autrement dit, les points proches doivent partager la même étiquette, et la frontière doit passer dans le vide. Quand cette hypothèse est fausse, ajouter des données non étiquetées dégrade le modèle — ce n’est pas une méthode gratuite, et le savoir distingue une réponse solide.
Et l’alternative à toujours mettre dans la balance : l’apprentissage actif. Plutôt que de deviner les étiquettes manquantes, on demande à l’expert d’étiqueter les exemples les plus informatifs — ceux dont le modèle est le moins sûr. Deux cents étiquettes bien choisies valent souvent mieux que dix mille prises au hasard, et c’est le meilleur usage du temps rare d’un expert.
C’est fabriquer la supervision à partir des données elles-mêmes, sans étiquette humaine. On cache une partie de l’entrée et on demande au modèle de la reconstruire : la donnée cachée est la réponse attendue, donc l’entraînement est techniquement supervisé, mais personne n’a rien annoté.
Les tâches prétextes, par domaine :
Ce qu’il faut dire de son importance, parce que c’est l’enjeu de la question : c’est ce qui a rendu possibles les grands modèles. Le texte du web n’est pas étiqueté, et l’étiqueter serait hors de portée ; en revanche, chaque phrase contient sa propre supervision, puisque le mot suivant est déjà écrit. L’auto-supervision est ce qui a permis de convertir un volume de données sans étiquette en capacité d’apprentissage — c’est un déverrouillage d’échelle avant d’être une technique.
Comment on l’utilise en pratique, et c’est la partie utile en entretien : on entraîne — ou plus souvent on reprend — un modèle pré-entraîné sur une tâche prétexte, puis on l’adapte à la tâche réelle avec les quelques étiquettes qu’on possède. Un classifieur d’images entraîné sur mille exemples à partir d’un modèle pré-entraîné bat très largement le même classifieur entraîné de zéro. Le pré-entraînement a appris ce que sont des contours, des textures, des objets ; il ne reste qu’à apprendre les catégories du problème.
La place à lui donner par rapport aux voisins : le non supervisé classique cherche une structure lisible — des groupes, des axes ; l’auto-supervisé cherche une représentation utile pour d’autres tâches. Les deux se passent d’étiquettes, mais le premier produit un résultat qu’on regarde, le second un point de départ qu’on réutilise.
Et le lien avec la question précédente, qui montre qu’on relie les concepts : l’auto-supervision est devenue la meilleure façon de faire du semi-supervisé. Pré-entraîner sur tout le corpus disponible, puis affiner sur les deux cents exemples étiquetés, surpasse presque toujours les méthodes classiques de propagation d’étiquettes.
À trouver des cooccurrences fréquentes dans des ensembles : « les clients qui achètent A et B achètent souvent C ». C’est l’analyse du panier d’achat, et on la retrouve dans les rayonnages, les recommandations et l’analyse de parcours.
Les trois mesures à savoir définir, parce que c’est exactement ce qu’on vérifie :
Le piège de la question, et il faut le donner soi-même : une confiance élevée peut ne rien signifier. Si 80 % des paniers contiennent du pain, alors toute règle « X implique pain » affiche 80 % de confiance sans qu’aucun lien n’existe. Le lift vaut alors 1, et il révèle l’absence de relation que la confiance masquait. Un lift supérieur à 1 indique une association réelle, inférieur à 1 une répulsion — deux produits substituables, par exemple, ce qui est une information commerciale à part entière.
Les algorithmes : Apriori, qui exploite le fait qu’un ensemble fréquent a tous ses sous-ensembles fréquents pour élaguer la recherche, et FP-Growth, plus rapide, qui évite les passages répétés sur les données. Le nommer suffit ; ce qu’on attend est la compréhension des mesures.
Les limites à énoncer :
Et l’usage qui reste imbattable : les règles d’association sont lisibles. Une règle s’écrit en une phrase qu’un responsable de rayon comprend et peut appliquer demain, ce qu’aucun système de recommandation par facteurs latents ne permet.
Oui, de trois façons, et c’est un usage souvent plus rentable que la segmentation présentée comme un livrable en soi.
Comme variable. Le numéro de groupe, encodé en un-parmi-n, devient une colonne du modèle supervisé. Cela peut apporter une information d’interaction que le modèle aurait mis du temps à reconstruire — mais l’apport est faible sur un gradient boosting, qui trouve ces combinaisons par lui-même. Le gain réel se voit surtout sur un modèle linéaire, à qui le clustering offre une non-linéarité qu’il ne peut pas exprimer.
Comme distances aux centres. Souvent meilleur que le numéro de groupe : on ajoute k colonnes contenant la distance du point à chaque centre. L’information est continue au lieu d’être une case, donc bien plus riche, et cela ressemble à ce que fait un noyau à base radiale.
Comme découpage du problème. Un modèle par groupe, plutôt qu’un modèle unique avec le groupe en variable. C’est justifié quand les mécanismes diffèrent réellement d’un segment à l’autre — les facteurs de résiliation d’un client professionnel n’ont rien à voir avec ceux d’un particulier. Le prix est mécanique : chaque modèle voit moins de données, et il faut en maintenir plusieurs.
Les deux précautions à donner, sans quoi la réponse est incomplète :
Le clustering fait partie du pipeline. Il doit être ajusté sur l’entraînement seul, à l’intérieur de chaque bloc de validation croisée. Un k-means ajusté sur tout le jeu avant le découpage laisse fuiter la structure du test — c’est une fuite de données de manuel, et elle passe souvent inaperçue parce qu’aucune étiquette n’est en jeu.
pipeline = make_pipeline(
StandardScaler(),
KMeans(n_clusters=8, n_init=10, random_state=42), # transforme en distances aux centres
HistGradientBoostingClassifier(),
)Il faut mesurer l’apport, pas le supposer. On compare la métrique avec et sans, en validation croisée. Dans une bonne part des cas, l’apport est nul — et alors il faut retirer l’étape, parce qu’un clustering en production est une chose de plus à surveiller, à réentraîner et à faire dériver.
Et l’usage inverse, qui mérite d’être cité parce qu’il est moins connu : un modèle supervisé peut servir à valider un clustering. Si les groupes prédisent une variable qui n’a pas servi à les construire, la structure trouvée porte une information réelle.
La question est moins banale qu’elle en a l’air, parce qu’un clustering n’a pas de vérité à comparer : on ne peut donc pas surveiller sa performance comme celle d’un modèle supervisé.
Affecter un nouveau point. Tous les algorithmes ne le permettent pas, et c’est le premier critère de choix quand la production est prévue :
predict immédiat et peu coûteux ;Figer la chaîne complète. Le clustering seul ne suffit pas : la normalisation, les transformations logarithmiques, l’imputation et la réduction de dimension doivent être sérialisées avec lui. Un pipeline unique, versionné, appliqué à l’identique à l’entraînement et au service.
Stabiliser les identifiants. C’est le piège propre au sujet. Les numéros de groupes changent à chaque réentraînement : le groupe 3 d’hier n’est pas le groupe 3 d’aujourd’hui. Tout ce qui vit en aval — règles métier, tableaux de bord, campagnes — casse silencieusement. On y répond en rattachant les nouveaux groupes aux anciens par proximité de leurs centres, et en conservant un nom métier stable plutôt qu’un indice.
Décider de la fréquence de recalcul, et l’assumer : un recalcul fréquent suit le monde mais fait basculer les clients de groupe en groupe, ce qui rend toute action de long terme incohérente. Un recalcul rare est stable et se périme. Le compromis se décide avec le métier, pas dans le code.
Surveiller, faute de métrique. Ce qu’on peut suivre sans vérité de référence :
Et le point de méthode à donner en conclusion, parce qu’il évite les mauvaises surprises : le clustering doit être recalculé, jamais mis à jour en continu. Ajouter des points à un k-means existant fait dériver les centres sans que personne ne l’ait décidé, et les groupes de la fin du mois ne sont plus ceux du début. Un réentraînement daté, validé, puis déployé explicitement, vaut mieux qu’une adaptation permanente et invisible.
Question de jugement, et c’est souvent celle qui départage deux candidats de niveau technique équivalent. Les cas où il faut savoir dire non :
Quand les données n’ont pas de structure de groupes. Un algorithme renvoie toujours des groupes, y compris sur un nuage parfaitement homogène. Segmenter un continuum, c’est poser des frontières arbitraires et les présenter comme une découverte. Un indice interne très faible, ou une instabilité forte entre sous-échantillons, doit conduire à conclure qu’il n’y a rien à segmenter — et le dire est une conclusion utile, pas un échec.
Quand la question est en fait supervisée. « Trouvez-moi les clients qui vont résilier » n’est pas un problème de clustering : c’est une prédiction, et si des cas passés existent, un modèle supervisé y répondra infiniment mieux. Un clustering ne connaît pas la cible, donc rien ne garantit que ses groupes aient un rapport avec elle. Reformuler la demande est ici la vraie valeur ajoutée.
Quand des segments métier existent déjà et fonctionnent. Une découpe simple — par gamme, par pays, par taille de compte — est comprise de tous, stable, alignée sur l’organisation. Un clustering qui la remplacerait par des groupes que personne ne sait nommer perdra face à elle, quelle que soit sa qualité géométrique.
Quand aucune action ne dépend du résultat. Si les groupes ne changent aucune décision — même message, même prix, même parcours — le livrable est une jolie figure. La question à poser d’emblée : que ferez-vous différemment par groupe ?
Quand les variables ne sont pas actionnables. Segmenter sur des caractéristiques qu’on ne peut ni influencer ni utiliser produit une description, pas un levier.
Quand la dimension est trop grande et le volume trop faible. Trois cents lignes et cinquante colonnes : les distances ne discriminent plus, et tout découpage obtenu sera un artefact.
Quand le résultat ne sera pas maintenu. Une segmentation vit : recalcul, suivi des migrations, mise à jour des campagnes. Livrée à une équipe qui n’a pas ces moyens, elle sera périmée dans six mois sans que personne ne le remarque — et les décisions continueront de s’appuyer sur elle.
La formulation qui conclut, et qui vaut pour tout le domaine : le clustering est un outil d’exploration, rarement un livrable en soi. Il est excellent pour comprendre un jeu de données qu’on découvre, formuler des hypothèses et préparer des variables. Le présenter comme un produit fini, sans usage ni destinataire, est la façon la plus commune de perdre trois semaines.
04Comment fonctionne l’algorithme k-means ?Juniorkmeansclustering
Par une alternance de deux étapes, répétée jusqu’à stabilisation :
Ce qu’il faut savoir dire sur ce que l’algorithme optimise, parce que c’est ce qui explique tous ses comportements : il minimise l’inertie, c’est-à-dire la somme des distances au carré entre chaque point et le centre de son groupe. Chacune des deux étapes fait baisser cette quantité, donc l’algorithme converge toujours — mais vers un minimum local, pas nécessairement le meilleur découpage possible.
Les conséquences directes de cette fonction de coût, et c’est là qu’un candidat se distingue :
Le coût, si on le demande : linéaire en nombre de points, en dimensions et en itérations, ce qui en fait le seul algorithme de cette famille réellement confortable sur des millions de lignes. C’est la raison principale de sa popularité, plus que sa qualité.