# aprendizaje-automatico-no-supervisado-con-python
Aprendizaje Automático No Supervisado con Python
Volver a la portada del cursoPrácticas Recomendadas y Consejos
Sección 4 · Proyecto Final y Evaluación
Prácticas recomendadas y consejos
En aprendizaje supervisado, un error se nota: la métrica de test baja. En no supervisado no hay test que te avise. K-means siempre devuelve k grupos, aunque los datos no tengan ninguno. Por eso las decisiones que tomas antes y después del fit pesan más que el algoritmo. Estas son las prácticas que, en las sesiones de PyShop, separan una segmentación útil de una que solo parece útil.
1. Escala siempre, y escala con intención
Sin escalar, K-means sobre las sesiones da tamaños [1051, 132, 281, 36] y sus centros solo se distinguen por el monto del carrito (146, 1719, 4756 y 9130 MXN). Con StandardScaler da [310, 617, 375, 198] y cuatro perfiles de comportamiento. Escalar no es un detalle técnico: decide qué significa «parecido». Si una columna debe pesar más por razones de negocio, multiplícala después de escalar y anótalo.
2. Elige columnas con sentido
Cada columna que entra cambia la geometría. dispositivo describe el contexto de la visita, no su comportamiento. Con k=4, agregarlo como 0/1 casi no cambia los grupos (ARI 0.962 contra la versión sin él), pero con k=5 aparece un grupo de 454 sesiones, todas de móvil, y otro de 198, todas de escritorio; 438 y 179 de ellas son visitas rápidas. El algoritmo partió ese grupo en dos por el aparato, no por cómo navega. Si quieres saber cómo se reparte el dispositivo, crúzalo con los grupos al final (pd.crosstab) en lugar de meterlo al clustering.
3. Varias inicializaciones, siempre
K-means encuentra un mínimo local que depende de dónde empiezan los centros. Con inicio aleatorio y una sola corrida, el resultado cambia con la semilla:
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score as ari
base = KMeans(4, n_init=10, random_state=42).fit_predict(Xs)
for n in [1, 10]:
res = []
for s in range(6):
km = KMeans(4, init="random", n_init=n, random_state=s).fit(Xs)
res.append(round(ari(base, km.labels_), 2))
print(f"n_init={n}:", res)
# n_init=1: [0.68, 1.0, 1.0, 1.0, 0.74, 0.58]
# n_init=10: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
Con una corrida, 3 de 6 semillas caen en una solución peor (inercias 5051.5, 4772.0 y 4862.6 contra 3513.2). Con n_init=10 las seis coinciden. En scikit-learn 1.8, n_init="auto" hace una sola corrida cuando init="k-means++" (el valor por omisión); escribir n_init=10 de forma explícita cuesta poco y quita la duda.
4. No confíes en un solo k
Revisa al menos dos criterios. En las sesiones, el codo de la inercia y el máximo de silhouette coinciden en k=4 (0.479, contra 0.456 con 2 y 0.449 con 5). Cuando no coinciden, prueba los candidatos y elige el que produzca grupos que alguien pueda usar. Un k con buen silhouette pero con un grupo de 12 sesiones rara vez sirve para una campaña.
5. Interpreta en unidades originales
Los centros de KMeans viven en el espacio escalado: una cifra en desviaciones estándar no le dice nada a marketing. sc.inverse_transform(km.cluster_centers_) los devuelve a páginas, minutos y pesos: el grupo 3 agrega 3.7 productos al carrito por 5158 MXN; el grupo 0 navega con 70 % de páginas de ofertas. Así se ponen nombres («compradores decididos», «cazadores de ofertas») y se defienden con cifras.
6. Atípicos y formas raras
K-means usa promedios, y un promedio se mueve con los extremos. En las sesiones, 116 filas tienen alguna columna a más de 3 desviaciones de la media; el carrito más caro (14,423 MXN) está a 6.93. Revisa esas filas antes de agrupar. Si los grupos no son «nubes redondas» o hay mucho ruido, DBSCAN es una alternativa, pero es sensible a eps, el parámetro que la documentación señala como el más importante:
eps | Grupos | Ruido (-1) |
|---|---|---|
| 0.8 | 4 | 755 |
| 1.0 | 4 | 477 |
| 1.2 | 2 | 236 |
| 1.5 | 1 | 61 |
| 2.0 | 1 | 5 |
Con min_samples=10 sobre Xs, un cambio pequeño en eps pasa de la mitad de los datos como ruido a un solo grupo gigante.
7. PCA para ver, no para decidir
El mapa 2D de PCA conserva el 71.5 % de la varianza. Es ideal para mostrar los grupos, pero K-means sobre esas 2 componentes coincide solo con ARI 0.783 con el de las 8 columnas. Agrupa con todas las columnas escaladas y usa el plano para comunicar.
8. Comprueba la estabilidad
Una segmentación confiable resiste cambios pequeños: otra semilla, otro método, una muestra distinta. El jerárquico con ward coincide con K-means con ARI 0.890; con single produce [1497, 1, 1, 1], un aviso de que el enlace importa. Si dos métodos razonables discrepan mucho, los grupos son frágiles.
9. La etiqueta oculta no existe
En el curso, con_tipo=True permite calcular un ARI de 0.849 contra el tipo real y descubrir que 88 compradores decididos quedaron en «visitas rápidas». En un proyecto real no hay esa columna: la validación es la estabilidad, el sentido de negocio y, si existe, un dato externo (por ejemplo, si los grupos compran distinto el mes siguiente).
10. Documenta las decisiones
Anota columnas, escalado, k, semilla, versión de scikit-learn y por qué elegiste cada cosa. Otra persona debe poder reproducir tus grupos y discutir tus nombres. El notebook practicas-recomendadas ejecuta cada ejemplo de esta lectura.