En 05-03 proyectamos los clientes de MercaFresh sobre el plano PC1-PC2 y obtuvimos un mapa útil pero imperfecto: solo el 73% de la varianza cabía en el dibujo, y dos segmentos podían solaparse en el papel estando separados en la realidad. La causa es de fábrica: PCA solo sabe rotar, y hay estructuras que ninguna rotación despliega. Esta lección cierra el módulo con las dos técnicas modernas de visualización no lineal — t-SNE y UMAP — que producen mapas 2D donde los grupos se separan de forma a menudo espectacular. Aprenderás su intuición sin matemática pesada, sus parámetros clave (perplexity, n_neighbors, min_dist), cómo aplicarlas a los clientes de MercaFresh coloreados por sus segmentos de 05-01 y — tan importante como lo anterior — las reglas de prudencia para no leer en esos mapas cosas que no dicen.

Contenido

  1. Por qué el mapa de PCA a veces no separa
  2. t-SNE: preservar vecindades locales
  3. El parámetro perplexity y lo que t-SNE no preserva
  4. UMAP: más rápido y con mejor estructura global
  5. Los clientes MercaFresh en t-SNE y UMAP
  6. Reglas de interpretación prudente
  7. Tabla comparativa: PCA vs. t-SNE vs. UMAP
  8. Cierre del módulo: el mapa del no supervisado

Por qué el mapa de PCA a veces no separa

PCA elige el plano de proyección que conserva la máxima varianza global — pero conservar varianza no es lo mismo que conservar grupos:

  • Si dos segmentos se distinguen en una dirección de poca varianza, PCA la descartará y en el mapa aparecerán mezclados.
  • Si la estructura es curva (imagina los clientes distribuidos sobre una superficie enrollada, o las medialunas de 05-04), la proyección lineal la aplasta: puntos lejanos a lo largo de la curva caen uno encima de otro.
  • Y con muchas dimensiones, un plano es poco espacio: PCA reparte su presupuesto entre todas las direcciones grandes, no entre las que separan grupos.

La idea que cambia el juego: para visualizar no necesitamos conservar distancias ni varianzas globales — necesitamos que los puntos que eran vecinos en el espacio original sigan siendo vecinos en el papel. Renunciar a la fidelidad global a cambio de fidelidad local es el trato que hacen t-SNE y UMAP. Son técnicas de visualización, no de compresión general: producen mapas para ojos humanos, no features para modelos (volveremos sobre esto).

t-SNE: preservar vecindades locales

t-SNE (t-distributed Stochastic Neighbor Embedding) opera en tres pasos conceptuales:

  1. En el espacio original, calcula para cada punto qué otros puntos son sus vecinos cercanos, convirtiendo distancias en probabilidades de vecindad: los muy próximos tienen probabilidad alta de "elegirse" como vecinos; los lejanos, prácticamente nula. Nota lo que esto implica: entre puntos lejanos t-SNE ni distingue — 20 o 200 unidades de distancia son ambas "probabilidad ~0".
  2. En el plano 2D, coloca los puntos inicialmente al azar y define las mismas probabilidades de vecindad sobre sus posiciones.
  3. Mueve los puntos del plano iterativamente (descenso de gradiente, el viejo conocido de 04-01) hasta que las vecindades del plano se parezcan lo máximo posible a las del espacio original: atrae a los que deberían ser vecinos y separa a los que no.

El resultado: cada grupito de vecinos del espacio original aparece como un islote compacto en el mapa. De ahí la fama de t-SNE: clusters que en PCA se veían borrosos aparecen como islas nítidamente separadas.

El parámetro perplexity y lo que t-SNE no preserva

  • perplexity controla el tamaño efectivo del vecindario que cada punto considera — intuitivamente, "a cuántos vecinos presto atención". Valores típicos: 5-50 (por defecto 30). Perplexity baja → atención muy local: los clusters se fragmentan en migas. Alta → vecindarios amplios: estructuras más globales, pero grupos pequeños pueden difuminarse. Debe ser menor que el número de puntos, y conviene probar 2-3 valores: si la estructura sobrevive a varios, es real.
  • Es estocástico: la inicialización aleatoria y el gradiente hacen que dos ejecuciones den mapas distintos (rotados, reflejados o con islas recolocadas). Fija random_state para reproducibilidad.
  • Es lento: su versión exacta es $O(n^2)$; la aproximación de Barnes-Hut lo baja a $O(n \log n)$, pero con cientos de miles de puntos sigue costando minutos u horas.

Y lo crucial — el precio del trato local:

t-SNE no preserva las distancias ni la estructura global. Que dos islas queden lejos en el mapa no significa que esos grupos sean muy distintos; que una isla sea grande no significa que ese cluster sea disperso. t-SNE reparte el espacio del papel para que todo se vea, expandiendo zonas densas y comprimiendo vacías.

