Conjuntos de datos desbalanceados: estrategias completas para gestionarlos eficazmente

Comprender los datasets desequilibrados y dominar todas las técnicas para entrenar modelos fiables en clasificación.

Conjuntos de datos desbalanceados: estrategias completas para gestionarlos eficazmente

En el ámbito del aprendizaje automático, los conjuntos de datos desequilibrados constituyen un desafío diario. Cuando una clase representa el 99 % de los ejemplos y la otra solo el 1 %, los algoritmos estándar suelen fallar al detectar los casos raros. Este artículo le guía paso a paso para identificar el problema, elegir las métricas adecuadas y aplicar las técnicas más eficaces.

¿Qué es un dataset desequilibrado y por qué plantea un problema?

Un dataset está desequilibrado cuando la distribución de las clases es muy desigual. Abundan los ejemplos concretos: detección de fraude bancario (0,1 % de fraudes), diagnóstico de enfermedades raras, predicción de churn de clientes, filtrado de spam o detección de defectos en una cadena industrial. En todos estos casos, el modelo «hace trampa» al predecir sistemáticamente la clase mayoritaria, obteniendo una accuracy elevada mientras falla por completo en los casos críticos.

La trampa de la accuracy y las métricas a priorizar

La accuracy es engañosa porque oculta los errores en la clase minoritaria. Es necesario utilizar la matriz de confusión, la precisión, el recall, el score F1, la balanced accuracy, el coeficiente kappa de Cohen y sobre todo la PR-AUC (más pertinente que la ROC-AUC cuando las clases están muy desequilibradas). Se prioriza el recall cuando los falsos negativos son costosos (enfermedad no detectada) y la precisión cuando lo son los falsos positivos (alarma inútil).

Técnicas de remuestreo: sobremuestreo y submuestreo

El sobremuestreo consiste en aumentar la clase minoritaria: duplicación simple, SMOTE, ADASYN o Borderline-SMOTE. El submuestreo reduce la clase mayoritaria mediante Random Undersampling, Tomek Links, NearMiss o Edited Nearest Neighbours (ENN). Las combinaciones como SMOTETomek o SMOTEENN ofrecen a menudo un buen compromiso. Sin embargo, hay que prestar atención al riesgo de sobreajuste con el sobremuestreo y a la pérdida de información con el submuestreo.

Enfoques a nivel del algoritmo

En lugar de modificar los datos, se puede actuar sobre el algoritmo en sí mismo. La mayoría de las bibliotecas permiten utilizar el parámetro class_weight o cost-sensitive learning. El ajuste del umbral de decisión (threshold moving) después del entrenamiento es simple y eficaz. Finalmente, la Focal Loss, popular en detección de objetos, reduce la influencia de los ejemplos fáciles y concentra el aprendizaje en los casos difíciles.

Métodos de ensamble adaptados a datos desequilibrados

Los métodos de ensamble especializados combinan varios clasificadores entrenados sobre subconjuntos equilibrados. BalancedRandomForest, EasyEnsemble, RUSBoost y BalancedBagging son implementaciones robustas que integran de manera nativa el remuestreo y generalmente mejoran la detección de la clase rara.

¿Cuándo pasar al marco de detección de anomalías?

Cuando la clase positiva representa menos del 1 % de los datos, las técnicas de clasificación supervisada alcanzan sus límites. Se vuelve pertinente reformular el problema en detección de anomalías u outliers con algoritmos como Isolation Forest, One-Class SVM o Autoencoders, que aprenden únicamente sobre la clase mayoritaria.

Buenas prácticas de validación para evitar fugas de datos

El remuestreo nunca debe aplicarse sobre el conjunto de prueba o de validación. Utilice siempre un pipeline (imblearn.Pipeline) que aplique SMOTE únicamente sobre los folds de entrenamiento. La stratified k-fold preserva la proporción de clases en cada pliegue. Estas precauciones evitan una fuga de datos y un rendimiento sobreestimado.

Ejemplo concreto de código con imbalanced-learn

from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
X, y = make_classification(n_classes=2, weights=[0.95, 0.05], n_samples=5000, random_state=42)
pipe = Pipeline([
    ('smote', SMOTE(random_state=42)),
    ('clf', RandomForestClassifier(class_weight='balanced', random_state=42))
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
y_pred = cross_val_predict(pipe, X, y, cv=cv)
print(classification_report(y, y_pred))
  • Verificar siempre la distribución de las clases antes de cualquier modelado.
  • Elegir las métricas en función del costo empresarial de los errores.
  • Aplicar el resampling exclusivamente en el pipeline de entrenamiento.
  • Probar varias técnicas (SMOTE, class_weight, threshold tuning) y comparar las PR-AUC.
  • Utilizar la validación cruzada estratificada para garantizar resultados fiables.
  • Documentar la elección final y sus hipótesis para la reproducibilidad.

Al aplicar estas buenas prácticas, transformarás un dataset desequilibrado en un activo en lugar de un obstáculo. La clave reside en la combinación juiciosa de métricas adaptadas, del resampling controlado y de los algoritmos cost-sensitive. Prueba estos enfoques en tus propios datos y mide la mejora concreta del recall y de la PR-AUC.

💬 ¿Una pregunta o ganas de ir más lejos? Únete a la comunidad en Discord : https://discord.gg/GwhUKccQcM