我正在使用 Scikit learn 训练 SVM 二元分类器。
由于我的问题的性质,我需要避免误报。因为没有什么是免费的,所以我可以得到更高的误报率,以减少误报的数量。我们怎样才能做到这一点(最好使用 Scikit 学习)?
换句话说,我们如何使用 SVM 分类器最小化假阴性?是否有某种方法可以调整超参数以支持误报而不是误报?
我正在使用 Scikit learn 训练 SVM 二元分类器。
由于我的问题的性质,我需要避免误报。因为没有什么是免费的,所以我可以得到更高的误报率,以减少误报的数量。我们怎样才能做到这一点(最好使用 Scikit 学习)?
换句话说,我们如何使用 SVM 分类器最小化假阴性?是否有某种方法可以调整超参数以支持误报而不是误报?
Scikit 学习 SVM 二元分类器的实现不允许您像其他评论/回复所建议的那样设置截止阈值。它没有给出类概率,而是直接应用默认截止值来为您提供类成员资格,例如 1 或 2。
为了最大限度地减少假阴性,您可以为标记为正类的训练样本设置更高的权重,默认情况下,所有类的权重都设置为 1。要改变这一点,请使用超参数class_weight
。
理想情况下,您应该避免选择截止值,而只是向最终用户提供类概率,然后他们可以在根据分类器做出决策时决定应用哪个截止值。
比较分类器的更好指标是适当的评分功能,请参阅https://en.wikipedia.org/wiki/Scoring_rule和score()
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