Esto no es un defecto menor: es la propiedad que define qué preguntas puede responder el mapa (¿hay grupos? ¿cuáles son vecinos de cuáles?) y cuáles no (¿cómo de lejos están? ¿cuál es más compacto?).

UMAP: más rápido y con mejor estructura global

UMAP (Uniform Manifold Approximation and Projection) llega en 2018 con la misma filosofía — preservar vecindades locales — y una construcción diferente: primero teje un grafo de vecinos sobre los datos (cada punto conectado a sus n_neighbors más próximos, la maquinaria de 04-05 otra vez) y luego busca la disposición 2D que mejor conserva ese grafo. En la práctica aporta tres ventajas:

  • Velocidad: típicamente 10-100 veces más rápido que t-SNE; escala a millones de puntos.
  • Mejor estructura global: sin ser fiel del todo, las posiciones relativas entre clusters suelen ser más significativas que en t-SNE (grupos parecidos tienden a quedar cerca).
  • Puede transformar puntos nuevos: tiene transform() para proyectar datos no vistos sobre un mapa ya ajustado, cosa que el t-SNE de scikit-learn no ofrece.

Sus dos mandos principales:

Parámetro Controla Valor bajo Valor alto
n_neighbors (defecto 15) Tamaño del vecindario del grafo Foco muy local: muchos islotes finos Visión más global: menos grupos, más conectados
min_dist (defecto 0,1) Distancia mínima entre puntos en el mapa Islas densas y apretadas (bueno para ver clusters) Puntos más repartidos (bueno para ver topología)

n_neighbors es el primo de perplexity; min_dist es puramente estético, no cambia qué es vecino de qué.

Detalle práctico: UMAP no viene en scikit-learn; es el paquete aparte umap-learn (pip install umap-learn), que se importa como umap y sigue la API fit_transform habitual.

Los clientes MercaFresh en t-SNE y UMAP

Dibujemos el mapa definitivo del módulo: los clientes con sus 7 features (matriz X_esc de 05-03, escalada — regla de siempre), coloreados por los segmentos que K-means descubrió en 05-01.

import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import umap                                      # pip install umap-learn

# t-SNE (scikit-learn)
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_esc)               # solo fit_transform: no hay transform()

# UMAP (paquete umap-learn)
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
X_umap = reducer.fit_transform(X_esc)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for ax, X_2d, titulo in [(axes[0], X_tsne, "t-SNE (perplexity=30)"),
                         (axes[1], X_umap, "UMAP (n_neighbors=15)")]:
    sc = ax.scatter(X_2d[:, 0], X_2d[:, 1], c=rfm["segmento"],
                    cmap="tab10", s=12)
    ax.set_title(titulo)
    ax.set_xticks([]); ax.set_yticks([])         # los ejes NO tienen unidades interpretables
fig.colorbar(sc, label="segmento K-means (05-01)")
plt.show()

Puntos del código que merecen comentario:

  • Los colores vienen de rfm["segmento"]: estamos superponiendo el resultado de un algoritmo (K-means) sobre el mapa de otro (t-SNE/UMAP). Si cada isla del mapa sale de un color casi puro, dos métodos independientes coinciden — la misma validación cruzada de métodos que hicimos con el jerárquico en 05-02, ahora visual.
  • Quitamos las marcas de los ejes a propósito: en t-SNE/UMAP las coordenadas no significan nada (no son "recencia" ni "PC1"; son posiciones optimizadas para la legibilidad).
  • Resultado típico en MercaFresh: los cuatro segmentos forman islas más nítidas que en el PCA de 05-03; los ~70 clientes fronterizos de la tabla de contingencia de 05-02 aparecen como puntos de color "equivocado" en los bordes de las islas — otra forma de ver que son casos límite.

Reglas de interpretación prudente

Los mapas de t-SNE/UMAP son tan vistosos que invitan a sobre-interpretarlos. Reglas de prudencia, todas consecuencia de "local sí, global no":

  • Las distancias entre islas no son proporcionales a nada. Dos clusters pegados no son necesariamente similares; dos alejados no son necesariamente opuestos. (UMAP es algo más fiable aquí, pero solo algo.)
  • Los tamaños y densidades de las islas engañan. t-SNE expande los grupos densos y encoge los dispersos para que todo se vea: una isla grande no es un segmento heterogéneo.
  • Pueden aparecer clusters donde no los hay. Con perplexity/n_neighbors bajos, t-SNE fragmenta hasta el ruido uniforme en aparentes grupitos. Verifica que la estructura sobrevive a varios valores del parámetro antes de creértela — y contrástala con un método de clustering, no solo con el ojo.
  • No uses las coordenadas como features de un modelo. No son features: no tienen significado, cambian con la semilla y (en t-SNE) ni siquiera puedes calcularlas para un dato nuevo. Para comprimir de cara a un modelo, la herramienta es PCA (05-03) sobre criterios de varianza; t-SNE/UMAP son para comunicar y explorar.
  • Ejecuta dos veces antes de presentar. Si una conclusión depende de un detalle que cambia con la semilla, no era una conclusión.

