Accueil / Factory / Algos ML / Mini-batch K-means — factory / algos ML / apprentissage non supervisé

MINI-BATCH K-MEANS.

La version de K-means qui met à jour ses centres à partir de petits paquets de lignes tirés au hasard, au lieu de relire toute la base à chaque tour. Sur des millions de clients, elle va bien plus vite et peut même apprendre à partir d'un fichier lu morceau par morceau, pour des groupes très proches de ceux de K-means.

ClusteringGros volumesSegmentation clientNon superviséNiveau : intermédiaire

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceGroupes très proches de K-means, légèrement moins compacts
InterprétabilitéChaque segment se résume à un profil moyen
VitesseConçu pour les millions de lignes et les flux
Facilité de réglageLe nombre de groupes k et la taille des paquets à choisir
Tolérance aux données brutesStandardisation obligatoire, sensible aux extrêmes
EN 30 SECONDES

Pour placer 4 points de rendez-vous dans une ville, inutile d'interroger tous les habitants à chaque ajustement. On interroge quelques centaines de passants, on déplace un peu les points, et on recommence avec d'autres passants.

1. On place k centres de départ

Comme K-means, souvent par tirage espacé (k-means++), sur un échantillon de la base.

2. On tire un paquet de lignes

À chaque itération, quelques centaines de clients seulement. Chacun est rattaché au centre le plus proche.

3. On déplace légèrement les centres

Chaque centre se rapproche des clients du paquet qui lui sont rattachés, d'un pas qui diminue à mesure qu'il a déjà vu beaucoup de clients. On enchaîne les paquets jusqu'à stabilité.

LE CAS MÉTIER

segmentation à grande échelle · retail / télécom / banque
EN ENTRÉE

Une base clients trop grosse pour la mémoire

Panier moyen, achats par mois, jours depuis le dernier achat, nombre de catégories, part d'achats en promotion. Ici 2 000 clients pour l'exemple ; en réalité des millions, stockés dans un fichier ou une base.

EN SORTIE

Les mêmes segments, calculés par paquets

Le code Python lit le fichier par morceaux de 500 lignes et met à jour les centres à chaque morceau. Les 4 segments obtenus sont quasi identiques à ceux d'un K-means classique : accord (ARI) de 0,993 sur 1.

CE QU'ON MESURE

L'accord avec K-means et le temps de calcul

L'indice de Rand ajusté (ARI) compare deux segmentations : 1 si elles sont identiques, 0 si l'accord est dû au hasard. On vérifie une fois sur un échantillon que le mini-batch rejoint K-means, puis on profite du gain de temps sur la base entière.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Des centaines de milliers à des millions de lignes
  • Données qui ne tiennent pas en mémoire, lues par morceaux (partial_fit)
  • Segmentation à recalculer souvent, par exemple chaque nuit
  • Flux de données où les centres doivent suivre l'évolution des comportements

NON

  • Quelques milliers de lignes : K-means classique est instantané et un peu plus précis
  • Groupes de formes irrégulières ou bruit à isoler : DBSCAN ou HDBSCAN
  • Données mixtes chiffres et catégories : K-prototypes
  • Besoin de probabilités d'appartenance : mélange gaussien
LES 4 RÉGLAGES QUI COMPTENT

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

clusters / n_clusters

Le nombre de groupes k. On le choisit sur un échantillon, par la méthode du coude ou la silhouette, comme pour K-means.

batch_size

Le nombre de lignes par paquet, 1 024 par défaut dans scikit-learn, 10 dans ClusterR. Des paquets plus grands donnent des centres plus stables ; quelques centaines à quelques milliers est un bon compromis.

num_init / n_init

Le nombre de départs différents, pour ne pas rester bloqué sur une mauvaise solution. En mode flux avec partial_fit, il n'y a qu'un départ : les premiers paquets comptent beaucoup.

Standardisation

Obligatoire, comme pour K-means. En flux, on apprend moyennes et écarts-types sur un échantillon représentatif, puis on les applique à chaque paquet.

LE CODE MINIMAL

jeu d'exemple : clients_segmentation.csv ↓
# Segmentation clients par paquets : Mini-batch K-means en R
library(ClusterR)

clients <- read.csv("clients_segmentation.csv")
variables <- c("panier_moyen", "achats_par_mois", "recence_jours", "nb_categories", "part_promo")
X <- scale(clients[, variables])

# Chaque itération ne regarde qu'un paquet de 256 clients tirés au hasard
modele <- MiniBatchKmeans(X, clusters = 4, batch_size = 256, num_init = 10, max_iters = 100,
                          initializer = "kmeans++", seed = 42)
clients$segment <- as.vector(predict_MBatchKMeans(X, modele$centroids))

# Comparaison avec un K-means classique sur toute la base
set.seed(42)
km <- kmeans(X, centers = 4, nstart = 10)
print(table(mini_batch = clients$segment, kmeans = km$cluster))

# Profil moyen de chaque segment, en unités d'origine
print(round(aggregate(clients[, variables], by = list(segment = clients$segment), FUN = mean), 2))

QUESTIONS FRÉQUENTES

Quelle différence entre K-means et Mini-batch K-means ?

K-means recalcule les centres à partir de toute la base à chaque itération. Mini-batch K-means les met à jour à partir de petits paquets tirés au hasard. Il est beaucoup plus rapide sur de gros volumes, pour des groupes légèrement moins compacts.

Mini-batch K-means donne-t-il les mêmes groupes que K-means ?

Très proches en général, mais pas identiques : les centres se stabilisent autour de la même solution avec un peu de bruit. Sur le jeu d'exemple, l'accord mesuré par l'ARI est de 0,993. On le vérifie sur un échantillon avant de passer à la base entière.

Comment segmenter une base qui ne tient pas en mémoire ?

Avec partial_fit dans scikit-learn : on lit le fichier par morceaux, par exemple avec l'option chunksize de pandas, et on met à jour le modèle morceau par morceau. La standardisation est apprise au préalable sur un échantillon.

LES ALGOS VOISINS

à comparer avant de choisir
la version exacte

K-means

Relit toute la base à chaque tour. Un peu plus précis, parfait jusqu'à quelques centaines de milliers de lignes.

Voir la fiche →
l'autre option grand volume

BIRCH

Résume la base en une passe dans un arbre de micro-groupes, puis les regroupe. Adapté aux flux et aux très grandes bases.

Voir la fiche →
à l'opposé

K-medoids (PAM)

Des centres qui sont de vrais clients. Plus robuste, mais réservé aux bases de taille modeste.

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 →