Tối ưu hóa SVM để tránh âm tính giả trong phân loại nhị phân


9

Tôi đang đào tạo một trình phân loại nhị phân SVM bằng Scikit learn.

Do bản chất của vấn đề của tôi, tôi cần tránh những tiêu cực sai. Vì không có gì là miễn phí, tôi ổn khi nhận được tỷ lệ dương tính giả cao hơn để giảm số lượng âm tính giả. Làm thế nào chúng ta có thể làm điều đó (lý tưởng với Scikit tìm hiểu)?

Nói cách khác, làm thế nào chúng ta có thể giảm thiểu các phủ định sai bằng cách sử dụng trình phân loại SVM? Có một số cách để điều chỉnh các tham số siêu để có lợi cho dương tính giả hơn âm tính giả?


2
Bạn không cần thay đổi cách tối ưu hóa SVM của mình, bạn chỉ cần thay đổi giá trị quyết định mà bạn tuyên bố là quan sát là tiêu cực hay tích cực. Điều chỉnh cho hợp khẩu vị.
Sycorax nói Phục hồi lại

@Sycorax Bạn có thể giải thích?
Pierre-Antoine

3
Đầu ra của một SVM là một số thực, một khoảng cách (đã ký) từ siêu phẳng . Hàm quyết định nói rằng với , đó là số dương; khác nó là một tiêu cực, đối với một số cụ thể . Bạn có thể thay đổi để thay đổi nội dung của ma trận nhầm lẫn / ước tính của TPR, FPR, FNR, TNR. xx>ccc
Sycorax nói phục hồi Monica

1
Tôi nghĩ rằng câu hỏi này sẽ thẳng thắn hơn về chủ đề nếu bạn nhấn mạnh các nguyên tắc thống kê hoặc toán học tổng quát hơn là làm thế nào để làm điều này trong sklearn. (Tôi cảm thấy rằng những nhận xét của tôi chứng minh rằng ở cốt lõi của nó, câu hỏi này có tính chất thống kê.)
Sycorax nói rằng Rebstate Monica

Vui lòng chỉnh sửa theo đề xuất của Sycorax; như câu trả lời được nêu ra trong bình luận chỉ ra, sau đó nó sẽ có thể trả lời được ở đây.
Glen_b -Reinstate Monica

Câu trả lời:


4

Scikit tìm hiểu triển khai trình phân loại nhị phân SVM không cho phép bạn đặt ngưỡng cắt như các nhận xét / trả lời khác đã đề xuất. Thay vì đưa ra xác suất của lớp, nó sẽ áp dụng một mức cắt mặc định để cung cấp cho bạn thành viên của lớp, ví dụ 1 hoặc 2.

Để giảm thiểu âm tính giả, bạn có thể đặt trọng số cao hơn cho các mẫu đào tạo được gắn nhãn là lớp dương, theo mặc định, các trọng số được đặt thành 1 cho tất cả các lớp. Để thay đổi điều này, sử dụng siêu tham số class_weight.

Tốt nhất, bạn nên tránh chọn điểm cắt và chỉ cần cung cấp xác suất lớp cho người dùng cuối, người sau đó có thể quyết định áp dụng mức cắt nào khi đưa ra quyết định dựa trên phân loại.

Một số liệu tốt hơn để so sánh các trình phân loại là một chức năng chấm điểm thích hợp, xem https://en.wikipedia.org/wiki/Scoring_rulescore()phương thức trong mô-đun phân loại svm sklearn.svm.SVC.


1

Giống như nhiều mô hình dự đoán, SVM sẽ đưa ra điểm số xác suất và ngưỡng áp dụng cho xác suất để chuyển đổi nó thành nhãn dương hoặc âm.

Như, @Sycorax đã đề cập trong bình luận, bạn có thể điều chỉnh ngưỡng giới hạn để điều chỉnh sự đánh đổi giữa dương tính giả và âm tính giả.

Đây là một số ví dụ trong 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))

Lưu ý khi chúng tôi thay đổi cut_off, ma trận nhầm lẫn (sai định nghĩa, sai âm, v.v.) thay đổi

> 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      
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.