Conjuntos de datos desequilibrados: cómo gestionarlos eficazmente
Guía completa para comprender y tratar los datasets desequilibrados en IA con métricas, técnicas y ejemplos concretos.
Los conjuntos de datos desequilibrados son un desafío común en inteligencia artificial. Cuando una clase representa el 99 % de los ejemplos y la otra solo el 1 %, los modelos estándar suelen fallar al detectar los casos raros. Este fenómeno afecta a numerosos dominios concretos y requiere enfoques específicos para evitar predicciones sesgadas.
¿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. Por ejemplo, en la detección de fraude bancario, menos del 0,5 % de las transacciones son fraudulentas. En medicina, la detección de enfermedades raras como ciertos cánceres afecta a veces a 1 paciente de cada 1000. El churn de clientes, el spam o los defectos industriales siguen el mismo esquema.
El modelo « hace trampa » entonces al predecir sistemáticamente la clase mayoritaria. Obtiene una accuracy elevada sin detectar en absoluto los casos minoritarios, lo que hace que el sistema sea inutilizable en la práctica.
La trampa de la accuracy y las métricas a priorizar
La accuracy es engañosa porque refleja principalmente el rendimiento en la clase mayoritaria. Por lo tanto, hay que utilizar métricas más adecuadas: la matriz de confusión, la precisión, el recall (recall), el score F1, la balanced accuracy, el coeficiente kappa de Cohen y, sobre todo, la PR-AUC (área bajo la curva precisión-recall), que suele ser más pertinente que la ROC-AUC en caso de fuerte desequilibrio.
- Prioriza el recall cuando los falsos negativos son costosos (enfermedad no detectada).
- Prioriza la precisión cuando los falsos positivos son costosos (alarma de fraude innecesaria).
Técnicas de remuestreo
El remuestreo modifica la distribución de las clases. El oversampling duplica o genera ejemplos minoritarios (SMOTE, ADASYN, Borderline-SMOTE). El undersampling reduce la clase mayoritaria (Random Undersampling, Tomek Links, NearMiss, ENN). Las combinaciones como SMOTETomek o SMOTEENN suelen ofrecer un buen compromiso.
- Ventajas : mejora la detección de la clase rara.
- Riesgos : sobreajuste con duplicación simple, pérdida de información con undersampling excesivo.
Enfoques a nivel de algoritmo
En lugar de modificar los datos, se puede adaptar el algoritmo. El parámetro class_weight en scikit-learn penaliza los errores en la clase minoritaria. El cost-sensitive learning y el focal loss acentúan la importancia de los ejemplos difíciles. El ajuste del umbral de decisión (threshold moving) permite optimizar el recall o la precisión después del entrenamiento.
Métodos ensamblados especializados
Los métodos ensamblados combinan varios modelos entrenados sobre subconjuntos equilibrados. BalancedRandomForest, EasyEnsemble, RUSBoost y BalancedBagging son variantes robustas que integran de forma natural el desequilibrio y reducen el riesgo de overfitting.
Cuándo pasar al marco de detección de anomalías
Cuando la clase rara representa menos del 1 % de los datos, las técnicas de clasificación clásicas se vuelven ineficaces. Es entonces preferible cambiar a enfoques de detección de anomalías (Isolation Forest, One-Class SVM, autoencoders) que modelan únicamente la clase mayoritaria y señalan las desviaciones.
Buenas prácticas de validación y pipelines
El remuestreo nunca debe aplicarse sobre el conjunto de test o de validación, bajo pena de fuga de datos. Utilice siempre un stratified k-fold y construya un pipeline con imbalanced-learn para garantizar que SMOTE o cualquier otra técnica solo se aplique sobre los folds de entrenamiento.
Ejemplo concreto de código con imbalanced-learn
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
X, y = make_classification(n_classes=2, weights=[0.95, 0.05], n_samples=10000, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)
pipeline = Pipeline([
('over', SMOTE(sampling_strategy=0.3, random_state=42)),
('under', RandomUnderSampler(sampling_strategy=0.5, random_state=42)),
('clf', RandomForestClassifier(class_weight='balanced', random_state=42))
])
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
print(classification_report(y_test, y_pred))
Este pipeline aplica SMOTE y undersampling únicamente sobre los datos de entrenamiento y utiliza class_weight para reforzar la robustez.
Checklist práctica para tus proyectos
- Analizar la distribución de las clases antes de cualquier entrenamiento.
- Elegir las métricas adecuadas (F1, PR-AUC, balanced accuracy).
- Aplicar el resampling únicamente en el train a través de un pipeline.
- Probar varias técnicas (SMOTE, class_weight, umbrales).
- Utilizar la validación cruzada estratificada.
- Comparar los enfoques en un conjunto de prueba intacto.
En resumen, los datasets desequilibrados exigen una atención particular en cada etapa del proyecto. Al combinar métricas pertinentes, técnicas de remuestreo controladas y pipelines rigurosos, obtendrás modelos fiables incluso cuando las clases raras son críticas. Experimenta progresivamente estos métodos en tus propios datos para constatar su impacto concreto.
💬 ¿Tienes alguna pregunta o quieres profundizar más? Únete a la comunidad en Discord : https://discord.gg/GwhUKccQcM