046 — Sistemas de recomendación

← Clase anterior · Índice de la parte · Clase siguiente →

Parte: 03 — Machine learning clásico
Nivel: intermedio · Horas estimadas: 6
Laboratorio: retrieval · Estado: EXECUTABLE_CORE

🎯 Propósito

Comprender sistemas de recomendación dentro de la evolución de la inteligencia artificial, implementar un experimento mínimo verificable y distinguir qué parte constituye evidencia frente a una afirmación todavía no comprobada.

📚 Resultados de aprendizaje

Al finalizar podrás:

  1. Explicar sistemas de recomendación usando los conceptos filtrado colaborativo, contenido, ranking, cold-start.
  2. Ejecutar el laboratorio con una semilla explícita y revisar su contrato JSON.
  3. Identificar al menos un supuesto, una limitación y un riesgo de aplicación.
  4. Comparar el enfoque con la etapa anterior de la ruta de aprendizaje.
  5. Producir una evidencia reproducible y una conclusión que no exceda los datos.

🧩 Conceptos centrales

filtrado colaborativo, contenido, ranking, cold-start

🗺️ Ubicación en el mapa de la IA

Los recomendadores son el sistema de ML clásico con más impacto económico directo: deciden qué ve cada usuario en comercio, streaming y redes. Técnicamente sintetizan casi todo lo anterior — similitud y distancia (clase 043), factorización de matrices (álgebra de la clase 005), ranking y métricas por posición — y son el antecedente conceptual de la recuperación de información que la parte 08 usa en RAG: recomendar es rankear ítems para un usuario, recuperar es rankear documentos para una consulta. El Netflix Prize (2006-2009) hizo de la factorización el estándar del campo.

📖 Fundamentos

🧩 El problema y sus datos

Matriz de interacciones R (usuarios × ítems) casi vacía (típico: > 99 % de celdas desconocidas). Feedback explícito (ratings 1-5: escaso y sesgado) o implícito (clics, compras, tiempo de reproducción: abundante, pero la ausencia NO es rechazo — solo no exposición). El objetivo real no es rellenar la matriz sino producir un ranking top-k útil por usuario.

👥 Filtrado colaborativo por vecindad

"Usuarios que coinciden en el pasado coincidirán en el futuro." Dos variantes:

similitud coseno:  sim(a, b) = (a·b) / (‖a‖·‖b‖)   sobre las co-valoraciones
predicción:        r̂(u, i) = Σⱼ sim(i, j)·r(u, j) / Σⱼ |sim(i, j)|

No necesita features de los ítems; sufre con la dispersión (pocas co-valoraciones → similitudes ruidosas) y no puede recomendar ítems sin historial.

📄 Basado en contenido

Representar cada ítem con sus atributos (género, texto, tags → vectores TF-IDF o embeddings) y recomendar ítems similares al perfil del usuario (agregado de lo que consumió). Resuelve el cold-start de ítems nuevos (tienen atributos desde el día cero) y da recomendaciones explicables ("porque viste X"); a cambio, encierra al usuario en más de lo mismo (sobre-especialización) y exige buenos atributos.

🔢 Factorización de matrices

La idea ganadora del Netflix Prize (Koren, Bell & Volinsky 2009): aprender un espacio latente de dimensión k donde usuario e ítem son vectores, y la afinidad es su producto interno:

r̂(u, i) = μ + b_u + b_i + p_u · q_i
min Σ_{(u,i) observados} ( r(u,i) − r̂(u,i) )² + λ( ‖p_u‖² + ‖q_i‖² + b_u² + b_i² )

📏 Evaluación de rankings y cold-start

El split debe ser temporal por usuario (entrenar con su pasado, evaluar su futuro). Métricas top-k: Precision@k y Recall@k (aciertos entre los k recomendados); NDCG@k descuenta por posición (DCG = Σ relᵢ/log₂(i+1) normalizado por el ranking ideal); cobertura del catálogo y diversidad completan la foto — optimizar solo exactitud produce listas de éxitos idénticas para todos. Cold-start: usuario nuevo → contenido, populares, onboarding; ítem nuevo → contenido; sistema nuevo → híbridos. Todo recomendador serio es híbrido: colaborativo cuando hay señal, contenido donde no la hay.

