Python Data Science Program
📓 Abrir notebook en GitHub

Clase 224 — Métricas de fairness: demographic parity, equalized odds, calibration

Parte: 7 — Ética, Fairness y Privacidad · Fuente: Barocas, Hardt, Narayanan — Fairness and Machine Learning cap. 3 + Hardt, Price, Srebro (NeurIPS 2016) Equality of Opportunity in Supervised Learning. ⏱️ Duración estimada: 75 min.

🎯 Objetivo

Pasar de "el modelo es injusto" a medirlo con un número. Implementar las tres familias de métricas grupales que dominan la literatura — demographic parity, equalized odds, calibration — sobre un dataset binario con atributo protegido, y demostrar numéricamente el teorema de imposibilidad de Kleinberg-Mullainathan-Raghavan / Chouldechova (2017): salvo casos triviales, no se pueden satisfacer las tres a la vez.

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

# Tema Por qué importa
1 Atributo protegido A y notación Y / Ŷ / Ŝ Sin notación común no se discute fairness; A puede ser género, raza, edad, código postal proxy.
2 Demographic parity (statistical parity) La métrica más antigua (regla del 80%, US EEOC); ignora el ground truth.
3 Equal opportunity y equalized odds (Hardt 2016) Condicionan en Y — corrigen el defecto de DP cuando las base-rates difieren.
4 Calibration por grupo (Chouldechova 2017) El score debe significar lo mismo en cada grupo; lo que reclamó ProPublica vs COMPAS.
5 Teorema de imposibilidad (KMR / Chouldechova 2017) Si las base-rates difieren, DP + equalized odds + calibration son mutuamente incompatibles.
6 Post-processing: threshold por grupo Mitigación más simple; revela explícitamente el trade-off.

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Selection rate por grupo: entrenar LogisticRegression baseline. Calcular P(Ŷ=1|A=0) y P(Ŷ=1|A=1) y el DP_gap. ¿Cumple regla del 80%?
  2. TPR y FPR por grupo: armar confusion_matrix separada por grupo. Calcular equal_opportunity_gap = |TPR_0 − TPR_1| y equalized_odds_gap = max(|TPR_diff|, |FPR_diff|).
  3. Calibration curves por grupo: binning de scores en 10 bins. Para cada bin y cada grupo, graficar mean(y_true) vs mean(y_score). ¿Las curvas coinciden?
  4. Romper calibración: ajustar threshold por grupo (t_0, t_1) tal que se cumpla DP exacta. Recalcular calibración — debe degradarse. (Demostración numérica del teorema.)
  5. Post-processing Hardt: buscar (t_0, t_1) que minimicen equalized_odds_gap y reportar el costo en accuracy global. Tabla: baseline vs DP-fixed vs EO-fixed.

📝 Homework verificable

Notebook con:

  1. Cargar Adult Census (UCI). Atributo protegido: sex. Target: income > 50K.
  2. Entrenar baseline LogisticRegression + reportar accuracy, AUC.
  3. Calcular las tres métricas: DP_gap, equal_opportunity_gap, equalized_odds_gap y calibration_gap (max |calibration(A=0) − calibration(A=1)| sobre bins).
  4. Implementar post-processing con threshold por grupo que minimice EO_gap sujeto a accuracy_drop ≤ 3pp.
  5. Tabla final: 3 modelos (baseline, DP-mitigated, EO-mitigated) × 5 métricas (accuracy, AUC, DP_gap, EO_gap, calibration_gap). Discutir cuál elegirías y por qué — no hay respuesta universal.

Criterio de aceptación: las 4 métricas implementadas a mano (no llamando a fairlearn), el EO_gap mitigado < 0.05, y un párrafo justificando la elección de métrica en función del dominio de aplicación (crédito vs admisión universitaria vs medicina).

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
DP_gap = 0 pero el modelo es claramente injusto DP ignora el ground truth — si las base rates difieren, forzar DP puede empeorar la utilidad para el grupo desfavorecido. Fix: reportar también equal opportunity.
Calibration "perfecta" pero TPR diferente entre grupos Es el resultado natural cuando las base rates difieren — el teorema de imposibilidad en acción. Fix: documentar el trade-off explícitamente, no esconderlo.
Quitar el atributo protegido del input "soluciona" el problema Fairness through unawareness — no funciona: zip code, nombre, historial son proxies. Fix: medir igual con A presente.
Threshold único 0.5 para todos los grupos Asume que los scores significan lo mismo en cada grupo. Fix: medir calibración antes de asumirlo.
Usar accuracy global para comparar fairness Accuracy global puede subir y empeorar al grupo minoritario simultáneamente (Simpson). Fix: reportar accuracy por grupo.
MetricFrame de fairlearn devuelve nan Algún grupo tiene 0 positivos predichos o 0 reales. Fix: filtrar splits estratificados; revisar tamaño mínimo por grupo (>30).

❓ Preguntas frecuentes

❓ ¿Cuál de las tres métricas uso?

Depende del dominio. Crédito o contratación: equal opportunity (no negarle empleo a quien sí calificaría). Justicia penal / riesgo de reincidencia: calibration + FPR equal (el debate ProPublica vs COMPAS giró exactamente sobre cuál priorizar). Publicidad: DP suele alcanzar. Pero la elección es política, no técnica.

❓ ¿Demographic parity no es siempre lo que queremos?

No. Si la base rate real difiere entre grupos (ej. distribución de ingresos), DP puede forzar al modelo a aceptar candidatos peores de un grupo y rechazar mejores de otro. Equal opportunity suele ser más defendible.

❓ ¿El teorema de imposibilidad significa que fairness es imposible?

No — significa que no se pueden satisfacer las tres simultáneamente cuando las base rates difieren. Hay que elegir cuál priorizar, y documentarlo. El paper de Chouldechova (2017) es lectura obligada.

❓ ¿fairlearn o aif360?

fairlearn para empezar (API más limpia, integrada con sklearn). aif360 cuando se necesite catálogo amplio de mitigadores (pre/in/post-processing) y métricas exóticas. Ninguna sustituye entender las definiciones.

❓ ¿Y la fairness individual?

Otra familia (Dwork et al. 2012): "individuos similares deben recibir predicciones similares". Más difícil de operacionalizar (requiere métrica de similaridad justificable) y queda fuera del alcance de esta clase. Ver Clase 225-227 para privacy y Clase 228 para causal fairness.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 225 — Privacidad diferencial: intro