Python Data Science Program
📓 Abrir notebook en GitHub

Clase 064 — Class imbalance: SMOTE, ADASYN, class_weight, threshold tuning

Parte: 1 — Machine Learning Clásico · Fuente: Chawla et al. (2002) SMOTE + He et al. (2008) ADASYN + imbalanced-learn docs. ⏱️ Duración estimada: 80 min.

🎯 Objetivo

Tratar datasets desbalanceados —fraude (1 % positivo), churn (5 %), enfermedades raras—. Las trampas son sutiles: accuracy puede ser 99 % con un clasificador trivial. Cubrir las 4 estrategias estándar: class_weight, threshold tuning, oversampling (SMOTE, ADASYN), undersampling (Tomek, ENN). Y la decisión clave: ¿qué métrica reportar? (F1, PR-AUC, MCC, no accuracy).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Baseline sin tratamiento: LogisticRegression en creditcardfraud. Accuracy alto, recall pésimo.
  2. class_weight: LogisticRegression(class_weight='balanced'). Recall sube, precision baja.
  3. Threshold tuning: con probabilidades de predict_proba, barrer thresholds y plotear F1 vs threshold. Elegir el óptimo.
  4. SMOTE: from imblearn.over_sampling import SMOTE; X_res, y_res = SMOTE().fit_resample(X_train, y_train). Entrenar y evaluar.
  5. Pipeline imblearn: Pipeline([('smote', SMOTE()), ('clf', LogisticRegression())]). Importante: SMOTE solo se aplica en train (imblearn pipeline lo maneja).

📝 Homework verificable

Sobre creditcardfraud:

  1. 4 modelos: baseline, class_weight, SMOTE, SMOTETomek.
  2. Reportar precision, recall, F1, PR-AUC y MCC para cada uno.
  3. Curva PR de los 4 lado a lado.
  4. Threshold tuning sobre el mejor para maximizar F2 (favorece recall).

Criterio de aceptación: al menos uno de los tratamientos supera al baseline en F1 por ≥ 0.1; PR-AUC ≥ 0.8.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Accuracy 99.5 % en fraude con clasificador trivial Reporta accuracy en imbalance. Fix: usar PR-AUC, F1, MCC.
SMOTE aplicado antes de split Leakage: samples sintéticos derivados de test entran en train. Fix: SMOTE solo en train, dentro del pipeline imblearn.
Threshold default 0.5 con probabilidades calibradas raras Subóptimo. Fix: tunear sobre val.
SMOTE con features categóricas codificadas one-hot Interpola entre 0/1, sin sentido. Fix: SMOTENC (handles cat).
Oversampling para clase de 0.1 % a 50/50 Excesivo. Fix: ratio 1:3 o 1:5 suele ser suficiente.

❓ Preguntas frecuentes

❓ class_weight o SMOTE?

class_weight es más simple y barato. SMOTE puede ayudar en casos extremos o con árboles/ensembles. Probá ambos.

❓ ¿Cuándo PR-AUC vs ROC-AUC?

PR-AUC cuando imbalance fuerte (>10:1) — más sensible. ROC-AUC para casos balanceados o solo para comparar relativamente.

❓ ¿MCC vs F1?

MCC es simétrico (trata clases igual). F1 favorece la minoría. Para fraude/medical, MCC es más conservador.

❓ ¿SMOTE con DL?

Menos común — DL prefiere ajustar la loss (focal loss, weighted CE).

❓ ¿Undersampling pierde información?

Sí. Por eso es un last resort. SMOTE/oversampling sintético suele ser mejor.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 065 — Precision/Recall tradeoff