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.
class_weight
faz é criar uma matriz de custos para você, onde para cada classesample_weight=[C_k for k in y]
paraaccuracy_score
ou usar algo parecidof1_score
.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 .
fonte
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
fonte
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 .
fonte
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/
fonte