Optimieren Sie SVM, um falsch negative Ergebnisse bei der binären Klassifizierung zu vermeiden


9

Ich trainiere einen binären SVM-Klassifikator mit Scikit Learn.

Aufgrund der Art meines Problems muss ich falsche Negative vermeiden. Da nichts umsonst ist, kann ich eine höhere Rate an falsch positiven Ergebnissen erzielen, um die Anzahl der falsch negativen Ergebnisse zu verringern. Wie können wir das machen (idealerweise mit Scikit lernen)?

Mit anderen Worten, wie können wir mit einem SVM-Klassifikator falsch negative Ergebnisse minimieren? Gibt es eine Möglichkeit, Hyperparameter abzustimmen, um falsch positive gegenüber falsch negativen Ergebnissen zu bevorzugen?


2
Sie müssen nicht ändern, wie Sie Ihre SVM optimieren, sondern nur ändern, bei welchem ​​Entscheidungswert Sie eine Beobachtung als negativ oder positiv deklarieren. Passen Sie das nach Geschmack an.
Sycorax sagt Reinstate Monica

@ Sycorax Könnten Sie näher darauf eingehen?
Pierre-Antoine

3
Die Ausgabe einer SVM ist eine reelle Zahl, ein (vorzeichenbehafteter) Abstand von der Hyperebene . Eine Entscheidungsfunktion besagt, dass es für positiv ist; sonst ist es negativ für bestimmte . Sie können ändern, den Inhalt einer Verwirrungsmatrix / die Schätzungen von TPR, FPR, FNR, TNR zu ändern. x > c c cxx>ccc
Sycorax sagt Reinstate Monica

1
Ich denke, diese Frage wäre eher thematisch, wenn Sie die allgemeineren statistischen oder mathematischen Prinzipien hervorheben würden, als wie dies in sklearn zu tun ist. (Ich habe das Gefühl, dass meine Kommentare zeigen, dass diese Frage im Kern statistischer Natur ist.)
Sycorax sagt Reinstate Monica

Bitte bearbeiten Sie wie von Sycorax vorgeschlagen; Wie die skizzierten Antworten in Kommentaren zeigen, wäre sie dann hier zu beantworten.
Glen_b -State Monica

Antworten:


4

Mit der Scikit-Lernimplementierung des binären SVM-Klassifikators können Sie keinen Grenzwert festlegen, wie in den anderen Kommentaren / Antworten vorgeschlagen. Anstatt Klassenwahrscheinlichkeiten anzugeben, wird sofort ein Standardgrenzwert angewendet, um Ihnen die Klassenmitgliedschaft zu geben, z. B. 1 oder 2.

Um falsch negative Ergebnisse zu minimieren, können Sie höhere Gewichte für Trainingsmuster festlegen, die als positive Klasse gekennzeichnet sind. Standardmäßig sind die Gewichte für alle Klassen auf 1 festgelegt. Um dies zu ändern, verwenden Sie den Hyperparameter class_weight.

Im Idealfall sollten Sie die Auswahl eines Cutoffs vermeiden und den Endbenutzern einfach die Klassenwahrscheinlichkeiten zur Verfügung stellen, die dann entscheiden können, welcher Cutoff angewendet werden soll, wenn Entscheidungen auf der Grundlage des Klassifikators getroffen werden.

Eine bessere Metrik zum Vergleichen von Klassifikatoren ist eine ordnungsgemäße Bewertungsfunktion, siehe https://en.wikipedia.org/wiki/Scoring_rule und die score()Methode im svm-Klassifikatormodul sklearn.svm.SVC.


1

Wie viele Vorhersagemodelle gibt SVM Wahrscheinlichkeitsbewertungen und den Schwellenwert für die Wahrscheinlichkeit aus, diese in positive oder negative Bezeichnungen umzuwandeln.

Wie bei @Sycorax im Kommentar erwähnt, können Sie den Grenzwert anpassen, um den Kompromiss zwischen falsch positiv und falsch negativ anzupassen.

Hier ist ein Beispiel in 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))

Beachten Sie, wenn wir uns ändern cut_off, ändert sich die Verwirrungsmatrix (falsch positiv, falsch negativ usw.)

> 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      
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.