优化 SVM 以避免二分类中的假阴性

机器算法验证 机器学习 交叉验证 支持向量机 Python scikit-学习
2022-03-31 02:19:40

我正在使用 Scikit learn 训练 SVM 二元分类器。

由于我的问题的性质,我需要避免误报。因为没有什么是免费的,所以我可以得到更高的误报率,以减少误报的数量。我们怎样才能做到这一点(最好使用 Scikit 学习)?

换句话说,我们如何使用 SVM 分类器最小化假阴性?是否有某种方法可以调整超参数以支持误报而不是误报?

2个回答

Scikit 学习 SVM 二元分类器的实现不允许您像其他评论/回复所建议的那样设置截止阈值。它没有给出类概率,而是直接应用默认截止值来为您提供类成员资格,例如 1 或 2。

为了最大限度地减少假阴性,您可以为标记为正类的训练样本设置更高的权重,默认情况下,所有类的权重都设置为 1。要改变这一点,请使用超参数class_weight

理想情况下,您应该避免选择截止值,而只是向最终用户提供类概率,然后他们可以在根据分类器做出决策时决定应用哪个截止值。

比较分类器的更好指标是适当的评分功能,请参阅https://en.wikipedia.org/wiki/Scoring_rulescore()svm 分类器模块中的方法sklearn.svm.SVC

像许多预测模型一样,SVM 会输出概率分数和概率的应用阈值,以将其转换为正标签或负标签。

正如评论中提到的@Sycorax,您可以调整截止阈值以调整误报和误报之间的权衡。

这是 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))

注意当我们改变时cut_off,混淆矩阵(假阳性、假阴性等)会改变

> 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