lección 6
No supervisado: agrupar cuando no hay respuestas
Agrupar sin etiquetas con k-means, y la idea que más confunde: sin respuesta correcta, qué significa que un modelo sea bueno.
⏱ 50 min
Durante todo este camino has tenido una muleta en la que apoyarte, aunque no la vieras: la respuesta correcta. Cada vez que entrenabas un modelo, había una etiqueta esperándote, una verdad contra la que comparar. Si el modelo decía "se va" y el cliente se había quedado, sabías que había fallado. Esa muleta era un lujo, y ahora vamos a quitártela. Entramos en la región del mapa que no tiene etiquetas: el aprendizaje no supervisado. Aquí nadie ha puesto la respuesta correcta al lado de cada caso, porque en estos problemas no existe una respuesta correcta de antemano. Y eso, que suena a desventaja, abre una pregunta nueva y fascinante: ¿se puede aprender algo útil de unos datos cuando nadie te dice qué buscar?
Ya sabes del mapa que el no supervisado va de hacer emerger una estructura, y que su ejemplo clásico es agrupar clientes parecidos sin conocer de antemano los grupos. Toca hacerlo de verdad. Vas a conocer el método más usado para esto, k-means, vas a ver cómo funciona por dentro con una imagen que no se te va a olvidar, y vas a enfrentarte a la consecuencia más difícil de digerir de todo el territorio: cuando no hay una respuesta correcta, la pregunta "¿cuánto acierta?" deja de tener sentido, y "bueno" pasa a significar otra cosa. Entender ese cambio es la clave de esta región entera.
## El problema: grupos que nadie marcó
Pon que una empresa te da una tabla con sus clientes, y de cada uno sabes dos cosas: cuánto gasta al mes y con qué frecuencia compra. Nada más. En particular, nadie ha escrito a qué "tipo" pertenece cada cliente, entre otras cosas porque la empresa no tiene definidos esos tipos: no sabe si sus clientes se agrupan en dos clases, en cinco o en ninguna. Lo que te piden es que, mirando los parecidos y las diferencias entre los clientes, salgan solos unos grupos de clientes que se comportan de forma parecida entre sí y distinta del resto. Nadie te da los grupos: tienes que hacerlos emerger de los datos.
Fíjate en que este problema no tiene respuesta correcta en el mismo sentido que tenían los anteriores. En clasificación, un cliente "era" spam o no lo era, y había una verdad. Aquí, ¿cuál es el "grupo verdadero" de un cliente? No existe tal cosa de antemano: los grupos son algo que vamos a construir, no algo que estuviera escondido esperando a ser descubierto con una única solución. Dos personas razonables podrían agrupar a los mismos clientes de formas algo distintas, y ninguna estaría "equivocada" en el sentido en que lo estaría quien clasifica mal un spam. Esta ausencia de verdad única es lo que define el territorio, y lo que hace que medir la calidad sea tan distinto.
Que no haya una verdad única no significa, cuidado, que cualquier agrupamiento valga lo mismo. Hay agrupamientos claramente mejores que otros: separar a los clientes en grupos donde los de dentro se parecen mucho entre sí y se diferencian bien de los de otros grupos es mejor que repartirlos al azar. Lo que ocurre es que "mejor" aquí no se mide comparando con una respuesta correcta, porque no la hay, sino con otros criterios que veremos. La ausencia de verdad única abre un abanico de agrupamientos razonables, pero fuera de ese abanico sigue habiendo agrupamientos malos. No es que todo valga; es que no hay un único que valga.
## K-means: un baile de ida y vuelta
El método más usado para hacer emerger grupos se llama k-means, y su funcionamiento es tan elegante que se puede contar como un baile. La "k" del nombre es el número de grupos que le pides que forme, un número que decides tú de antemano (si le pides tres, hará tres). Y "means" es "medias" en inglés, porque el método gira alrededor de unos puntos centrales, uno por grupo, que son como el centro de gravedad de cada grupo. A esos puntos centrales se les llama centroides, y son el corazón de todo. Un centroide es, intuitivamente, el cliente promedio de su grupo: el punto que está en el centro de todos los clientes que pertenecen a él.
El baile empieza colocando los centroides en cualquier sitio, al azar. A partir de ahí, se repiten dos pasos una y otra vez, en un vaivén que da nombre al baile. Primer paso, el de ida: cada cliente mira cuál de los centroides tiene más cerca y se apunta a su grupo. Es como si cada persona en una fiesta se acercara al grupito que le queda más próximo. Segundo paso, el de vuelta: ahora que cada grupo tiene sus miembros, cada centroide se recoloca en el centro exacto de los clientes que se le han apuntado. El punto central se muda al medio de su gente. Y entonces se vuelve a empezar: con los centroides en su nuevo sitio, puede que algún cliente tenga ahora más cerca otro centroide distinto, así que se cambia de grupo, y los centroides vuelven a recolocarse.
Ese ir y venir (asignar cada cliente al centroide más cercano, recolocar cada centroide en el centro de su gente) se repite hasta que ya nadie se mueve: llega un momento en que ningún cliente cambia de grupo y, por tanto, ningún centroide se desplaza. En ese punto el baile ha terminado, el método ha convergido, y los grupos que han quedado son el resultado. Es un proceso iterativo precioso justamente porque no necesita que nadie le diga dónde están los grupos: los encuentra solo, a base de acercarse y recolocarse hasta que todo encaja. Nadie puso las respuestas; la estructura emergió del vaivén.
La idea detrás de este baile tiene ya décadas: se formalizó a mediados del siglo pasado, mucho antes de que existiera el aprendizaje automático tal como lo conocemos, en el mundo del procesamiento de señales y la estadística. Ha sobrevivido tanto tiempo por la misma razón que el árbol de decisión: por su sencillez. Es fácil de explicar, fácil de programar, rápido de ejecutar incluso con muchísimos casos, y da resultados que una persona puede entender. No es el método de agrupamiento más sofisticado ni el que mejor funciona en todas las situaciones (tiene limitaciones, como que tiende a formar grupos de tamaño parecido y de forma redondeada), pero sigue siendo el primero que casi todo el mundo prueba, porque cuando funciona, funciona de forma clara y comprensible.
Conviene nombrar una limitación suya que importa en la práctica, para que no te lleve a conclusiones falsas. K-means mide la cercanía entre clientes con las distancias de las variables tal cual vienen, así que si una variable tiene números mucho más grandes que otra (el gasto en euros, que llega a cientos, frente a la frecuencia, que son unas pocas compras), esa variable grande domina el cálculo y manda sobre el agrupamiento casi sola. La frecuencia, con sus números pequeños, apenas cuenta. Por eso en la práctica los datos se suelen poner en una escala comparable antes de agrupar, para que todas las variables pesen de forma parecida. No vamos a entrar aquí en cómo se hace esa preparación, pero quédate con que k-means es sensible a la escala de las variables, y que ignorarlo lleva a grupos dominados por la variable de números más grandes.
## K-means en código
Ponerlo en marcha es, de nuevo, sorprendentemente breve, y usa un verbo que ya conoces en una variante nueva. Como aquí no hay etiqueta que predecir, no hay una y: solo le pasas las entradas, los datos de los clientes, y le pides que agrupe. El resultado no es una predicción de una etiqueta que existía, sino la asignación de cada cliente a uno de los grupos que han emergido. Vamos a agrupar clientes por su gasto y su frecuencia de compra, pidiéndole tres grupos, y a mirar cuántos clientes ha caído en cada uno.
1import numpy as np2import pandas as pd3from sklearn.cluster import KMeans4import collections56# Clientes: gasto mensual y frecuencia de compra. SIN etiquetas.7rng = np.random.default_rng(42)8g1 = np.column_stack([rng.normal(30, 8, 60), rng.normal(2, 0.6, 60)])9g2 = np.column_stack([rng.normal(120, 15, 60), rng.normal(8, 1.2, 60)])10g3 = np.column_stack([rng.normal(60, 10, 60), rng.normal(12, 1.5, 60)])11X = np.vstack([g1, g2, g3]) # 180 clientes, sin ninguna etiqueta1213# Pedir 3 grupos. n_init=10 y random_state fijan el resultado.14km = KMeans(n_clusters=3, random_state=42, n_init=10)15grupos = km.fit_predict(X)1617# ¿Cuantos clientes han caido en cada grupo?18tam = collections.Counter(grupos.tolist())19print("Tamano de cada grupo:", sorted(tam.values()))
Agrupar 180 clientes en 3 grupos con k-means, sin ninguna etiqueta
El detalle que no se puede olvidar al usar k-means: fija siempre n_init de forma explícita y pon un random_state. El baile empieza colocando los centroides al azar, y según dónde caigan al principio puede terminar en grupos ligeramente distintos. Por eso k-means se ejecuta varias veces desde puntos de partida distintos (eso es n_init) y se queda con el mejor resultado, y por eso se fija el azar (random_state) para que sea reproducible. Si no lo haces, dos ejecuciones del mismo código pueden darte grupos distintos, y un resultado que cambia cada vez que lo corres no sirve para decidir nada.
## La pregunta incómoda: ¿y esto es bueno?
Ahora llega el momento que define el territorio, y conviene afrontarlo despacio. Tienes tus tres grupos. ¿Son buenos? ¿Cuánto acierta k-means? Y aquí es donde choca de frente con la muleta que te quité al principio: no hay respuesta correcta contra la que comparar. Nadie puso la etiqueta "grupo verdadero" a cada cliente, así que no se puede contar cuántos ha "acertado" el modelo, porque no había nada que acertar. La pregunta "¿cuánto acierta?", que era natural y legítima en todo el territorio supervisado, aquí simplemente no se puede responder. No es que sea difícil de calcular: es que no significa nada.
Entonces, si no se puede medir el acierto, ¿cómo sabemos si un agrupamiento es bueno? La respuesta tiene dos niveles, y los dos importan. El primero es técnico y modesto: k-means intenta que los clientes de cada grupo estén lo más cerca posible de su centroide, es decir, que los grupos sean compactos, apretados. Hay una medida de eso, de cuánto se separan los clientes de su centro, y cuanto más pequeña, más compactos son los grupos. Pero ojo, porque esta medida tiene una trampa que verás pronto: siempre mejora si pides más grupos, hasta el absurdo de un grupo por cliente. Así que no sirve, por sí sola, para decir si el agrupamiento es bueno; solo dice cómo de apretados quedaron.
El segundo nivel es el que de verdad importa, y es sorprendentemente poco técnico: un agrupamiento es bueno si los grupos significan algo para quien tiene que usarlos. Si k-means te separa a los clientes en tres grupos y, al mirarlos, uno resulta ser "gente que gasta poco y compra poco", otro "gente que gasta mucho de vez en cuando" y otro "gente que compra muchísimo y barato", entonces el agrupamiento es útil, porque le puedes poner nombre a cada grupo y hacer algo distinto con cada uno. Si, en cambio, los tres grupos son una mezcla que no se deja describir con palabras, el agrupamiento no sirve, por muy compactos que sean sus números. En el no supervisado, "bueno" quiere decir, sobre todo, "interpretable y útil", no "acierta".
Consejo de senior: cuando entregues un agrupamiento, no lo entregues nunca como números de grupo pelados ("grupo 0, grupo 1, grupo 2"). Esos números no significan nada para quien los recibe. Entrégalo siempre con una descripción de cada grupo en el lenguaje del negocio: "el grupo 0 son clientes nuevos que gastan poco; el grupo 1, clientes fieles de alto valor; el grupo 2, cazadores de ofertas". Ese salto, de un número a un nombre con sentido, es donde está casi todo el valor del trabajo no supervisado, y es trabajo humano que el algoritmo no hace por ti. Un agrupamiento sin interpretar es materia prima, no un resultado.
## Lo que te llevas, y lo que falta
Has cruzado a la región sin etiquetas y has agrupado clientes con k-means, que coloca unos puntos centrales llamados centroides y repite un baile de dos pasos (cada cliente al centroide más cercano, cada centroide al centro de su gente) hasta que nadie se mueve. Has visto que, al no haber etiquetas, no se le pasa ninguna y, y que no hay un "cuánto acierta" porque no hay respuesta correcta. Y has entendido la idea más importante del territorio: aquí "bueno" significa que los grupos se pueden interpretar y usar, no que coincidan con una verdad que no existe. Has fijado, además, dos detalles que evitan que el resultado cambie cada vez que lo corres.
Pero quedan dos preguntas sin responder, y son justamente las que deciden si un agrupamiento sirve de algo en la práctica. La primera: ¿cuántos grupos pedir? Hemos pedido tres a dedo, pero ¿y si fueran dos, o cinco? La segunda, la de verdad importante: una vez tienes los grupos, ¿qué significan? Porque un grupo sin interpretación es un número inútil, como acabas de ver en el consejo. Esas dos preguntas (cuántos grupos y qué significa cada uno) son la parte del no supervisado que no es técnica y que, sin embargo, decide todo. A ellas vamos a continuación.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...
Regístrate para guardar tu progreso.