Python: Manipulando Classes de Desequilíbrio no Aprendizado de Máquina python

9

Eu tenho um conjunto de dados para o qual estou tentando prever variáveis ​​de destino.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

Forneci dados de amostra, mas o meu possui milhares de registros distribuídos de maneira semelhante. Aqui, Col1, Col2, Col3, Col4 são meus recursos e Col5 é a variável alvo. Portanto, a previsão deve ser 1,2,3 ou 4, pois esses são meus valores para a variável de destino. Eu tentei usar algoritmos como floresta aleatória, árvore de decisão etc. para previsões.

Aqui, se você vê, os valores 1,2 e 3 estão ocorrendo mais vezes em comparação com 4. Portanto, ao prever, meu modelo é mais inclinado para 1 2 e 3, enquanto eu estou obtendo apenas um número menor de previsões para 4 (tenho apenas 1 previsto para policy4 de milhares de registros quando vi a matriz de confusão).

Para generalizar meu modelo, removi a porcentagem igual de dados que pertencem aos valores 1,2 e 3 aleatoriamente. Agrupei por cada valor na Col5 e depois removi certa porcentagem, para diminuir o número de registros. Agora eu pude ver certo aumento na porcentagem de precisão e também um aumento razoável nas previsões para o valor 4 na matriz de confusão.

Essa é a abordagem correta para lidar (remover os dados aleatoriamente daqueles grupos nos quais o modelo é tendencioso)?

Tentei algoritmos python embutidos, como as técnicas Adaboost, GradientBoost, usando o sklearn. Eu li que esses algoritmos são para lidar com a classe de desequilíbrio. Mas não consegui melhorar minha precisão, removendo os dados aleatoriamente, onde pude ver algumas melhorias.

Essa redução é uma técnica de subamostragem e é a abordagem correta para subamostragem?

Existe algum pacote predefinido no sklearn ou alguma lógica que eu possa implementar em python para fazer isso, se minha remoção aleatória estiver errada?

Além disso, aprendi sobre a técnica SMOTE, que trata de superamostragem. Devo tentar isso para o valor 4? E podemos fazer isso usando qualquer pacote embutido em python? Seria ótimo se alguém me ajudasse nessa situação.

SRS
fonte

Respostas:

5

Este artigo sugere o uso de ranking (eu escrevi). Em vez de usar, por exemplo, SVM diretamente, você usaria o RankSVM. Como os corretores comparam observação com observação, o treinamento é necessariamente equilibrado. No entanto, existem dois "buts": o treinamento é muito mais lento e, no final, o que esses modelos fazem é classificar suas observações da probabilidade de pertencerem a uma classe e da probabilidade de pertencerem a outra. aplique um limite posteriormente.

Se você for usar o pré-processamento para corrigir seu desequilíbrio, sugiro que você analise o MetaCost . Esse algoritmo envolve a criação de um agrupamento de modelos e a alteração das anteriores da classe para torná-los equilibrados com base nos casos difíceis de prever. É muito elegante. O interessante de métodos como o SMOTE é que, ao fabricar novas observações, você pode tornar pequenos conjuntos de dados mais robustos.

De qualquer forma, embora eu tenha escrito algumas coisas sobre desequilíbrio de classe, ainda estou cético de que seja um problema importante no mundo real. Eu acho muito incomum o fato de você ter antecedentes de desequilíbrio no seu conjunto de treinamento, mas antecedentes equilibrados nos dados do mundo real. Você? O que geralmente acontece é que os erros do tipo I são diferentes dos erros do tipo II e eu apostaria que a maioria das pessoas seria melhor em usar uma matriz de custos, que a maioria dos métodos de treinamento aceita ou você pode aplicá-lo através do pré-processamento usando o MetaCost ou o SMOTE. Penso que muitas vezes "corrigir desequilíbrio" é curto para "não quero me preocupar em pensar na troca relativa entre erros do tipo I e II".

Termo aditivo:

Tentei algoritmos python embutidos, como as técnicas Adaboost, GradientBoost, usando o sklearn. Eu li que esses algoritmos são para lidar com a classe de desequilíbrio.

O AdaBoost fornece melhores resultados para o desequilíbrio de classe quando você inicializa a distribuição de peso com o desequilíbrio em mente. Eu posso cavar a tese onde li isso, se você quiser.

De qualquer forma, é claro, esses métodos não fornecerão boas precisões. Você tem desequilíbrio de classe no conjunto de dados de treinamento e validação? Você deve usar métricas como pontuação F1 ou passar uma matriz de custos para a função de precisão. "Corrigir" o desequilíbrio da classe é quando seus priores são diferentes em seu treinamento e em seus casos de validação.

Ricardo Cruz
fonte
4

