Optimalkan SVM untuk menghindari false-negative dalam klasifikasi biner

9

Saya melatih classifier biner SVM menggunakan Scikit belajar.

Karena sifat masalah saya, saya perlu menghindari negatif palsu. Karena tidak ada yang gratis, saya oke mendapatkan tingkat positif palsu yang lebih tinggi untuk mengurangi jumlah negatif palsu. Bagaimana kita bisa melakukan itu (idealnya dengan Scikit belajar)?

Dengan kata lain, bagaimana kita bisa meminimalkan negatif palsu menggunakan klasifikasi SVM? Apakah ada cara untuk menyempurnakan parameter hiper untuk mendukung positif palsu daripada negatif palsu?

Pierre-Antoine
sumber
2
Anda tidak perlu mengubah cara mengoptimalkan SVM Anda, Anda hanya perlu mengubah pada nilai keputusan apa yang Anda nyatakan sebagai observasi negatif atau positif. Sesuaikan itu sesuai selera.
Sycorax berkata Reinstate Monica
@ Scorax Bisakah Anda menguraikan?
Pierre-Antoine
3
Output dari SVM adalah bilangan real, jarak (ditandatangani) dari hyperplane . Sebuah fungsi keputusan mengatakan bahwa untuk , itu positif; selain itu negatif, untuk beberapa spesifik . Anda dapat mengubah untuk mengubah konten matriks kebingungan / perkiraan TPR, FPR, FNR, TNR. xx>ccc
Sycorax berkata Reinstate Monica
1
Saya pikir pertanyaan ini akan lebih tepat pada topik jika Anda menekankan prinsip statistik atau matematika yang lebih umum daripada bagaimana melakukan ini di sklearn. (Saya merasa bahwa komentar saya menunjukkan bahwa pada intinya, pertanyaan ini bersifat statistik.)
Sycorax berkata Reinstate Monica
Harap edit seperti yang disarankan oleh Sycorax; seperti yang diuraikan dalam jawaban-komentar menunjukkan, maka akan dijawab di sini.
Glen_b -Reinstate Monica

Jawaban:

4

Scikit mempelajari implementasi classifier biner SVM tidak membiarkan Anda menetapkan ambang batas seperti komentar / balasan lain yang disarankan. Alih-alih memberikan probabilitas kelas, straighaway menerapkan cutoff default untuk memberi Anda keanggotaan kelas misalnya 1 atau 2.

Untuk meminimalkan negatif palsu, Anda dapat mengatur bobot lebih tinggi untuk sampel pelatihan yang berlabel kelas positif, secara default bobot ditetapkan ke 1 untuk semua kelas. Untuk mengubah ini, gunakan parameter-hiper class_weight.

Idealnya, Anda harus menghindari memilih cutoff dan cukup memberikan probabilitas kelas kepada pengguna akhir yang kemudian dapat memutuskan cutoff mana yang akan diterapkan ketika membuat keputusan berdasarkan classifier.

Metrik yang lebih baik untuk membandingkan pengklasifikasi adalah fungsi penilaian yang tepat, lihat https://en.wikipedia.org/wiki/Scoring_rule dan score()metode dalam modul classifier svm sklearn.svm.SVC.

Sandeep S. Sandhu
sumber
1

Seperti banyak model prediksi, SVM akan menampilkan skor probabilitas dan ambang batas berlaku untuk probabilitas untuk mengubahnya menjadi label positif atau negatif.

Seperti, @Sycorax disebutkan dalam komentar, Anda dapat menyesuaikan ambang batas untuk menyesuaikan trade-off antara false positive dan false negative.

Berikut ini beberapa contoh dalam 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))

Perhatikan ketika kita berubah cut_off, matriks kebingungan (false postive, false negative dll) berubah

> 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
sumber