17 · Proyecto final: un recomendador de extremo a extremo
Junta todo el track: construye una matriz de valoraciones, divide con leave-one-out, entrena Funk-SVD y supera la línea base de popularidad en precision@k y NDCG — luego imprime recomendaciones top-N reales para un usuario.
Un recomendador real es un pipeline, no un modelo: construye la matriz de interacción, divídela honestamente (leave-one-out por usuario para probar sobre un ítem retenido), entrena factorización de matrices, evalúa la calidad de ranking (precision@k, NDCG) contra la línea base de popularidad que debes superar, y solo entonces sirve top-N. Los mismos cuatro pasos mueven cada sistema de producción.
Sin esto:
Sáltate la división retenida y 'evalúas' sobre datos con los que el modelo entrenó — una puntuación inflada que se desmorona en producción. Sáltate la línea base y no puedes saber si tu modelo sofisticado supera a simplemente recomendar lo que es popular.
Este es el proyecto final — cada pieza del track en un pipeline ejecutable. Vamos a:
- Construir una matriz de valoraciones sintética con estructura latente real (para que exista una señal que aprender) más ruido y dispersión.
- Dividir con leave-one-out: para cada usuario, oculta una valoración observada como ítem de prueba, entrena con el resto. Esta es la forma honesta de probar un recomendador — mides si el ítem retenido aterriza cerca de la cima del ranking.
- Entrenar Funk-SVD (factorización de matrices por SGD) sobre las celdas de entrenamiento, aprendiendo vectores latentes de usuario e ítem más sesgos.
- Evaluar la calidad de ranking con precision@k (¿el ítem retenido entró al top-k?) y NDCG@k (¿aterrizó alto?), y comparar contra la línea base de popularidad — el listón de la Lección 1. La factorización de matrices debería ganar, porque es personalizada mientras la popularidad sirve a todos la misma lista.
- Recomendar los top-N ítems no vistos para un usuario de muestra.
La celda de abajo hace los cinco en menos de ~55 líneas. Lee los números impresos como un veredicto: la precision@k y el NDCG de MF deberían superar los de la línea base de popularidad, probando que la personalización gana a la popularidad.
Python (in browser)
El pipeline completo en una celda: construir → división leave-one-out → entrenar Funk-SVD → evaluar precision@10 y NDCG@10 vs la línea base de popularidad (MF gana) → imprimir top-5 recomendaciones.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
A dónde ir después. Has construido cada familia de recomendadores desde cero — popularidad, basado en contenido, filtrado colaborativo de vecindario y de modelo, factorización de matrices, evaluación de ranking, BPR para feedback implícito e híbridos. Para ir más allá:
- Surprise — una librería estilo scikit para CF de valoraciones explícitas (SVD, SVD++, KNN) con validación cruzada incorporada; excelente para trabajo de predicción de valoraciones.
- implicit — ALS / BPR rápidos para feedback implícito a escala (multihilo, GPU).
- LightFM — factorización híbrida con pérdida WARP que ingiere características de ítem/usuario, atacando directamente el cold-start.
- Recomendadores de dos torres / profundos — recuperación neuronal (una torre de usuario y una de ítem entrenadas con pérdida softmax/contrastiva) mueven la generación de candidatos a escala web en YouTube y compañía; luego un modelo de ranking profundo re-puntúa la lista corta.
- Modelos secuenciales / por sesión (GRU4Rec, SASRec, BERT4Rec) modelan el orden, prediciendo el próximo ítem desde la secuencia reciente de un usuario.
- RecBole — un framework unificado con más de 100 algoritmos de recsys para benchmarking, para comparar tus ideas con la literatura con una sola configuración.
Cada uno de estos aún descansa sobre las ideas que implementaste a mano aquí: una matriz de interacción dispersa, factores latentes, una división train/test sólida y métricas de ranking. Ahora tienes la base para leer sus artículos y usar su código con entendimiento en vez de como una caja negra.
El proyecto final hecho con Surprise (solo lectura): su SVD es el Funk-SVD con sesgos que implementaste a mano, envuelto en una API limpia de train/test + RMSE. La misma matemática, ergonomía de producción.
En el proyecto final, ¿por qué usamos una división leave-one-out Y comparamos la factorización de matrices contra la línea base de popularidad?
- Un recomendador es un pipeline: construir la matriz → división leave-one-out → entrenar MF → evaluar ranking vs una línea base → servir top-N.
- Leave-one-out (ocultar un ítem por usuario) es la evaluación honesta; precision@k y NDCG@k miden si el ítem retenido se ordena alto.
- La factorización de matrices supera la línea base de popularidad porque es personalizada — y los siguientes pasos (Surprise, implicit, LightFM, dos torres, RecBole) escalan estas mismas ideas.
Cada recomendador de producción — Netflix, Spotify, Amazon — es este mismo pipeline escalado: construir interacciones, dividir honestamente, entrenar, evaluar contra líneas base, servir top-N, luego iterar.
Si lo quitas: Sin la división retenida y la comparación con línea base, despliegas un modelo con una puntuación offline inflada que no logra superar a 'solo recomienda lo popular' en producción — el fallo de recsys más común.