Métricas de Ranking

Eval

Métricas de Ranking

まとめ
  • Clasificar las métricas de ranking y explicar su papel en recomendación, búsqueda y publicidad.
  • Comparar NDCG, MAP, Recall@k y Hit Rate mediante un ejemplo práctico.
  • Indicar cómo elegir un conjunto de métricas alineado con los KPI del negocio y cómo reportar mejoras.

Panorama de la evaluación de rankings #

Los modelos de ranking asignan puntuaciones para que los elementos “mejores” aparezcan primero. En recomendadores y buscadores, la calidad de los primeros resultados impulsa la interacción y los ingresos, por lo que la evaluación debe concentrarse en esas primeras posiciones. Este capítulo presenta las familias de métricas más comunes y muestra cómo se complementan.


Categorías de métricas #

1. Métricas list-wise #

  • NDCG / DCG (NDCG): aplica un descuento logarítmico, dando más peso a los primeros puestos.
  • MAP (Mean Average Precision) (MAP): promedia la precisión de cada ítem relevante; ideal cuando hay múltiples aciertos por consulta.

2. Métricas top-k #

  • Recall@k (Recall@k): fracción de elementos relevantes capturados en el top k.
  • Hit Rate / Hit@k (Hit Rate): indica si al menos un elemento relevante aparece en el top k.
  • Top-k Accuracy (Top-k Accuracy): útil cuando se reutiliza un clasificador como recomendador top-k.

3. Métricas pair-wise #

  • AUC (versión ranking): probabilidad de que un ítem relevante quede por encima de uno irrelevante.
  • Tau de Kendall / Correlación de Spearman: comparan el ordenamiento completo.

Comparar métricas de ranking #

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import average_precision_score, ndcg_score

y_true = np.array(
    [
        [1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
    ]
)
y_score = np.array(
    [
        [0.9, 0.3, 0.2, 0.1, 0.6, 0.05, 0.03, 0.02, 0.01, 0.005],
        [0.4, 0.8, 0.2, 0.1, 0.05, 0.6, 0.03, 0.02, 0.01, 0.005],
        [0.2, 0.1, 0.85, 0.05, 0.03, 0.02, 0.7, 0.01, 0.005, 0.003],
    ]
)

def recall_at_k(y_true_row: np.ndarray, y_score_row: np.ndarray, k: int) -> float:
    top_k_idx = np.argsort(y_score_row)[::-1][:k]
    positives = y_true_row.sum()
    if positives == 0:
        return 0.0
    return y_true_row[top_k_idx].sum() / positives

def hit_rate_at_k(y_true_row: np.ndarray, y_score_row: np.ndarray, k: int) -> float:
    top_k_idx = np.argsort(y_score_row)[::-1][:k]
    return float(y_true_row[top_k_idx].sum() > 0)

ks = [3, 5]
ndcg5 = ndcg_score(y_true, y_score, k=5)
map_score = np.mean(
    [average_precision_score(t, s) for t, s in zip(y_true, y_score)]
)
recalls = [np.mean([recall_at_k(t, s, k) for t, s in zip(y_true, y_score)]) for k in ks]
hits = [np.mean([hit_rate_at_k(t, s, k) for t, s in zip(y_true, y_score)]) for k in ks]

metrics = {
    "NDCG@5": ndcg5,
    "MAP": map_score,
    "Recall@3": recalls[0],
    "Recall@5": recalls[1],
    "Hit@3": hits[0],
    "Hit@5": hits[1],
}

fig, ax = plt.subplots(figsize=(6.5, 3.8))
ax.bar(metrics.keys(), metrics.values(), color="#f97316", alpha=0.85)
ax.set_ylim(0, 1.05)
ax.set_ylabel("Puntuación")
ax.set_title("Métricas de ranking en un ejemplo de recomendaciones")
ax.grid(axis="y", alpha=0.3)
plt.xticks(rotation=25)
plt.tight_layout()
Gráfico de métricas de ranking

Cada métrica destaca una faceta distinta: Recall/Hit miden cobertura, mientras que MAP y NDCG valoran el orden. Combina ambas familias para evaluar mejoras.


Cómo elegir métricas #

  1. Define la unidad de evaluación
    Determina si evaluarás por consulta, usuario o sesión.
  2. Aclara qué se considera relevante
    Clics, compras, “me gusta”: cada señal cambia la interpretación.
  3. Alinea k con la interfaz
    Usa un corte que coincida con cuántos elementos se muestran realmente.
  4. Considera el valor de negocio
    Pondera ítems de alto valor si algunos resultados importan más.
  5. Conecta métricas offline y KPI online
    Valida las mejoras offline con test A/B y monitoriza la correlación.

Referencia rápida #

CategoríaMétricaPáginas relacionadasNotas
List-wiseNDCG / DCGNDCGPremia colocar ítems valiosos al inicio
List-wiseMAPMAPÚtil cuando hay varios ítems relevantes
Top-kRecall@k / Hit@kRecall@k / Hit RateSe centra en la cobertura del top mostrado
Top-kTop-k AccuracyTop-k AccuracyConecta clasificación y ranking
Pair-wiseAUCROC-AUCProbabilidad de que un positivo supere a un negativo

Lista de verificación #

  • ¿Se definió qué es relevante y la unidad de evaluación?
  • ¿Se eligió el valor de k acorde a la interfaz o superficie de negocio?
  • ¿Se reportaron métricas de cobertura (Recall/Hit) y de orden (NDCG/MAP)?
  • ¿Se comparó contra baselines y se siguió el impacto online?
  • ¿Se comprobó que los datos de evaluación reflejan las tendencias actuales?