Tabla comparativa: PCA vs. t-SNE vs. UMAP

Criterio PCA (05-03) t-SNE UMAP
Tipo Lineal (rotación) No lineal No lineal
Preserva Varianza global; distancias grandes aproximadas Vecindades locales Vecindades locales + algo de estructura global
Determinista No (semilla) No (semilla)
Velocidad Muy rápido Lento ($O(n\log n)$ con Barnes-Hut) Rápido; escala a millones
Ejes interpretables Sí (loadings) No No
¿transform() para datos nuevos? No
Uso legítimo Compresión + visualización + features para modelos Solo visualización Visualización (y exploración)
Parámetro clave n_components perplexity n_neighbors, min_dist
Disponibilidad scikit-learn scikit-learn (TSNE) Paquete umap-learn

Flujo de trabajo recomendado y muy común: PCA primero, t-SNE/UMAP después — reducir p. ej. de 100 dimensiones a 20 con PCA (quita ruido y acelera) y aplicar t-SNE/UMAP sobre esas 20 para el mapa final.

Cierre del módulo: el mapa del no supervisado

Recapitulemos el módulo 5, porque forma un todo:

  • K-means (05-01): la segmentación como problema sin etiquetas; centroides, codo, silhouette; los cuatro segmentos de MercaFresh con perfil de negocio.
  • Jerárquico (05-02): la estructura a todas las escalas en un dendrograma; medidas de enlace; la coincidencia con K-means como validación.
  • PCA (05-03): la maldición de la dimensionalidad y su antídoto lineal; varianza explicada, loadings, el primer mapa 2D.
  • DBSCAN (05-04): clusters por densidad, de cualquier forma, con ruido nativo; los pedidos anómalos de MercaFresh.
  • t-SNE y UMAP (05-05): los mapas no lineales que comunican la estructura — con manual de prudencia.

El hilo común: sin una columna y, los algoritmos han extraído estructura — segmentos accionables, jerarquías, ejes de significado, anomalías — solo de la geometría de los datos. Todo esto converge en el proyecto 09-05, donde la segmentación de MercaFresh se hará de punta a punta.

Errores Comunes y Consejos

  • Usar t-SNE/UMAP sin escalar. Son métodos de vecindades, y las vecindades son distancias: sin StandardScaler, el mapa retrata a la feature de mayor magnitud. La regla ha aplicado a todo el módulo y aquí no hay excepción.
  • Presentar un mapa de una sola ejecución con un solo parámetro. La estructura creíble es la que sobrevive a 2-3 perplexities/n_neighbors y a 2 semillas. Un mapa único es una anécdota.
  • Medir distancias sobre el mapa ("el segmento VIP está el doble de lejos de los dormidos que de los habituales"). Las coordenadas no son métricas; esa frase no significa nada en t-SNE.
  • Usar el embedding como entrada de un clustering o clasificador para "mejorar resultados". Es circular y frágil: el mapa exagera separaciones y depende de la semilla. Clustering sobre features reales (o PCs); mapa solo para mirar.
  • Consejo: colorea el mapa con variables de negocio además de con los clusters (c=rfm["gasto_medio_pedido"]): si el gradiente de color se organiza espacialmente, el mapa te está contando qué variable estructura cada zona — un análisis exploratorio potentísimo con una línea de código.

Ejercicios

Ejercicio 1. Sin código: para cada afirmación, di si un mapa t-SNE la respalda, y por qué. (a) "Hay unos 4 grupos de clientes claramente distintos". (b) "El segmento dormido es el más heterogéneo, porque su isla es la más grande". (c) "VIP y habituales son los segmentos más parecidos, porque sus islas están pegadas". (d) "Estos 12 clientes de la isla VIP aparecen coloreados como habituales: son casos frontera que conviene revisar".

Ejercicio 2. Genera un dataset con 4 blobs en 10 dimensiones (make_blobs(n_samples=600, centers=4, n_features=10, cluster_std=3.0, random_state=1)), escálalo, y compáralo en tres mapas: PCA(2), t-SNE (perplexity 30) y UMAP (si lo tienes instalado; si no, compara los dos primeros). Colorea con las etiquetas reales que devuelve make_blobs. ¿Cuál separa mejor? ¿Por qué PCA sufre aquí?

