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

Compreender datasets desbalanceados, evitar as armadilhas da accuracy e aplicar as boas técnicas de reamostragem, ponderação e validação.

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

Em muitos projetos de IA, os dados não são distribuídos de forma equitativa entre as classes. Um modelo pode então parecer eficiente, mas ser inútil na prática. Esse fenômeno, chamado de desequilíbrio de classes, afeta áreas críticas como a detecção de fraudes ou o diagnóstico médico. Vamos descobrir juntos como identificar esse problema e resolvê-lo passo a passo.

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

Um dataset é desbalanceado quando uma classe (majoritária) representa a grande maioria dos exemplos, enquanto a outra (minoritária) é rara. Por exemplo, na detecção de fraudes bancárias, menos de 0,5% das transações são fraudulentas. Da mesma forma, a detecção de doenças raras, a previsão de churn de clientes, o filtro de spam ou a identificação de defeitos industriais frequentemente apresentam ratios de 1:100 ou mais.

O modelo « trapaceia » facilmente: ao prever sempre a classe majoritária, ele obtém uma accuracy elevada enquanto perde sistematicamente os casos raros que realmente nos interessam.

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

A acurácia mede a porcentagem de boas predições globais. Em um dataset com 99 % de classe majoritária, um modelo que sempre prediz essa classe atinge 99 % de acurácia sem detectar nada. Portanto, é preciso analisar a matriz de confusão, a precisão (proporção de verdadeiros positivos entre os positivos preditos), o recall (proporção de verdadeiros positivos detectados) e o score F1 que os combina.

A PR-AUC costuma ser mais informativa que a ROC-AUC quando as classes estão muito desbalanceadas. O balanced accuracy e o coeficiente kappa de Cohen também corrigem o acaso. 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 inútil).

Técnicas de reamostragem: oversampling e undersampling

O oversampling consiste em aumentar a classe minoritária. A duplicação simples corre o risco de overfitting; o SMOTE cria exemplos sintéticos por interpolação, o ADASYN adapta a densidade conforme a dificuldade, e o Borderline-SMOTE se concentra nas fronteiras.

O undersampling reduz a classe majoritária. Os métodos random, Tomek links (remove os pares próximos), NearMiss e ENN (Edited Nearest Neighbours) permitem limpar os exemplos redundantes ou ruidosos.

As combinações como SMOTETomek ou SMOTEENN oferecem frequentemente o melhor compromisso, mas atenção ao risco de overfitting com o oversampling e à perda de informação com o undersampling.

Abordagens no nível dos algoritmos

Muitos algoritmos aceitam um parâmetro class_weight que penaliza mais fortemente os erros na classe minoritária. Também é possível deslocar o limiar de decisão (threshold moving) após o treinamento para otimizar o recall ou a precisão de acordo com o negócio.

A focal loss, utilizada especialmente na detecção de objetos, reduz o impacto dos exemplos fáceis e concentra o aprendizado nos casos difíceis da classe rara.

Métodos ensemble adaptados a dados desbalanceados

As abordagens ensemble combinam vários modelos treinados em subconjuntos balanceados. O BalancedRandomForest reequilibra cada árvore por meio de undersampling. O EasyEnsemble e o RUSBoost aplicam random undersampling antes de realizar o boosting. O Balanced Bagging cria vários subconjuntos balanceados via bootstrap. Esses métodos reduzem a variância ao mesmo tempo em que melhoram a detecção da classe minoritária.

Quando adotar o framework de detecção de anomalias

Quando a classe rara representa menos de 1% dos dados, o problema se aproxima da detecção de anomalias. Os algoritmos Isolation Forest, One-Class SVM ou autoencoders aprendem apenas a distribuição da classe majoritária e sinalizam os pontos que se afastam fortemente dela, sem precisar de exemplos positivos durante o treinamento.

Boas práticas de validação e pipelines sem vazamento de dados

O reamostragem nunca deve ser aplicado no conjunto de teste ou de validação, sob pena de vazamento de dados. Utilize sempre um stratified k-fold para preservar a proporção das classes em cada fold. A biblioteca imbalanced-learn propõe Pipelines compatíveis com scikit-learn que aplicam SMOTE apenas nos folds de treinamento.

Exemplo concreto de código Python com imbalanced-learn

from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.metrics import classification_report
from sklearn.datasets import make_classification

X, y = make_classification(n_classes=2, weights=[0.95, 0.05],
                           n_informative=4, flip_y=0, 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))

Este exemplo mostra como combinar SMOTE, ponderação das classes e validação cruzada estratificada em um pipeline seguro.

  • Verifique sempre a distribuição das classes antes da modelagem
  • Escolha as métricas com base no custo de negócio dos erros
  • Aplique o resampling apenas no treino
  • Compare várias técnicas (SMOTE, class_weight, thresholds)
  • Use pipelines imblearn para evitar vazamentos
  • Valide com stratified k-fold e PR-AUC

Ao aplicar essas boas práticas, você transformará um modelo que “trapaceia” em um sistema realmente útil para detectar casos raros. Teste progressivamente as diferentes abordagens em seus dados e meça o impacto concreto na sua métrica de negócio principal.

💬 Uma pergunta ou quer ir mais longe? Junte-se à comunidade no Discord : https://discord.gg/GwhUKccQcM