Otimize o SVM para evitar falso-negativo na classificação binária


9

Estou treinando um classificador binário SVM usando o Scikit learn.

Devido à natureza do meu problema, preciso evitar falsos negativos. Como nada é gratuito, estou bem em obter uma taxa mais alta de falsos positivos, a fim de reduzir o número de falsos negativos. Como podemos fazer isso (idealmente com o Scikit learn)?

Em outras palavras, como podemos minimizar os falsos negativos usando um classificador SVM? Existe alguma maneira de ajustar hiper parâmetros para favorecer falsos positivos em vez de falsos negativos?


2
Você não precisa alterar a forma como otimiza seu SVM, apenas o valor da decisão que declara que uma observação é negativa ou positiva. Ajuste isso a gosto.
Sycorax diz Reinstate Monica

@ Sycorax Você poderia elaborar?
Pierre-Antoine

3
A saída de um SVM é um número real, uma distância (assinada) do hiperplano . Uma função de decisão diz que para , é positivo; caso contrário, é negativo, para alguns específicos . Você pode alterar para alterar o conteúdo de uma matriz de confusão / as estimativas de TPR, FPR, FNR, TNR. x > c c cxx>ccc
Sycorax diz Reinstate Monica

1
Eu acho que essa pergunta seria mais direta se você enfatizasse os princípios estatísticos ou matemáticos mais gerais do que como fazer isso no sklearn. (Sinto que meus comentários demonstram que, em sua essência, essa pergunta é de natureza estatística.)
Sycorax diz Reinstate Monica

Por favor, edite conforme sugerido pelo Sycorax; como indicam as respostas descritas nos comentários, elas serão respondidas aqui.
Glen_b -Reinstate Monica

Respostas:


4

A implementação do Scikit learn do classificador binário SVM não permite definir um limite de corte, conforme os outros comentários / respostas sugeriram. Em vez de fornecer probabilidades de classe, aplica-se diretamente um ponto de corte padrão para fornecer a associação de classe, por exemplo, 1 ou 2.

Para minimizar os falsos negativos, você pode definir pesos mais altos para amostras de treinamento rotuladas como classe positiva; por padrão, os pesos são definidos como 1 para todas as classes. Para mudar isso, use o hiperparâmetro class_weight.

Idealmente, você deve evitar escolher um ponto de corte e simplesmente fornecer as probabilidades de classe para os usuários finais que podem decidir sobre qual ponto de corte aplicar ao tomar decisões com base no classificador.

Uma métrica melhor para comparar classificadores é uma função de pontuação adequada, consulte https://en.wikipedia.org/wiki/Scoring_rule e o score()método no módulo classificador svm sklearn.svm.SVC.


1

Como muitos modelos preditivos, o SVM produzirá pontuações de probabilidade e aplicará o limite à probabilidade de convertê-lo em rótulos positivos ou negativos.

Como @Sycorax mencionado no comentário, você pode ajustar o limite de corte para ajustar o trade-off entre falso positivo e falso negativo.

Aqui está um exemplo em R.

library(kernlab)
library(mlbench)
graphics.off()
set.seed(0)

d=mlbench.2dnormals(500)
plot(d)
# using 2nd order polynominal expansion
svp <- ksvm(d$x,d$classes,type="C-svc",kernel="polydot",
            kpar=list(degree=2),C=10,prob.model=T)
plot(svp)

p=predict(svp,d$x, type="prob")[,1]

cut_off=0.5
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

cut_off=0.8
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

Observe que quando mudamos cut_off, a matriz de confusão (falso positivo, falso negativo etc.) muda

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 253  16
         2  38 193

               Accuracy : 0.892           
                 95% CI : (0.8614, 0.9178)
    No Information Rate : 0.582           
    P-Value [Acc > NIR] : < 2.2e-16       

                  Kappa : 0.7813          
 Mcnemar's Test P-Value : 0.004267        

            Sensitivity : 0.8694          
            Specificity : 0.9234          
         Pos Pred Value : 0.9405          
         Neg Pred Value : 0.8355          
             Prevalence : 0.5820          
         Detection Rate : 0.5060          
   Detection Prevalence : 0.5380          
      Balanced Accuracy : 0.8964          

       'Positive' Class : 1               


> cut_off=0.8

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 223  46
         2  10 221

               Accuracy : 0.888          
                 95% CI : (0.857, 0.9143)
    No Information Rate : 0.534          
    P-Value [Acc > NIR] : < 2.2e-16      

                  Kappa : 0.7772         
 Mcnemar's Test P-Value : 2.91e-06       

            Sensitivity : 0.9571         
            Specificity : 0.8277         
         Pos Pred Value : 0.8290         
         Neg Pred Value : 0.9567         
             Prevalence : 0.4660         
         Detection Rate : 0.4460         
   Detection Prevalence : 0.5380         
      Balanced Accuracy : 0.8924         

       'Positive' Class : 1      
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.