Resumen
Este documento define qué se mide, cómo se mide y qué umbrales aplican para evaluar la calidad de los modelos de recomendación del proyecto Pedido Sugerido. Cubre tres dimensiones independientes:
- Métricas de calidad — evalúan qué tan buenas son las recomendaciones del modelo (Nivel 1-2).
- Métricas de drift — detectan cuándo los datos o el comportamiento del modelo cambian en producción (Nivel 3).
- Criterios de aprobación — definen cuándo un modelo nuevo se puede promover a producción (Nivel 2-3).
Hallazgo importante del inventario: el pipeline canónico actual (cicd/src/PS_MP_*.py) no computa métricas de calidad de modelo. La función calcular_metricas_y_ensamblar en PS_MP_3_reglas_negocio.py calcula segmentación de clientes (irregularidad, antigüedad), no métricas de recomendación (NDCG, Precision, etc.).
→ Implicación: la implementación de este framework de métricas es parte del alcance del Nivel 2 del proyecto. El AF define el qué/cómo/cuánto; la implementación efectiva entra en el RTM (DOC-AF-07) con criterio testeable.
Métricas de calidad de recomendación
Las tres métricas que la propuesta v2 establece como criterio de éxito:
1. NDCG@10 · Normalized Discounted Cumulative Gain
| Atributo | Valor |
|---|---|
| Definición | Métrica de ranking que valora más las recomendaciones relevantes en las primeras posiciones del top-K. Normaliza al rango [0, 1] · valor más alto = mejor ranking. |
| Fórmula | NDCG@K = DCG@K / IDCG@K · donde DCG@K = Σ rel_i / log₂(i+1) para i=1..K |
| K usado | 10 (top-10 productos recomendados por cliente) |
| Cómo se mide | Comparar las recomendaciones del modelo contra las compras reales del cliente en una ventana posterior (holdout temporal · típicamente 30 días). |
| Relevancia (rel_i) | Binaria · 1 si el cliente compró el producto en el holdout, 0 si no. Alternativa: ponderada por cant_cajafisicavta. |
| Baseline a obtener | Por país, computado durante el Desarrollo Nivel 1 al deployar el modelo actual. Documentado en DT-N2. |
| Umbral de promoción a producción | Modelo nuevo debe tener NDCG@10 ≥ baseline + 0.01 (según propuesta v2) |
| Frecuencia de cómputo | Semanal (matchea cadencia del pipeline de entrenamiento del Nivel 2) |
2. Precision@K
| Atributo | Valor |
|---|---|
| Definición | Fracción de productos en el top-K recomendado que el cliente efectivamente compró en el holdout. |
| Fórmula | Precision@K = #relevantes_en_top-K / K |
| K usado | 5 y 10 (dos valores reportados) |
| Cómo se mide | Igual que NDCG@10 · holdout temporal de 30 días. |
| Baseline a obtener | Por país · DT-N2 |
| Umbral de promoción | Precision@5 ≥ baseline · Precision@10 ≥ baseline (empate aceptable; el criterio fuerte es NDCG@10) |
| Frecuencia de cómputo | Semanal |
3. Coverage
| Atributo | Valor |
|---|---|
| Definición | Fracción del catálogo de SKUs que el modelo efectivamente recomienda al menos una vez en el conjunto de clientes evaluados. |
| Fórmula | Coverage = |
| Cómo se mide | Sobre la unión de todas las recomendaciones top-10 generadas en un run del pipeline. |
| Baseline a obtener | Por país · DT-N2 |
| Umbral mínimo | Coverage ≥ 30% (propuesto · validar con AJE en Sesión 2) |
| Razón del umbral | Coverage bajo (< 30%) sugiere que el modelo está sesgado hacia los SKUs más populares y deja sin exposición a long-tail · riesgo de comoditización |
| Frecuencia de cómputo | Semanal |
Métricas complementarias (consideradas pero fuera del scope del Nivel 2)
| Métrica | Descripción | Cuándo evaluar |
|---|---|---|
| Recall@K | Fracción de los productos relevantes que aparecen en el top-K | Si AJE solicita medir "no perdimos oportunidades" |
| MAP (Mean Average Precision) | Promedio de precisiones a cada relevante en el ranking | Útil para comparar variantes en grid de hiperparámetros (Nivel 3) |
| Diversity | Distancia promedio entre SKUs recomendados al mismo cliente | Si AJE quiere combatir homogeneización del catálogo |
| Novelty | Inversa de la popularidad promedio de SKUs recomendados | Complementaria a Coverage |
| Serendipity | Combinación Novelty × Relevancia | Avanzada · raramente trackeada en producción |
Métricas de drift · Nivel 3
El Nivel 3 incluye reentrenamiento automático por drift. Esto requiere distinguir tres tipos de drift, cada uno con su propio detector y umbral.
1. Schema drift
| Atributo | Valor |
|---|---|
| Detector | SageMaker Model Monitor (Data Quality Monitor) |
| Qué observa | Columnas faltantes · columnas nuevas · tipos cambiados · cardinalidad anormal de categóricos |
| Threshold | Cualquier cambio en el schema vs baseline registrado en Model Monitor |
| Acción al disparar | Alerta crítica SNS · halt del pipeline hasta revisión humana. No se reentrenamiento automático · el equipo debe validar si es un cambio legítimo del upstream o un bug |
| Frecuencia de cómputo | Cada ejecución del pipeline diario |
2. Data drift (distribuciones de features)
| Atributo | Valor |
|---|---|
| Detector | SageMaker Model Monitor (Data Quality Monitor con estadísticas custom) |
| Pruebas estadísticas | Por variable: |
| • Continuous — Kolmogorov-Smirnov (KS) test · p-value < 0.05 indica drift | |
| • Categorical — Chi-square test · p-value < 0.05 indica drift | |
| • Múltivariada — Population Stability Index (PSI) · PSI > 0.25 indica drift fuerte | |
| Baseline | Estadísticas computadas sobre los datos del último entrenamiento aprobado (stored en S3 como JSON) |
| Threshold | PSI > 0.25 en 2+ features clave (features definidas en DT-N2) dispara reentrenamiento |
| Frecuencia de cómputo | Diaria (en el pipeline de inferencia) |
3. Concept drift / Model performance drift
| Atributo | Valor |
|---|---|
| Detector | Cálculo offline de NDCG@10 vs baseline, semanal |
| Qué observa | Degradación de la métrica de calidad sin cambio en schema/data drift |
| Threshold | NDCG@10 cae > 5% vs el último baseline aprobado durante 2 semanas consecutivas |
| Acción al disparar | Reentrenamiento automático (Nivel 3 retraining pipeline) |
| Frecuencia de cómputo | Semanal |
Trigger consolidado de reentrenamiento
El pipeline de retraining se dispara cuando al menos una condición se cumple:
- ⚠️ Schema drift → halt + alerta (no reentreno)
- 🔄 Data drift PSI > 0.25 en 2+ features clave → reentreno
- 📉 NDCG@10 cae > 5% durante 2 semanas → reentreno
- 📅 Reentreno preventivo: cada 30 días aunque no haya drift detectado (garantiza modelo no se "rancea")
Cooldown
Tras un reentreno exitoso, no se dispara otro reentreno por al menos 14 días (evita oscilación en escenarios borderline).
Criterios de aprobación de modelo
Cuando un modelo nuevo entra al Model Registry (Nivel 2), pasa por una secuencia de gates antes de promoverse a producción.
Gate 1 · Tests de regresión automáticos
| Test | Criterio | Bloqueo |
|---|---|---|
| Schema del output | Output tiene las columnas esperadas con tipos correctos | Sí |
| Distribución de Coverage | Coverage ≥ 30% | Sí |
| Volumen de recomendaciones | Genera recomendaciones para ≥ 95% de los clientes elegibles | Sí |
| Latencia de inferencia | p99 ≤ 200ms por cliente | Solo Nivel 3 |
| Cost guard | Costo total del run estimado ≤ 1.5× del run baseline | Solo Nivel 3 |
Gate 2 · Métricas de calidad vs baseline
| Métrica | Criterio | Bloqueo |
|---|---|---|
| NDCG@10 | ≥ baseline + 0.01 | Sí |
| Precision@5 | ≥ baseline | Sí (suave) |
| Precision@10 | ≥ baseline | Sí (suave) |
| Coverage | ≥ baseline · acepta delta -2% si NDCG mejora ≥ 0.02 | Sí (con override) |
Si las métricas no superan, el modelo se marca Rejected automáticamente y queda en el Registry como referencia histórica.
Gate 3 · Aprobación humana
Cuándo se requiere (propuesta del AF, a confirmar con AJE en Sesión 2):
- Nivel 2 · siempre. El analista de Athenea aprueba el modelo manualmente antes de promoverlo a producción.
- Nivel 3 · solo cuando el reentreno fue disparado por concept drift (degradación de métricas). Los reentrenos por data drift o preventivos pueden promoverse automáticamente si pasan Gate 1 + Gate 2.
Mecanismo de aprobación:
- Modelo entra al Registry con
ModelApprovalStatus=PendingManualApproval. - Notificación SNS al analista con link al Model Registry.
- Analista revisa métricas y aprueba/rechaza desde la consola SageMaker o vía CLI.
Workflow visual
Modelo entrenado
│
▼
[ Gate 1 · Tests regresión ]
│
✓ │ ✗ → Rejected
▼
[ Gate 2 · Métricas vs baseline ]
│
✓ │ ✗ → Rejected
▼
[ Gate 3 · Aprobación humana ]
│
✓ │ ✗ → Rejected
▼
Approved
│
▼
Deploy a producción (endpoint o batch pipeline)
Storage de baselines y métricas
| Item | Ubicación |
|---|---|
| Baseline de schema y data quality | s3://aje-dev-analytics-artifacts-s3/ps-pipeline/<PAIS>/baselines/data_quality/ (generado por SageMaker Model Monitor) |
| Baseline de model quality (NDCG, Precision, Coverage) | s3://aje-dev-analytics-artifacts-s3/ps-pipeline/<PAIS>/baselines/model_quality/<fecha>.json |
| Histórico de métricas | DynamoDB aje-dev-ps-modelmetrics-dynamodb (nueva, parte del Nivel 2) |
| Reportes de drift | s3://aje-dev-analytics-artifacts-s3/ps-pipeline/<PAIS>/drift_reports/<fecha>/ |
| Dashboards CloudWatch con métricas | aje-dev-ps-modelquality-dashboard-cloudwatch (nuevo, parte del Nivel 2) |
Esto se reconfirma en DOC-AF-08 (Catálogo de monitoring) con las alarmas correspondientes.
Métricas operacionales (complementarias a las de modelo)
Además de las métricas de calidad del modelo, el pipeline tiene métricas operacionales que también requieren tracking. Estas se cubren en detalle en DOC-AF-08 Catálogo de monitoring, pero se mencionan acá por completitud:
| Métrica operacional | Threshold | Severity |
|---|---|---|
| ExecutionsFailed por hora | > 0 | Critical |
| ExecutionsStopped por hora | > 0 | Warning |
| Duración del step Limpieza | > 15 min | Warning |
| Duración del step Modelado | > 30 min | Warning |
| Duración total del pipeline por país | > 60 min | Warning |
| Latencia entre cron y disparo del SM pipeline | > 5 min | Warning |
| Costo mensual del pipeline | > USD X (threshold a definir) | Warning |
Riesgos identificados
| # | Riesgo | Probabilidad | Impacto | Mitigación |
|---|---|---|---|---|
| 1 | Baselines no disponibles al inicio del Nivel 2 porque el modelo actual no se ha evaluado nunca contra holdout temporal | Alta | Medio · retrasa la definición de umbrales hasta tener 2-3 semanas de datos | Computar baselines durante la primera semana del Desarrollo Nivel 1 (antes de que arranque Nivel 2) |
| 2 | AJE no tiene baseline cuantitativo del modelo TEST de México · solo "sabe que funciona" | Media | Alto · sin baseline, "modelo nuevo supera al actual en ≥ 0.01" no se puede validar | Documentar en RTM como acción preparatoria del Nivel 1: ejecutar el modelo canónico actual contra holdout para fijar baseline pre-Nivel 2 |
| 3 | Umbral Coverage ≥ 30% puede ser arbitrario según el tipo de catálogo de cada país | Media | Bajo | Validar el umbral por país durante DT-N2 (no asumir uno global) |
| 4 | Tests de regresión no especificados en el código actual | Conocido | Medio | Parte del alcance del Nivel 1: agregar tests Python que validen schema y volumen del output |
| 5 | Notificaciones SNS de aprobación de modelo dependen de que AJE configure los suscriptores correctos | Conocido | Bajo | DOC-AF-08 documenta la lista de suscriptores · AJE confirma los emails en Sesión 1 |
Próximos pasos
- Sesión 2 (Mié 20-may) · validar con AJE:
- El umbral Coverage ≥ 30% (o ajustar por país)
- El criterio de bloqueo de Gate 2 sobre Precision (suave vs duro)
- La política de aprobación humana en Nivel 2 vs Nivel 3
- La frecuencia de cómputo semanal de NDCG@10
- Durante Desarrollo Nivel 1 · computar baselines reales por país y poblar las tablas de este documento con valores concretos.
- Touchpoint Nivel 2 (Lun 15-jun) · confirmar el storage de baselines, el workflow de aprobación humana y los thresholds finales antes de implementar.
- Touchpoint Nivel 3 (Lun 6-jul) · confirmar los thresholds de drift con data observada de 4 semanas en Nivel 1+2 (no asumidos).