Saltar al contenido

# aprendizaje-automatico-no-supervisado-con-python

Aprendizaje Automático No Supervisado con Python

Volver a la portada del curso
Lectura (Markdown)

Métodos de Aprendizaje No Supervisado

Sección 1 · Introducción al Aprendizaje No Supervisado

Métodos de aprendizaje no supervisado

PyShop tiene 1500 sesiones de su sitio y ninguna etiqueta: nadie anotó si cada visita fue de alguien que solo curioseaba, que comparaba o que llegó a comprar. En aprendizaje supervisado hay una columna y que el modelo aprende a predecir. Aquí solo existe X, y la pregunta cambia: ¿qué estructura tienen estos datos? Antes de escribir código conviene tener el mapa de métodos, porque cada familia responde una pregunta distinta.

Las familias de métodos

Clustering (agrupamiento). Reparte las filas en grupos de filas parecidas entre sí. Hay varios enfoques:

  • Por particiones: K-means fija de antemano k grupos, coloca un centro por grupo y asigna cada fila al centro más cercano. Es rápido y es el punto de partida del curso.
  • Jerárquico: cada fila empieza sola y se fusionan las más cercanas hasta formar un árbol (dendrograma). El número de grupos se decide después, al cortar el árbol.
  • Por densidad: DBSCAN forma grupos donde hay muchos puntos juntos y marca como ruido (etiqueta -1) lo que queda aislado. No pide k y admite formas irregulares.
  • Modelos de mezcla: GaussianMixture supone que los datos vienen de varias campanas de Gauss y da a cada fila una probabilidad de pertenecer a cada grupo. Solo se menciona en el curso.

Reducción de dimensionalidad. Resume muchas columnas en pocas. PCA busca nuevos ejes en la dirección de mayor varianza; SVD descompone una matriz en piezas y sirve, por ejemplo, para descubrir «temas» en una tabla de conteos. t-SNE y UMAP producen mapas 2D muy expresivos, pero se usan solo para ver: sus distancias no se interpretan como las de PCA.

Detección de anomalías. Busca las pocas filas que no se parecen a nada: fraude, fallas, bots. IsolationForest de scikit-learn es el método típico; DBSCAN también marca atípicos como ruido.

Reglas de asociación. En canastas de compra encuentra combinaciones frecuentes («quien compra A suele comprar B»). El algoritmo clásico es Apriori; no está en scikit-learn y queda fuera del curso.

Qué método para qué pregunta

PreguntaFamiliaHerramienta en el curso
¿Qué tipos de visitante hay?Clustering por particionesKMeans
¿Cómo se anidan los grupos?Clustering jerárquicoAgglomerativeClustering, dendrogram
¿Hay sesiones raras?Densidad / anomalíasDBSCAN (mención)
¿Cómo dibujo 8 columnas en 2D?ReducciónPCA
¿Qué gustos hay detrás de las categorías vistas?Reducción / factorizaciónTruncatedSVD

«Parecido» significa distancia

Casi todos estos métodos miden qué tan cerca están dos filas. La medida por omisión es la distancia euclidiana:

$$d(a, b) = \sqrt{\sum_{j=1}^{p} (a_j - b_j)^2}$$

Cada columna suma su diferencia al cuadrado. El problema aparece cuando las columnas viven en escalas distintas. En las sesiones de PyShop, monto_carrito_mxn tiene varianza 3,722,205; paginas, 88.2; pct_ofertas, 0.1. Compara la sesión 1 (un comparador: 24 páginas, 19.1 minutos, carrito vacío) con la sesión 3 (6 páginas, 3.4 minutos, 3844 MXN en el carrito):

import numpy as np
from sklearn.preprocessing import StandardScaler

df = generar_sesiones()           # copiada del notebook
X = df[COLUMNAS]
a, b = X.iloc[1], X.iloc[3]
print("cruda:", round(np.linalg.norm(a - b), 1))

Xs = StandardScaler().fit_transform(X)
print("escalada:", round(np.linalg.norm(Xs[1] - Xs[3]), 2))
# cruda: 3844.1
# escalada: 5.25

Sin escalar, la distancia es 3844.1, casi idéntica a la diferencia de monto (3844): las 18 páginas y los 15.7 minutos de diferencia no cuentan. Después de StandardScaler (cada columna con media 0 y desviación 1), la distancia es 5.25 y la reparten todas las columnas: agregados_carrito aporta 25 % del cuadrado, busquedas y resenas_leidas 15 % cada una, monto_carrito_mxn 14 %. Por eso, en este curso, el primer paso antes de K-means o PCA siempre es escalar. En la siguiente sección verás el efecto en los grupos: K-means sin escalar solo separa por monto.

Lo que el aprendizaje no supervisado no hace

Un algoritmo de clustering devuelve números de grupo (0, 1, 2, 3), no nombres. Ponerle «cazadores de ofertas» a un grupo es trabajo tuyo, mirando sus promedios. Tampoco dice si acertó: no hay una respuesta correcta con la cual comparar. En el curso, generar_sesiones(con_tipo=True) agrega el tipo real de cada visitante solo para comprobar al final; en un problema real esa columna no existe.

Trampas comunes

  • No escalar. La columna de mayor escala decide sola qué es «parecido».
  • Meter columnas sin pensar. dispositivo describe el contexto, no el comportamiento; codificarlo y agregarlo cambia qué grupos aparecen.
  • Elegir el método antes que la pregunta. Primero se define qué se quiere saber; la tabla de arriba da el método.
  • Leer un mapa de t-SNE como si midiera distancias. Sirve para explorar, no para concluir.

Con el mapa claro, el siguiente paso es K-means sobre las 8 columnas escaladas de las sesiones.