Python Data Science Program
📓 Abrir notebook en GitHub

Clase 216 — Filtrado colaborativo: user-based e item-based

Parte: 6 — Sistemas de Recomendación · Fuente: Aggarwal, Recommender Systems: The Textbook (Springer, 2016) cap. 2 + Linden, Smith, York (Amazon, 2003) Item-to-Item Collaborative Filtering. ⏱️ Duración estimada: 75 min.

🎯 Objetivo

Construir el recomendador más antiguo y todavía usado: filtrado colaborativo basado en vecinos (kNN). Calcular similitudes user-user e item-item sobre una matriz usuario-item dispersa, generar top-N recomendaciones, y entender por qué Amazon publicó en 2003 que item-based gana a user-based en escala (computar similitudes item-item es offline y estable).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

# Tema Por qué importa
1 Matriz usuario-item: dense vs sparse 1M users × 100K items → 100B celdas; 99.9% son 0.
2 Similitud coseno, Pearson, Jaccard La elección define qué entiende el modelo por "parecido".
3 User-based kNN Intuitivo; no escala (similitudes user-user cambian con cada nuevo rating).
4 Item-based kNN El paper de Amazon: similitudes item-item son estables y precomputables.
5 Implicit vs explicit feedback Rating 1-5 vs "vio/no vio". Cambia loss y métrica.
6 Mean centering Restar user_mean antes de calcular similitud — controla sesgo de usuarios "duros".

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Sparse matrix: cargar MovieLens 100K. Construir R como csr_matrix shape (n_users, n_items). Verificar sparsity: (1 - R.nnz / np.prod(R.shape)).
  2. User similarity: sim_users = cosine_similarity(R) — devuelve (n_users, n_users). Encontrar los 5 más similares a user_id=42.
  3. User-based top-10: para user_id=42, predecir score para items no vistos como R.T @ sim_users[42] (broadcasting). Recomendar top-10 que aún no vio.
  4. Item-based top-10: sim_items = cosine_similarity(R.T) (ahora (n_items, n_items)). Para user_id=42, score = R[42] @ sim_items. Mostrar top-10.
  5. Pearson + mean centering: R_centered = R - user_means.reshape(-1, 1) (cuidado con sparse — usar sklearn). Comparar recomendaciones con coseno vanilla.

📝 Homework verificable

Notebook con:

  1. Cargar MovieLens 1M (10× más grande que 100K).
  2. Implementar 2 recomendadores: user-based kNN (k=30) e item-based kNN (k=30).
  3. Split train/test con leave-one-out por user (el último rating de cada user va a test).
  4. Reportar MAP@10, NDCG@10, recall@10 para ambos sobre test (Clase 220).
  5. Comparativa: tiempo de entrenamiento, tiempo de predicción, calidad. Discutir por qué item-based suele ganar en producción.

Criterio de aceptación: ambos recomendadores entrenan en <5 min sobre 1M, recall@10 > 0.05, y el estudiante justifica la elección item-based para producción.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
MemoryError al construir n_users × n_users similarity Estás densificando. Fix: usar sklearn.metrics.pairwise.cosine_similarity(R, dense_output=False) o calcular por chunks.
Recomendaciones son siempre los items populares Sin top-K filter de neighbors, dominan items rateados por muchos. Fix: aplicar inverse popularity weighting o IDF-like (item_idf = log(N / item_count)).
Recall=0.0 sobre test Estás recomendando items que el user ya vio (que están en train). Fix: mask R[u] > 0 para excluirlos antes de top-N.
Pearson sobre rows con poca overlap da nan Si 2 users tienen <3 items en común, Pearson es inestable. Fix: minimum support (ignorar pairs con <5 overlap), o usar coseno.
Item-based sim_matrix de 100K × 100K Densa = 80 GB. Fix: top-K nearest neighbors only (NearestNeighbors). Guardar sparse con K=50.
Implicit feedback con coseno se sesga a items poco vistos Coseno normaliza, da peso a items raros. Fix: ALS implicit (Clase 217) o BPR ranking loss.

❓ Preguntas frecuentes

❓ ¿User-based o item-based?

Item-based en producción (Amazon, 2003). Razones: - Similitudes item-item cambian lento (un item es estable; un nuevo rating no mueve mucho). Pre-computable offline. - Similitudes user-user cambian con cada rating nuevo del user. - N items << N users en muchos casos (productos vs millones de clientes).

❓ ¿cosine_similarity o pearson_correlation?

Coseno por default. Pearson cuando el sesgo absoluto del usuario importa (algunos califican alto todo, otros bajo todo) — frecuente en sistemas de rating 1-5 explícito.

❓ ¿Implicit feedback se trata igual?

No. Con implicit, R[u, i] = 0 NO significa "dislike" — puede significar "no lo vio aún". Estrategias: BPR (Bayesian Personalized Ranking), ALS implicit con confidence weighting (Clase 217), o métricas top-N (NDCG@k) en vez de RMSE.

❓ ¿Cuándo CF se rompe?

(1) Cold-start total: user/item nuevo con 0 historia (Clase 221). (2) Sparsity extremo (>99.99%): similitudes son ruidosas. (3) Long-tail dominante: 1% de items reciben 80% del tráfico, recomendador converge a "los populares".

❓ ¿Surprise/LightFM/Implicit hacen esto por mí?

Sí (Clase 222). Surprise tiene KNNBasic/KNNWithMeans. Implicit es especialista en implicit feedback. LightFM combina CF + content (Clase 219).

❓ ¿Y si tengo 100M users × 10M items?

kNN no escala. Saltá directo a factorización de matrices con ALS distribuido (Spark ALS o Implicit als.AlternatingLeastSquares), o a embeddings deep (TwoTowers, BERT4Rec).

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 217 — Factorización de matrices: SVD, ALS