Optimiser SVM pour éviter les faux négatifs dans la classification binaire

9

Je forme un classificateur binaire SVM à l'aide de Scikit learn.

En raison de la nature de mon problème, je dois éviter les faux négatifs. Comme rien n'est gratuit, je suis d'accord pour obtenir un taux plus élevé de faux positifs afin de réduire le nombre de faux négatifs. Comment pouvons-nous faire cela (idéalement avec Scikit learn)?

En d'autres termes, comment pouvons-nous minimiser les faux négatifs en utilisant un classificateur SVM? Existe-t-il un moyen de régler les hyper paramètres afin de privilégier les faux positifs aux faux négatifs?

Pierre-Antoine
la source
2
Vous n'avez pas besoin de changer la façon dont vous optimisez votre SVM, il vous suffit de changer à quelle valeur de décision vous déclarez une observation négative ou positive. Ajustez cela au goût.
Sycorax dit Réintégrer Monica
@Sycorax Pourriez-vous élaborer?
Pierre-Antoine
3
La sortie d'un SVM est un nombre réel, une distance (signée) de l'hyperplan x. Une fonction de décision dit que pourx>c, c'est positif; sinon c'est négatif, pour certainsc. Vous pouvez changercchanger le contenu d'une matrice de confusion / les estimations de TPR, FPR, FNR, TNR.
Sycorax dit Réintégrer Monica
1
Je pense que cette question serait plus directement sur le sujet si vous insistiez sur les principes statistiques ou mathématiques plus généraux plutôt que sur la façon de le faire en sklearn. (Je pense que mes commentaires démontrent qu'à sa base, cette question est de nature statistique.)
Sycorax dit Reinstate Monica
Veuillez modifier comme suggéré par Sycorax; comme l'indiquent les réponses décrites dans les commentaires, il serait alors possible de répondre ici.
Glen_b -Reinstate Monica

Réponses:

4

L'implémentation Scikit learn du classificateur binaire SVM ne vous permet pas de définir un seuil de coupure comme l'ont suggéré les autres commentaires / réponses. Au lieu de donner des probabilités de classe, il applique une limite par défaut pour vous donner l'appartenance à la classe, par exemple 1 ou 2.

Pour minimiser les faux négatifs, vous pouvez définir des poids plus élevés pour les échantillons d'apprentissage étiquetés comme classe positive, par défaut, les poids sont définis sur 1 pour toutes les classes. Pour changer cela, utilisez l'hyper-paramètre class_weight.

Idéalement, vous devez éviter de choisir un seuil et simplement fournir les probabilités de classe aux utilisateurs finaux qui peuvent ensuite décider du seuil à appliquer lors de la prise de décisions en fonction du classificateur.

Une meilleure métrique pour comparer les classificateurs est une fonction de notation appropriée, voir https://en.wikipedia.org/wiki/Scoring_rule et la score()méthode dans le module de classificateur svm sklearn.svm.SVC.

Sandeep S. Sandhu
la source
1

Comme de nombreux modèles prédictifs, SVM produira des scores de probabilité et appliquera le seuil à la probabilité pour le convertir en étiquettes positives ou négatives.

Comme, @Sycorax l'a mentionné dans le commentaire, vous pouvez ajuster le seuil de coupure pour ajuster le compromis entre faux positif et faux négatif.

Voici un exemple dans 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))

Notez que lorsque nous changeons cut_off, la matrice de confusion (faux positif, faux négatif, etc.) change

> 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      
Haitao Du
la source