Conjuntos de dados desbalanceados: estratégias completas para gerenciá-los eficazmente

Compreender os datasets desequilibrados e dominar todas as técnicas para treinar modelos confiáveis em classificação.

Conjuntos de dados desbalanceados: estratégias completas para gerenciá-los eficazmente

No domínio do aprendizado de máquina, os conjuntos de dados desbalanceados representam um desafio diário. Quando uma classe representa 99% dos exemplos e a outra apenas 1%, os algoritmos padrão frequentemente falham em detectar os casos raros. Este artigo o guia passo a passo para identificar o problema, escolher as métricas corretas e aplicar as técnicas mais eficazes.

O que é um dataset desbalanceado e por que isso é um problema?

Um dataset é desbalanceado quando a distribuição das classes é muito desigual. Os exemplos concretos abundam: detecção de fraude bancária (0,1 % de fraudes), diagnóstico de doenças raras, previsão de churn de clientes, filtragem de spam ou detecção de defeitos em uma linha industrial. Em todos esses casos, o modelo “trapaceia” ao prever sistematicamente a classe majoritária, obtendo uma acurácia elevada enquanto falha completamente nos casos críticos.

A armadilha da acurácia e as métricas a priorizar

A acurácia é enganosa porque mascara os erros na classe minoritária. É preciso utilizar a matriz de confusão, a precisão, o recall, o score F1, a balanced accuracy, o coeficiente de Cohen kappa e principalmente a PR-AUC (mais pertinente que a ROC-AUC quando as classes estão muito desbalanceadas). Prioriza-se o recall quando os falsos negativos são custosos (doença não detectada) e a precisão quando os falsos positivos o são (alarme desnecessário).

Técnicas de reamostragem: oversampling e undersampling

O oversampling consiste em aumentar a classe minoritária: duplicação simples, SMOTE, ADASYN ou Borderline-SMOTE. O undersampling reduz a classe majoritária via Random Undersampling, Tomek Links, NearMiss ou Edited Nearest Neighbours (ENN). As combinações como SMOTETomek ou SMOTEENN oferecem frequentemente um bom compromisso. Atenção, no entanto, ao risco de overfitting com o oversampling e à perda de informação com o undersampling.

Abordagens no nível do algoritmo

Em vez de modificar os dados, podemos atuar no próprio algoritmo. A maioria das bibliotecas permite usar o parâmetro class_weight ou cost-sensitive learning. O ajuste do limiar de decisão (threshold moving) após o treinamento é simples e eficaz. Por fim, a Focal Loss, popular na detecção de objetos, reduz a influência dos exemplos fáceis e concentra o aprendizado nos casos difíceis.

Métodos ensemble adaptados para dados desbalanceados

Os métodos ensemble especializados combinam vários classificadores treinados em subconjuntos balanceados. BalancedRandomForest, EasyEnsemble, RUSBoost e BalancedBagging são implementações robustas que integram nativamente o reamostragem e geralmente melhoram a detecção da classe rara.

Quando passar para o framework de detecção de anomalias?

Quando a classe positiva representa menos de 1% dos dados, as técnicas de classificação supervisionada atingem seus limites. Torna-se pertinente reformular o problema como detecção de anomalia ou outlier com algoritmos como Isolation Forest, One-Class SVM ou Autoencoders, que aprendem apenas na classe majoritária.

Boas práticas de validação para evitar vazamentos de dados

O resampling nunca deve ser aplicado no conjunto de teste ou de validação. Sempre utilize um pipeline (imblearn.Pipeline) que aplique SMOTE apenas nos folds de treinamento. A stratified k-fold preserva a proporção de classes em cada fold. Essas precauções evitam vazamentos de dados e desempenhos superestimados.

Exemplo concreto de código com 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))
  • Verifique sempre a distribuição das classes antes de qualquer modelagem.
  • Escolha as métricas com base no custo de negócio dos erros.
  • Aplique o resampling exclusivamente no pipeline de treinamento.
  • Teste várias técnicas (SMOTE, class_weight, threshold tuning) e compare as PR-AUC.
  • Use a validação cruzada estratificada para garantir resultados confiáveis.
  • Documente a escolha final e suas hipóteses para a reprodutibilidade.

Ao aplicar essas boas práticas, você transformará um dataset desbalanceado em um ativo em vez de um obstáculo. A chave está na combinação judiciosa de métricas adequadas, do resampling controlado e de algoritmos cost-sensitive. Teste essas abordagens em seus próprios dados e meça a melhoria concreta do recall e da PR-AUC.

💬 Tem alguma dúvida ou quer ir mais longe? Junte-se à comunidade no Discord: https://discord.gg/GwhUKccQcM