Clase 095 — Clustering K-Means: selección de K, MiniBatch
Parte: 1 — Machine Learning Clásico · Fuente: Géron, cap. 9. ⏱️ Duración estimada: 70 min.
🎯 Objetivo
Aplicar K-Means para segmentar datos no etiquetados, elegir el número de clusters K con criterios reproducibles (elbow, silhouette) y escalar el algoritmo con MiniBatchKMeans cuando el dataset no entra cómodo en memoria.
📚 Resultados de aprendizaje
Al finalizar, vas a poder:
- Explicar el algoritmo de Lloyd y por qué
K-Means++mejora la inicialización aleatoria. - Ajustar
KMeansde scikit-learn fijandon_inityrandom_statepara resultados estables. - Elegir
Kcombinando elbow method (inercia vs K) y silhouette score. - Reemplazar
KMeansporMiniBatchKMeansy discutir el trade-off velocidad / calidad. - Diagnosticar por qué K-Means falla sin escalado o frente a clusters no esféricos.
🗺️ Temas
- Clustering no supervisado: planteo del problema.
- Algoritmo de Lloyd: asignación + actualización de centroides.
- Inicialización: random vs
K-Means++; rol den_init. - Inercia (within-cluster sum of squares) como objetivo.
- Selección de K: elbow method, silhouette score, gap statistic (mención).
MiniBatchKMeanspara datasets grandes / streaming.- Limitaciones: clusters no convexos, densidades distintas, sensibilidad al escalado.
📖 Definiciones y características
- K-Means — algoritmo iterativo que parte el espacio de features en
Kregiones de Voronoi minimizando la suma de distancias cuadradas a los centroides. - K-Means++ — esquema de inicialización que elige centroides iniciales separados entre sí; baja la varianza entre corridas y suele converger en menos iteraciones.
- Inertia — suma de distancias cuadradas de cada punto a su centroide asignado (
model.inertia_). Monótona decreciente conK; sirve para el elbow. - Elbow method — graficar
inertia_vsKy elegir elKdonde la curva "se quiebra" (la mejora marginal se aplana). - Silhouette score — métrica en
[-1, 1]que combina cohesión intra-cluster y separación inter-cluster. Más alto = mejor; útil para compararK. - MiniBatchKMeans — variante que actualiza centroides con mini-lotes en vez de pasar por todo
Xen cada iteración. ~5-10× más rápido, inercia levemente peor. - Centroides — vectores
(K, n_features)que representan el "centro" de cada cluster; enKMeanses la media de los puntos asignados. n_init— cantidad de corridas con distintas semillas; scikit-learn se queda con la de menor inercia. Default10(sklearn ≥1.4:"auto").
📂 Dataset / recursos
sklearn.datasets.make_blobs(n_samples=2000, centers=5, cluster_std=0.8, random_state=42)para los ejercicios de exploración.sklearn.datasets.load_digits()(1797 × 64) para el ejercicio deMiniBatchKMeans.- Opcional: dataset
Mall_Customers.csvo cualquier CSV tabular numérico ya escalado.
🧪 Ejercicios
- Generá blobs con 5 centros, ajustá
KMeans(n_clusters=5, n_init=10, random_state=42)y graficá los puntos coloreados por etiqueta junto concluster_centers_. - Para
Kenrange(2, 11), calculáinertia_ysilhouette_score. Graficá ambas curvas y justificá elKelegido. - Repetí el ajuste sin escalar un dataset donde una feature tenga escala 100× mayor que la otra. Compará con
StandardScalerprevio y comentá el cambio en las etiquetas. - Sobre
load_digits(), ajustáKMeans(n_clusters=10)yMiniBatchKMeans(n_clusters=10, batch_size=256). Cronometrá ambos con%timeity compará inercias. - Probá K-Means sobre
make_moons(noise=0.05). Mostrá visualmente por qué falla y proponé qué algoritmo usarías en su lugar (te lo vamos a contestar en la clase 086).
📝 Homework verificable
Entregá un script homework_085.py que:
- Cargue
make_blobsconrandom_state=42, 4 centros reales. - Recorra
K = 2..8y guarde inercia + silhouette en un DataFrame. - Imprima el
Kóptimo según silhouette y genereelbow.png+silhouette.png.
Criterio de aceptación: el script corre sin errores con python homework_085.py, imprime K óptimo = 4, y produce los dos PNG con ejes y título legibles.
⚠️ Errores comunes
- No escalar features — K-Means usa distancia euclídea; una feature en miles domina a otra en décimas. Aplicá
StandardScalersalvo que tengas razón explícita para no hacerlo. - No fijar
n_init(o dejarlo en 1) — una sola corrida puede caer en un mínimo local malo. Mantenén_init >= 10yrandom_statefijo para reproducibilidad. - Elegir
Kmirando solo la inercia — la inercia siempre baja al subirK. Sin elbow visible ni silhouette, el criterio queda arbitrario. - Asumir clusters esféricos — K-Means no sirve para "lunas", anillos o densidades muy distintas; ahí necesitás DBSCAN o GMM.
- Usar
MiniBatchKMeansconbatch_sizemuy chico — la varianza entre updates explota y los centroides oscilan. Mantenelo en256–1024salvo benchmarks específicos.
❓ Preguntas frecuentes
- ¿Elbow o silhouette? Silhouette es más objetivo cuando no hay codo claro; usá ambos y, si discrepan, priorizá silhouette + criterio de negocio.
- ¿Cuántas iteraciones máximas? El default
max_iter=300alcanza casi siempre. Si convergés antes, sklearn corta solo. - ¿K-Means es determinístico? No: depende de la inicialización. Fijá
random_stateyn_initpara resultados reproducibles. - ¿Cuándo usar
MiniBatchKMeans? Cuandon_samples > 10⁵o el dataset llega en streaming. Para datasets chicos, el K-Means clásico es más preciso y suficientemente rápido. - ¿Sirve para detectar outliers? No directamente; los outliers distorsionan los centroides. Para outliers usá DBSCAN o IsolationForest.
🔗 Referencias
- Géron, A. Hands-On Machine Learning (3ra ed.), cap. 9 — sección "K-Means".
- scikit-learn user guide: Clustering — K-Means.
- Arthur, D. & Vassilvitskii, S. (2007). k-means++: The Advantages of Careful Seeding.
- Sculley, D. (2010). Web-Scale K-Means Clustering (paper original de MiniBatchKMeans).
📥 Material descargable
- 📄 Guía explicativa (PDF) — versión imprimible con todo el contenido de la clase.
- 🎞️ Presentación (PPTX) — deck PowerPoint listo para proyectar en clase.
- 🧮 Notebook ejecutable (.ipynb) — abrilo desde el laboratorio del programa o desde Jupyter.