🧮 Ejemplo trabajado

Ratings (1-5) de 4 usuarios sobre 4 películas; ¿qué recomendar a Ana, que no vio D?

        A     B     C     D
Ana     5     4     1     ?
Beto    5     5     2     4
Carla   1     2     5     2
Dani    4     4     1     5

Similitud coseno de Ana con cada usuario (sobre las columnas A, B, C que comparten):

sim(Ana, Beto)  = (25+20+2)/(√42·√54) ≈ 47/47.62 ≈ 0.987
sim(Ana, Carla) = (5+8+5)/(√42·√30)   ≈ 18/35.50 ≈ 0.507
sim(Ana, Dani)  = (20+16+1)/(√42·√33) ≈ 37/37.23 ≈ 0.994

Predicción para D ponderando por similitud:

r̂(Ana, D) = (0.987·4 + 0.507·2 + 0.994·5) / (0.987 + 0.507 + 0.994)
          = (3.948 + 1.014 + 4.970) / 2.488 ≈ 9.93 / 2.488 ≈ 3.99

Se recomienda D (≈ 4/5). Nota el mecanismo: Beto y Dani, con gustos casi idénticos a Ana, dominan la predicción; Carla — de gustos opuestos — apenas pesa. Con similitud de coseno centrado (restando la media de cada usuario) Carla incluso restaría, capturando que su 2 en D es, para ella, una valoración relativamente positiva.

📊 Propiedades y comparación

Enfoque Necesita Cold-start ítem Cold-start usuario Serendipia Explicable
Colaborativo (vecindad) Solo interacciones Alta Media ("usuarios como tú")
Contenido Atributos de ítems Parcial (onboarding) Baja (burbuja) Alta ("porque viste X")
Factorización Muchas interacciones Alta Baja (factores latentes)
Popularidad (baseline) Nada Nula Total
Híbrido Todo lo anterior Ajustable Media
flowchart TD
    I["Interacciones usuario-ítem<br/>(explícitas / implícitas)"] --> Q{"¿Historial del<br/>usuario / ítem?"}
    Q -- "Ambos con señal" --> CF["Colaborativo:<br/>vecindad o factorización<br/>r̂ = μ + b_u + b_i + p_u·q_i"]
    Q -- "Ítem nuevo" --> CB["Contenido: atributos<br/>+ perfil del usuario"]
    Q -- "Usuario nuevo" --> POP["Populares + onboarding<br/>+ contenido"]
    CF --> H["Híbrido: mezclar scores"]
    CB --> H
    POP --> H
    H --> RK["Ranking top-k por usuario"]
    RK --> EV["Evaluación: split temporal,<br/>Precision@k, NDCG@k,<br/>cobertura, diversidad"]
    EV -- "offline OK" --> AB["Test A/B en línea<br/>(la métrica final es negocio)"]

⚠️ Errores conceptuales frecuentes

  1. "La celda vacía significa que no le gusta." En feedback implícito, la ausencia es sobre todo falta de exposición. Tratar los no-vistos como negativos duros sesga el modelo hacia lo ya popular.
  2. "Evalúo con split aleatorio de interacciones." Mezcla el futuro del usuario en su train (fuga temporal, clase 045) y sobreestima. El split correcto es temporal.
  3. "RMSE bajo = buen recomendador." El Netflix Prize lo enseñó: optimizar el rating puntual no optimiza el ranking top-k que el usuario ve, ni la diversidad, ni el negocio. Se evalúa con métricas de ranking y A/B.
  4. "El recomendador descubre mis gustos." También los crea: el feedback loop (recomiendo → clic → reentreno con ese clic) amplifica lo popular y estrecha la burbuja; sin corrección de sesgo de exposición, el sistema se retroalimenta.
  5. "Factorización = SVD del álgebra." La SVD clásica exige matriz completa; aquí se optimiza solo sobre celdas observadas con regularización — un problema distinto, no convexo, resuelto con SGD/ALS.

🚀 Del aprendizaje a la operación

