Como lidar com conjuntos de dados desbalanceados

Em muitos problemas, o conjunto de dados é desbalanceado. Por exemplo, quando se deseja detectar transações fraudulentas, a maioria das transações estará na classe “não fraude” e uma minoria na classe “fraude”. Outro exemplo são os conjuntos de dados de rotatividade de clientes, onde a maioria dos clientes permanece com o serviço e uma minoria cancela sua assinatura. Isso também acontece no problema de classificação de arritmias cardíacas utilizando sinais de eletrocardiograma (ECG). O banco de dados de ECG do MIT-BIH (Massachusetts Institute of Technology – Boston’s Beth Israel Hospital Arrhythmia Database), que é o mais utilizado, contém mais de 80000 batimentos normais (N) e apenas 772 batimentos de arritmia com fusão ventricular com normal (F). Ao treinar uma rede neural com essas duas classes apenas, a acurácia pode ser muito elevada: próxima 100% neste caso. Isso não significa que o classificador é bom. Significa apenas que quase 100% dos dados pertencem uma das classes (N, no caso). O classificador de arritmias decide inteligentemente que, para alcançar uma acurácia elevada, a melhor coisa a fazer é sempre prever a classe N. O que fazer quando o conjunto de dados é desbalanceado? A seguir vamos explorar possíveis soluções.

Métrica de desempenho

A acurácia não é uma métrica adequada quando se trabalha com conjuntos de dados desbalanceados. As seguintes medidas de desempenho podem fornecer mais informações sobre a precisão do modelo do que a acurácia:

  • Matriz de confusão : uma divisão das predições em uma tabela mostrando as predições corretas (a diagonal) e os tipos de predições incorretas (quais classes tiveram o maior número de predições incorretas);
  • Precisão: uma medida da exatidão do classificador;
  • Sensibilidade: uma medida da completude do classificador;
  • \(F_1\)-score: uma média ponderada de precisão e sensibilidade; e
  • Curva ROC: assim como a precisão e a sensibilidade, a acurácia é dividida entre sensibilidade e especificidade e os modelos podem ser escolhidos com base nos limites de equilíbrio desses valores.

A escolha da métrica não soluciona o problema dos dados desbalanceados, mas ajuda a detectá-lo.

Amostragem

O conjunto de dados pode ser alterado com o objetivo de balanceá-lo. Essa alteração é chamada de amostragem do conjunto de dados e há dois métodos principais:

  • Sobreamostragem que consiste na adição de cópias de exemplos da classe sub-representada; e
  • Subamostragem que consiste na exclusão de exemplos da classe sobre-representada.

Geralmente, essas soluções são fáceis de implementar e, por isso, são um excelente ponto de partida. A subamostragem deve ser usada apenas quando o conjunto de dados for muito grande (mais de centenas de milhares de exemplos) e, por isso, é menos utilizada na prática. Em contrapartida, a sobreamostragem pode ser usada quando não há muitos dados no conjunto (menos de dezenas de milhares de exemplos). Não há necessidade de balancear com exatidão as classes (por exemplo, na proporção 1:1 na classificação binária). Outras proporções podem ser mais interessantes. Vamos explorar a sobreamostragem com mais detalhes a seguir.

Sobreamostragem

Uma das formas de realizar a sobreamostragem é gerar amostras sintéticas por meio da amostragem aleatória dos exemplos da classe minoritária. Para isso, pode-se adicionar cópias ruidosas desses exemplos ao conjunto de dados. Neste contexto, o SMOTE (Synthetic Minority Over-sampling Technique) é a técnica mais utilizada. Essa técnica gera amostras sintéticas da classe minoritária, selecionando dois ou mais exemplos semelhantes (usando uma medida de distância) e perturba um exemplo por vez, considerando um ruído dentro da diferença para os exemplos vizinhos. O SMOTE foi proposto no artigo (Chawla et al. 2002), disponível em https://arxiv.org/abs/1106.1813.

Existem várias implementações do algoritmo SMOTE. No Python, por exemplo, a biblioteca imbalanced-learn fornece uma implementação do SMOTE, bem como várias outras técnicas de sobreamostragem.

Inclusão de pesos na função custo

Uma forma de levar em conta o desbalanceamento das classes é considerar pesos na função custo. No caso multiclasse, considera-se a função custo de entropia cruzada categórica ponderada (weighted categorical cross entropy) definida para \(N_L\) classes como \[ J_{\rm ECCP}=-\frac{1}{N_L}\sum_{\ell=1}^{N_L}p_{\ell}d_{\ell}(n)\ln\left(y_{\ell}^{(L)}(n)\right), \]

em que \[ p_{\ell}=\frac{1}{C_{\ell}} \]

é o peso da \(\ell\)-ésima classe, definido como o inverso de \(C_{\ell}\) (quantidade de dados da Classe \(\ell\)). Dessa forma, quanto maior o valor de \(C_{\ell}\), menos importância à Classe \(\ell\) é dada na função custo. Cabe observar que a utilização dos pesos na função custo deve ser implementada em conjunto com outras técnicas como o SMOTE, por exemplo.

Leitura adicional

Há dois livros interessantes que abordam técnicas para lidar com dados desbalanceados:

Referências

Chawla, N. V., K. W. Bowyer, L. O. Hall, e W. P. Kegelmeyer. 2002. SMOTE: Synthetic Minority Over-sampling Technique”. Journal of Artificial Intelligence Research 16 (junho): 321–57. https://doi.org/10.1613/jair.953.
Fernández, Alberto, Salvador García, Mikel Galar, Ronaldo C. Prati, Bartosz Krawczyk, e Francisco Herrera. 2018. Learning from Imbalanced Data Sets. Cham: Springer International Publishing. https://doi.org/10.1007/978-3-319-98074-4.
Ma, Yunqian, e Haibo He, orgs. 2013. Imbalanced Learning: Foundations, Algorithms, and Applications. 1ª edição. Hoboken, New Jersey: Wiley-IEEE Press.