3 · Datasets desbalanceados + SMOTE
Cuando el 99% de las etiquetas son negativas, la exactitud es una mentira — aprende a detectarlo y corregirlo.
Cuando el 99% de tus etiquetas son negativas, la exactitud es una mentira — y tu modelo aprenderá 'predecir negativo para todo' como un atajo casi perfecto.
Sin esto:
Sin rebalanceo o métricas apropiadas, tu clasificador de fraude/enfermedad/churn logra 99% de exactitud y detecta cero positivos.
En un dataset balanceado, las proporciones de clase son aproximadamente iguales (digamos 50/50). En el mundo real, la clase interesante es casi siempre rara:
- Transacciones fraudulentas: ~0.1% de todas las transacciones.
- Diagnósticos de cáncer: frecuentemente < 1% de la población evaluada.
- Eventos de churn: típicamente 2–5% de una base de suscriptores.
- Clics en anuncios: frecuentemente < 0.5% de las impresiones.
Un clasificador ingenuo que predice "clase mayoritaria para cada muestra" logra 99% de exactitud en un dataset 99/1 — y es completamente inútil. Esta es la paradoja de la exactitud, y es la primera trampa en la que cae todo ingeniero de ML.
La solución tiene dos partes:
- Cambiar a las métricas correctas: precisión, recall, F1, exactitud balanceada, ROC-AUC, PR-AUC.
- Rebalancear los datos o la pérdida: pesos de clase, sobremuestreo (SMOTE), submuestreo.
Python (in browser)
La línea base de clase mayoritaria logra 99% de exactitud prediciendo cero positivos — una demostración perfecta de por qué la exactitud no tiene sentido con datos desbalanceados.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`class_weight='balanced'` penaliza la mala clasificación de la clase minoritaria proporcionalmente más — el recall sube a costa de algo de precisión.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
SMOTE a mano: para cada punto minoritario, elige un vecino aleatorio, luego muestrea un punto nuevo a lo largo de la línea conectora en una fracción aleatoria entre 0 y 1.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La jerarquía: pesos de clase → SMOTE → submuestreo. Usa la intervención más simple que logre un recall minoritario adecuado.
En un dataset desbalanceado 99/1, un modelo que siempre predice 'mayoría' ¿qué exactitud logra?
- La **paradoja de la exactitud**: en un dataset 99/1, un modelo que predice 'siempre mayoría' logra 99% de exactitud y detecta cero positivos — la exactitud es la métrica incorrecta.
- Usa **exactitud balanceada**, **F1**, **ROC-AUC** y **PR-AUC** para problemas desbalanceados. El PR-AUC es el más honesto para escenarios de eventos raros.
- Jerarquía de corrección: prueba `class_weight='balanced'` primero → SMOTE segundo → submuestreo solo si la clase mayoritaria es masiva.
- SMOTE sintetiza nuevos puntos minoritarios interpolando entre vecinos minoritarios existentes. **Siempre aplícalo DESPUÉS del split train/test, solo al conjunto de entrenamiento.**
Detección de fraude (~0.1% positivos), diagnóstico médico de enfermedades raras, predicción de churn, predicción de click-through. Todo clasificador binario de producción en eventos raros tiene ALGUNA forma de manejo de desbalance — pesos de clase, focal loss o remuestreo.
Si lo quitas: Tu modelo 'funciona' en métricas de entrenamiento pero es operacionalmente inútil porque nunca marca los casos que realmente te importan.