Alta recordação - Baixa precisão para conjunto de dados desequilibrado

10

No momento, estou com alguns problemas ao analisar um conjunto de dados de tweet com máquinas de vetores de suporte. O problema é que tenho um conjunto de treinamento de classe binária desequilibrado (5: 2); que deve ser proporcional à distribuição de classe real. Ao prever, obtenho uma baixa precisão (0,47) para a classe minoritária no conjunto de validação; o recall é de 0,88. Tentei usar vários métodos de superamostragem e subamostragem (realizados no conjunto de treinamento) que não melhoraram a precisão, pois o conjunto de validação também é desequilibrado para refletir a distribuição real da classe. Também implementei custos diferentes na máquina de vetores de suporte, o que ajudou. Agora parece que não posso mais melhorar meu desempenho.

Alguém de vocês tem algum conselho sobre o que eu poderia fazer para melhorar minha precisão sem prejudicar minha lembrança? Além disso, alguém tem alguma idéia de por que estou obtendo muito mais falsos positivos do que falsos negativos (o positivo é a classe minoritária)?

Filippo Scopel
fonte
3
Pelo menos parte do problema é avaliar o modelo com base em uma regra de pontuação inadequada.
Sycorax diz Restabelecer Monica
Por "métodos de sobreamostragem e subamostragem", você já experimentou o SMOTE (Técnica de sobre-amostragem de minorias sintéticas)? Pela minha experiência, ele melhorou minha taxa de classificação da classe minoritária para um conjunto de dados desequilibrado de 300: 1.
Matthew Lau
Olá Matthew, obrigado pela sua resposta. Tentei vários métodos de subamostragem e até de montagem, incluindo todo o tipo de técnicas SMOTE.
Filippo Scopel 23/03
2
Como você está usando o scikit, tente árvores com gradiente nos seus dados. Você provavelmente obterá melhor AUC com precisão de recall imediatamente. Os SVCs, como você aponta, não são realmente práticos para nada além de conjuntos de dados muito pequenos.
rinspy
1
Oi Filippo! Atualmente, estou lidando com, eu diria, exatamente o mesmo problema que você descreve :-) Tentei todas as coisas usuais (sobreamostragem / subamostragem, SMOTE, peso de classe) e até tentei vários alunos diferentes (SVM, Random Forest, redes neurais totalmente conectadas), mas o efeito é o mesmo em qualquer lugar: alto recall da classe minoritária após a aplicação de SMOTE ou peso de classe, mas com precisão muito baixa. Você acabou encontrando uma solução?
u_b

Respostas:

6

alguém tem uma idéia de por que estou recebendo muito mais falsos positivos do que falsos negativos (positivo é a classe minoritária)? Agradeço antecipadamente por sua ajuda!

Porque positivo é a classe minoritária. Existem muitos exemplos negativos que podem se tornar falsos positivos. Por outro lado, existem menos exemplos positivos que podem se tornar falsos negativos.

Lembre-se de que Lembre-se = Sensibilidade =TP(TP+FN)

A sensibilidade (taxa positiva verdadeira) está relacionada à taxa de falso positivo (especificidade 1), conforme visualizado por uma curva ROC. Em um extremo, você chama todos os exemplos de positivos e tem 100% de sensibilidade com 100% de RPF. Em outro, você não chama exemplo de positivo e tem uma sensibilidade de 0% com um FPR de 0%. Quando a classe positiva é a minoria, mesmo um FPR relativamente pequeno (que você pode ter porque tem um recall alto = sensibilidade = TPR) acabará causando um número alto de FPs (porque há muitos exemplos negativos).

Desde a

=TP(TP+FP)

Mesmo com um FPR relativamente baixo, o FP sobrecarregará o TP se o número de exemplos negativos for muito maior.

Alternativamente,

C+

O+

P(O+|C+)=P(C+|O+)P(O+)P(C+)

P (O +) é baixo quando a classe positiva é pequena.

Alguém de vocês tem algum conselho sobre o que eu poderia fazer para melhorar minha precisão sem prejudicar minha lembrança?

Conforme mencionado por @rinspy, o GBC funciona bem em minha experiência. No entanto, será mais lento que o SVC com um kernel linear, mas você pode criar árvores muito rasas para acelerá-lo. Além disso, mais recursos ou mais observações podem ajudar (por exemplo, pode haver algum recurso atualmente não analisado que é sempre definido com algum valor em todo o seu FP atual).

Também pode valer a pena traçar curvas ROC e curvas de calibração. Pode ser que, embora o classificador tenha baixa precisão, ele pode levar a uma estimativa de probabilidade muito útil. Por exemplo, saber que um disco rígido pode ter uma probabilidade 500 vezes maior de falhar, mesmo que a probabilidade absoluta seja bastante pequena, pode ser uma informação importante.

Além disso, uma baixa precisão significa essencialmente que o classificador retorna muitos falsos positivos. No entanto, isso pode não ser tão ruim se um falso positivo for barato.

user0
fonte
2

Métodos para experimentar:

UnderSampling:

Sugiro usar técnicas de amostragem e treinar seu classificador.

O aprendizado desequilibrado fornece uma API de estilo de aprendizado do scikit para um conjunto de dados desequilibrado e deve ser um bom ponto de partida para a amostragem e os algoritmos experimentarem.

Biblioteca : https://imbalanced-learn.readthedocs.io/en/stable/

SVM baseado em classificação:

Isso mostrou melhorar o recall de sistemas de alta precisão e é usado pelo google para detectar anúncios ruins. Eu recomendo experimentar.

Documento de referência para SVM:

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37195.pdf

Vibhu Jawa
fonte
1

A abordagem padrão seria ponderar seu erro com base na frequência da classe. Por exemplo, se você estivesse fazendo isso em Python com o sklearn:

model = sklearn.svm.SVC(C=1.0, kernel='linear', class_weight='balanced')
model.fit(X, y)
mprat
fonte
Oi mprat, obrigado pela sua resposta. Eu já usei class_weight = equilibrado.
Filippo Scopel 23/03