Alguns algoritmos do sklearn possuem um parâmetro chamado class_weight que você pode definir como "equilibrado" . Dessa forma, o sklearn ajustará seus pesos de classe, dependendo do número de amostras que você tiver de cada classe.

Para o classificador de floresta aleatório, tente o seguinte e veja se ele melhora sua pontuação:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!
stmax
fonte
(class_weight = "equilibrado") não está dando melhorias suficientes quando tentei usá-lo #
SRS
2
@ Srinath, o que você entende por melhoria? Qual métrica você está usando? Se seu treinamento e sua validação forem desequilibrados, você não poderá usar pontuações de precisão. O que class_weightfaz é criar uma matriz de custos para você, onde para cada classek, Ck=2NkN. Você deve passar sample_weight=[C_k for k in y]para accuracy_scoreou usar algo parecido f1_score.
Ricardo Cruz
2

Sim, essa é uma boa técnica para enfrentar o problema do desequilíbrio de classe. No entanto, os métodos de subamostragem levam à perda de informações no conjunto de dados (por exemplo, você acabou de remover um padrão interessante entre as demais variáveis, o que poderia ter contribuído para um melhor treinamento do modelo). É por isso que os métodos de super amostragem são preferidos, especificamente no caso de um conjunto de dados menor.

Em resposta à sua pergunta sobre pacotes Python, a caixa de ferramentas desequilibrada é especialmente dedicada à mesma tarefa. Ele fornece vários métodos de subamostragem e superamostragem. Eu recomendaria tentar a técnica SMOTE .

Saurav--
fonte
1

Depende da técnica do conjunto que você deseja usar. O problema básico em que você está trabalhando com o problema de desequilíbrio de dados de várias classes. Sob a amostragem pode ser usado eficientemente em ensacamento, bem como em técnicas de reforço. O algoritmo SMOTE é muito eficiente na geração de novas amostras. O problema de desequilíbrio de dados tem sido amplamente estudado na literatura. Eu recomendo que você leia sobre um destes algoritmos: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Essas são técnicas de reforço / ensacamento projetadas especificamente para problemas de dados de desequilíbrio. Em vez do SMOTE, você pode tentar o ADA-SMOTE ou o SMOTE de linha de fronteira. Eu usei e modifiquei o SMOTE da Border-Line para multi-classes e é muito eficiente. Se sua base de dados é muito grande e o problema é fácil, tente: classificador viola - jones. Eu também usei com problema de desequilíbrio de dados e é realmente eficiente

Bashar Haddad
fonte
Obrigado pela orientação. Estou analisando os tópicos mencionados por você. Mas a técnica que usei para subamostrar (reduzir os dados aleatoriamente) é a maneira correta de fazer?
SRS
Você pode usá-lo se o seu banco de dados for muito grande. Mas se o seu banco de dados for pequeno, você perderá algumas informações. Leia o Rus-Boosting, neste método, eles usam amostragem aleatória como parte do algoritmo de aumento para evitar a perda de informações. Eles sob amostra do conjunto de sub que será utilizado para a formação da próxima aluno base, mas não toda a base de dados
Bashar Haddad
Meu conjunto de dados tem quase 80k registros que eu estou usando como conjunto de treinamento. Estou implementando isso em python. Eu estava procurando por alguns pacotes no sklearn ou algo mais em python. Não consegui encontrá-los. Isso é algo para o qual eu deveria corrigir alguma lógica para implementá-las?
SRS
Eu não acho que exista alguma implementação para esses métodos. O problema de desequilíbrio de dados ainda está sendo pesquisado. Se você tem uma boa implementação para Adaboost.M1 ou M2. Você pode facilmente modificá-lo para se tornar Rus Impulso
Bashar Haddad
Eu acho que o banco de dados que você possui é bastante grande e, se você quiser, pode usar o classificador viola - jones. Para este você pode encontrar disponíveis implementação
Bashar Haddad
0

Já existem boas respostas aqui. Eu apenas pensei em adicionar mais uma técnica, já que você parece estar usando conjuntos de árvores. Em muitos casos, você procura otimizar a curva de elevação ou a AUC para o ROC. Para isso, eu recomendaria o critério de distância de Hellinger para dividir os galhos em suas árvores. No momento em que escrevi isso, ele não estava no pacote de aprendizado desequilibrado , mas parece que há um plano .

Keith
fonte
0

Ao lidar com o problema de desequilíbrio de classe, você deve se concentrar principalmente na métrica de erro e deve escolher a pontuação F1 como uma métrica de erro.

Depois de escolher a métrica correta, podemos usar técnicas diferentes para lidar com esse problema.

Se estiver interessado, você pode olhar para o blog a seguir, e é explicado muito bem sobre as técnicas usadas para resolver esse problema de desequilíbrio de classe:

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

saisubrahmanyam janapati
fonte