Como classificar um conjunto de dados desequilibrado por Redes Neurais Convolucionais (CNN)?

10

Eu tenho um conjunto de dados desequilibrado em uma tarefa de classificação binária, em que a quantidade positiva vs a quantidade negativa é 0,3% vs 99,7%. A diferença entre pontos positivos e negativos é enorme. Quando treino uma CNN com a estrutura usada no problema MNIST, o resultado do teste mostra uma alta taxa de falsos negativos. Além disso, a curva de erro de treinamento diminui rapidamente em algumas épocas no início, mas permanece o mesmo valor nas seguintes épocas.

Poderia me aconselhar uma maneira de processar esse problema? Obrigado!

Zhi Lu
fonte

Respostas:

10

Isso acontece porque, quando você faz um mini-lote, é muito menos provável (dada a proporção das proporções aqui) que um mini-lote contenha amostras dos seus aspectos positivos. Então, acabará aprendendo o padrão para a classe negativa e, após algumas épocas, tudo será classificado como classe negativa.

Existem duas maneiras possíveis de lidar com essa situação.

  1. Dadas as proporções de 0,3% a 99,7%, esse é um conjunto de dados altamente distorcido. Você quase não tem 3 amostras de classes positivas para cada 1000 amostras. Eu diria que você deve equilibrar o conjunto de dados obtendo classes mais positivas. Vá e obtenha o maior número possível de amostras positivas. Em seguida, você pode usar um conjunto de dados mais equilibrado. Por exemplo, você pode obter 1000 amostras positivas e, em seguida, escolher um conjunto aleatório de 1000 amostras negativas e criar o classificador. Agora, ele deve ser capaz de aprender as duas classes.

  2. Use uma medida de erro ponderada ao atualizar os pesos após um mini lote. Os pesos são atualizados em proporções ao número de amostras das classes positiva e negativa durante qualquer mini lote. Agora, na situação atual, dadas as proporções de 3: 1000, mesmo esse truque pode não funcionar. Portanto, você pode tentar obter proporções para algo como 300: 1000, obtendo 297 amostras mais positivas e combinando-as com 1000 amostras negativas. Em seguida, com a proporção 300: 1000, você deve ponderar o erro durante os mini-lotes com base no número de amostras em cada uma das classes. Isso deve funcionar.

London guy
fonte
Você sabe qual é a proporção ideal aqui? é 3:10, ou algo mais?
Donlan
4

Por que você deseja usar CNNs aqui? Você já considerou outros modelos que realmente lidam com dados desequilibrados?

Por exemplo, eu descobri que as duas técnicas a seguir funcionaram muito bem para mim:

  • Florestas aleatórias comSMOTE aumento de SMOTE : use um híbrido que subamostra a classe majoritária e superextraia a classe minoritária em porcentagens ajustáveis. Selecione essas porcentagens, dependendo da distribuição de sua variável de resposta no conjunto de treinamento. Alimente esses dados ao seu modelo de RF. Sempre faça a validação cruzada / execute a pesquisa em grade para encontrar as melhores configurações de parâmetros para seus RFs.

  • XGBoost com otimização de hiper-parâmetros : Novamente, valide cruzadamente ou execute a pesquisa por gird para encontrar as melhores configurações de parâmetros para o modelo. Além disso, xgboostpermite equilibrar pesos de classe positivos e negativos usando scale_pos_weight. Consulte a documentação dos parâmetros para obter uma lista completa.

Devo acrescentar também que o conjunto de dados em que estava trabalhando tinha a mesma porcentagem de inclinação e foi possível obter o escore de sensibilidade de 0,941 e uma especificidade de 0,71 xgboost, o que significa que o modelo está prevendo os verdadeiros positivos com bastante precisão e que é um bom presságio bem pra mim.

(Desculpe, não posso deixar um comentário, não é reputação suficiente e eu realmente queria saber por que você escolheu as CNNs)

119631
fonte
1

O conjunto de dados desequilibrado é um problema comum em todas as áreas e não se refere especificamente à visão computacional e aos problemas tratados pelas Redes Neurais Convolucionais (CNNs).

Para resolver esse problema, você deve tentar equilibrar seu conjunto de dados, sobredimensionando as classes minoritárias ou sub-amostrando as classes majoritárias (ou ambas). Indiscutivelmente, uma boa escolha seria o algoritmo SMOTE (Técnica de Sobre-Amostragem de Minorias Sintéticas), como mencionado acima. Aqui você pode encontrar uma comparação de diferentes algoritmos de sobre-amostragem. Se você é usuário de Python, o desbalanced-learn é uma boa biblioteca que implementa muitas técnicas úteis para equilibrar conjuntos de dados.

Por outro lado, se você estiver tentando classificar imagens, uma boa maneira de aumentar o tamanho do seu conjunto de dados é aumentá- lo (por exemplo, criando exemplos sintéticos razoáveis, por exemplo, imagens semelhantes, mas girando / mudando um pouco em relação às originais). Às vezes, você pode achar útil aumentar as classes minoritárias para obter um melhor equilíbrio. A classe Keras ImageDataGenerator é uma boa ferramenta para esse fim.

Tomasz Bartkowiak
fonte