13 · Métricas de ranking top-k
Precision@k, recall@k, hit-rate, MAP y NDCG premian cada una algo distinto. A NDCG le importa no solo si el ítem correcto está en la lista, sino qué tan arriba.
Las métricas top-k convierten una lista ordenada en un número. Precision@k y recall@k preguntan cuántos ítems relevantes llegaron al top k; hit-rate pregunta si llegó ALGUNO; MAP y NDCG van más allá y premian ordenar ALTO los ítems relevantes — NDCG descontando cada acierto por el log de su posición.
Sin esto:
Optimiza la precisión simple y no podrás distinguir una lista que entierra el único ítem bueno en la posición 10 de una que lo pone en la posición 1 — aunque los usuarios solo miran lo de arriba.
Una vez apartas ítems relevantes por usuario (lección anterior), evalúas un recomendador según qué tan bien su lista ordenada top-k los recupera. Cada métrica codifica una pregunta distinta:
- Precision@k — de los k ítems que recomendé, ¿qué fracción era relevante? Premia no desperdiciar espacios. (k en el denominador.)
- Recall@k — de todos los ítems que eran relevantes, ¿qué fracción hice emerger en mi top k? Premia cubrir la verdad. (conteo de relevantes en el denominador.)
- Hit-rate@k — binaria: ¿aterrizó al menos un ítem relevante en el top k? La favorita indulgente del leave-one-out (con un solo ítem apartado, hit-rate@k = recall@k).
- MAP (Mean Average Precision) — promedia la precisión cada vez que aciertas un ítem relevante al recorrer la lista, y luego promedia sobre usuarios. Premia poner los ítems relevantes temprano y agruparlos.
- NDCG (Normalized Discounted Cumulative Gain) — suma una ganancia por cada ítem relevante, descontada por
1 / log2(posición + 1)de modo que un acierto en el rango 1 vale mucho más que en el rango 10, y luego normaliza por el mejor orden posible (ideal) para que el puntaje caiga en [0, 1].
La división crucial: precision/recall/hit-rate son métricas de conjunto — solo les importa si un ítem relevante está en el top k, no dónde. MAP y NDCG son conscientes del rango — subir un ítem relevante en la lista, incluso dentro del top k, las mejora. Como los usuarios hacen clic abrumadoramente cerca de arriba, las métricas conscientes del rango correlacionan mejor con el engagement real.
Abajo implementamos las cuatro desde cero y evaluamos dos listas ordenadas contra el mismo conjunto relevante apartado. Luego movemos un ítem relevante del rango 4 al rango 1 y vemos subir NDCG (y MAP) mientras precision@k se queda plana — el sentido entero de una métrica descontada por posición.
Python (in browser)
precision@k, recall@k, hit-rate, MAP y NDCG desde cero. La lista B ordena los mismos ítems relevantes más arriba — las métricas de conjunto quedan planas, pero MAP y NDCG suben.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
scikit-learn trae ndcg_score; los frameworks completos de recsys (RecBole, Surprise) reportan precision/recall/NDCG/hit-rate sobre todos los usuarios apartados por ti.
Mueves un ítem relevante apartado del rango 4 al rango 1 dentro de tu lista top-5. ¿Qué métrica está GARANTIZADA que mejora?
- Precision@k, recall@k y hit-rate son métricas de CONJUNTO — solo les importa si un ítem relevante está en el top k, no dónde.
- MAP y NDCG son CONSCIENTES DEL RANGO: NDCG descuenta cada acierto por 1/log2(rango+1), así que las posiciones más altas puntúan más.
- Reporta NDCG@k como métrica principal — sigue el engagement real del tope de la lista mejor que las métricas de conjunto.
NDCG es la métrica de ranking estándar en los leaderboards de búsqueda y recsys (MovieLens, datasets de Amazon, el RecSys challenge); precision@k/recall@k encabezan las tablas de resultados de la mayoría de papers.
Si lo quitas: Sin métricas conscientes del rango optimizas la pertenencia al conjunto y despliegas listas que técnicamente contienen el ítem bueno pero lo entierran donde nadie hace scroll.