Ejercicio 3. Con el dataset del ejercicio 2, ejecuta t-SNE con perplexity 2, 30 y 100 (misma semilla) y dibuja los tres mapas. Describe cómo cambia la estructura aparente y extrae la regla práctica.

Soluciones

Ejercicio 1

(a) : contar grupos y ver qué puntos comparten isla es exactamente lo que t-SNE preserva (vecindades locales). Con la cautela de confirmar que las 4 islas sobreviven a otras perplexities. (b) No: t-SNE distorsiona tamaños y densidades por diseño; para medir heterogeneidad, usa estadísticos reales del cluster (desviaciones, 02-01) en el espacio original. (c) No: las distancias entre islas no son proporcionales a la similitud entre grupos; verifica con distancias entre centroides en el espacio escalado. (d) Sí, como hipótesis: la mezcla local de colores refleja vecindad real entre esos puntos y los VIP; encaja con los silhouettes bajos y los desacuerdos K-means/jerárquico. "Revisar" es la palabra correcta: el mapa genera la sospecha, la confirmación llega con los datos originales.

Ejercicio 2

from sklearn.datasets import make_blobs
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler

X, y = make_blobs(n_samples=600, centers=4, n_features=10,
                  cluster_std=3.0, random_state=1)
X_esc = StandardScaler().fit_transform(X)

mapas = {"PCA": PCA(n_components=2).fit_transform(X_esc),
         "t-SNE": TSNE(perplexity=30, random_state=0).fit_transform(X_esc)}
fig, axes = plt.subplots(1, len(mapas), figsize=(11, 4))
for ax, (nombre, X2) in zip(axes, mapas.items()):
    ax.scatter(X2[:, 0], X2[:, 1], c=y, cmap="tab10", s=10)
    ax.set_title(nombre)
plt.show()

Resultado esperado: en PCA los 4 colores se ven pero con solapamientos — el plano PC1-PC2 captura solo una parte de la varianza y con cluster_std=3.0 los blobs se rozan en la proyección; la separación real vive repartida en las 10 dimensiones. t-SNE (y UMAP, con un dibujo aún más limpio y en una fracción del tiempo) muestra 4 islas netas, porque no proyecta: recoloca los puntos preservando quién es vecino de quién. Es el caso de libro de "PCA a 2D no separa aunque los grupos existan".

Ejercicio 3

Con perplexity 2, el mapa se fragmenta en decenas de migas: cada punto atiende solo a 2-3 vecinos y hasta el interior de un blob parece varios grupos — estructura espuria. Con 30, aparecen las 4 islas correctas. Con 100, las islas siguen visibles pero más difusas y próximas, porque cada punto atiende a vecindarios que ya desbordan su propio blob. Regla práctica: perplexity pequeña inventa clusters, grande los difumina; prueba varios valores y quédate con la estructura que persiste en un rango — esa es la real.

Conclusión

Has completado el juego de mapas del no supervisado: t-SNE recoloca los puntos para preservar vecindades locales al precio de distorsionar distancias, tamaños y estructura global; UMAP hace lo mismo más rápido, con mejor geometría de conjunto y capacidad de proyectar datos nuevos; y ambos exigen la prudencia que has aprendido — parámetros contrastados, semillas repetidas, nada de medir sobre el mapa ni de reciclar coordenadas como features. Con la tabla PCA/t-SNE/UMAP sabes elegir herramienta según el objetivo: comprimir, explorar o comunicar.

Y con ello se cierra el módulo 5: MercaFresh ya tiene segmentos de clientes con nombre y perfil, una jerarquía que los valida, ejes que los explican, un vigilante de pedidos anómalos y mapas para contarlo todo — extraído íntegramente de datos sin una sola etiqueta. Pero queda una deuda pendiente con el módulo 4: allí entrenamos siete modelos supervisados y los puntuamos alegremente con score() sobre unos datos apartados, sin preguntarnos si esa cifra era de fiar, qué escondía el porcentaje de aciertos cuando las clases están desbalanceadas, o cuánto cambiaría con otra partición de los datos. Responder con rigor a la pregunta "¿es bueno de verdad mi modelo?" es toda una disciplina — división de datos, métricas, validación cruzada, curvas ROC, overfitting — y es exactamente el módulo 6.

Curso de Machine Learning

Módulo 1: Introducción al Machine Learning

Módulo 2: Fundamentos de Estadística y Probabilidad

Módulo 3: Preprocesamiento de Datos

Módulo 4: Algoritmos de Machine Learning Supervisado

Módulo 5: Algoritmos de Machine Learning No Supervisado

Módulo 6: Evaluación y Validación de Modelos

Módulo 7: Técnicas Avanzadas y Optimización

Módulo 8: Implementación y Despliegue de Modelos

Módulo 9: Proyectos Prácticos

Módulo 10: Recursos Adicionales

© Copyright 2026. Todos los derechos reservados