Un recomendador real separa recall (candidatos: cientos, con ANN sobre embeddings) de ranking (modelo fino sobre los candidatos) por latencia; añade reglas de negocio (stock, edad, ya-comprado), control del feedback loop (exploración: una fracción del tráfico prueba ítems poco expuestos), actualización cercana al tiempo real de los perfiles, y una jerarquía de evaluación en tres niveles — offline (NDCG), online (CTR, conversión) y de largo plazo (retención, diversidad consumida) — porque optimizar el clic de hoy puede degradar el catálogo que el usuario descubre en un año.

🧪 Laboratorio

python lab.py

El laboratorio llama a ai_evolution.labs.run_lab("retrieval"). Esta decisión evita 183 implementaciones divergentes: cada clase tiene un entrypoint propio, pero los motores didácticos se prueban como una biblioteca común.

🔍 Evidencia esperada

📓 Notebooks

📝 Evaluación

Criterio Peso
Comprensión conceptual 25 %
Ejecución reproducible 25 %
Interpretación basada en evidencia 25 %
Riesgos, límites y mejora propuesta 25 %

Consulta assessment.md para preguntas y criterio de aceptación.

⚠️ Errores comunes

Síntoma Causa probable Corrección
El código corre, pero no hay conclusión Se confundió ejecución con aprendizaje Explica qué demuestra y qué no demuestra
El resultado cambia sin explicación No se registró semilla o configuración Conserva semilla, versión y parámetros
Se promete uso real Se extrapoló desde una demo educativa Declara entorno, datos, límites y revisión humana
Se copia una métrica aislada No existe baseline ni costo de error Añade comparación y criterio de decisión

❓ Preguntas frecuentes

¿Debo usar una API comercial?
No. El núcleo funciona localmente. Las extensiones LIVE se documentan por separado.

¿El laboratorio representa una implementación industrial?
No por sí solo. Enseña el contrato y el patrón; producción exige integración, seguridad, observabilidad, pruebas y operación.

¿Dónde profundizo?
Revisa las especializaciones enlazadas en el README raíz y la ruta siguiente.

🔗 Referencias


📜 Papers que fundamentan esta clase

Bloque generado por python scripts/link_papers_to_classes.py. La fuente es papers/catalog/papers.json.

Paper Año Qué desbloqueó Miniatura
P85 · Técnicas de factorización matricial para sistemas de recomendación 2009 El método que ganó el Netflix Prize, explicado con lo que de verdad importa: los sesgos antes que los gustos. notebook

Cada ficha explica el problema anterior, la matemática mínima, los límites y los errores de atribución más frecuentes. Para leerlas con método: cómo leer un paper de IA · anexos matemáticos.


📚 Bibliografía de apoyo

Bloque generado por python scripts/link_sources_to_classes.py. Cada obra lleva su localizador verificado en sources/bibliography.json.

Los papers dicen de dónde salió el mecanismo. Estas obras lo desarrollan con el espacio que una clase no tiene: teoría completa, demostraciones y ejercicios.

Obra Edición Localizador Papel en esta clase
Hastie, Trevor, Tibshirani, Robert y Friedman, Jerome — The Elements of Statistical Learning 2.ª · 2009 ISBN 9780387848570 · web de la obra obra de referencia de la parte 03 · toda la parte
James, Gareth et al. — An Introduction to Statistical Learning 2021 ISBN 9783031387470 · web de la obra obra de referencia de la parte 03 · toda la parte, nivel introductorio
Murphy, Kevin P. — Probabilistic Machine Learning 2022 ISBN 9780262046824 · web de la obra obra de referencia de la parte 03 · fundamentos probabilísticos del aprendizaje

⬅️ Clase anterior

045 — Series temporales y backtesting

➡️ Siguiente clase

047 — Métricas, calibración, sesgo y costo de error


📝 Evaluación completa

❓ Preguntas

  1. Define sistemas de recomendación sin usar una marca o framework como definición.
  2. Explica la relación entre filtrado colaborativo, contenido, ranking, cold-start.
  3. Ejecuta lab.py dos veces con la misma semilla. ¿Qué debe conservarse?
  4. Identifica una afirmación permitida y una afirmación exagerada sobre el resultado.
  5. Propón una prueba negativa o un caso límite.

🏆 Reto verificable

Amplía el resultado del laboratorio con una clave student_extension que incluya:

✅ Criterio de aceptación