SKLearn SVM中predict_proba阈值≠0.5?预测不一致及指标有效性疑问
SVC模型predict()与predict_proba()>0.5结果不一致的原因及指标有效性分析
我训练了一个设置class_weight='balanced'的SVC模型,使用predict_proba()获取概率计算ROC AUC,用predict()获取预测结果计算F1分数。根据文档预期,(predict_proba()>0.5).astype(int)应与predict()结果一致,但实际不符。运行代码后两者均值差异明显:
a = svm.predict_proba(vec.transform(X))[:,1] b = svm.predict(vec.transform(X)) print(np.mean(b)) print(np.mean((a>0.5).astype(int))) 0.2517116391461941 0.12907772855416835
原因分析
- SVC的
predict()和predict_proba()决策逻辑不直接对应:predict()基于训练时调整后的最优决策边界(设置class_weight='balanced'后,边界会向少数类倾斜以平衡类别权重);而predict_proba()的概率是通过Platt缩放(将SVM原始输出转换为概率的逻辑回归拟合过程)得到的,这个缩放过程独立于决策边界的权重调整,因此0.5的概率阈值并不对应predict()使用的决策边界。 - 当启用
class_weight='balanced'时,模型决策边界已考虑类别不平衡,而Platt缩放是对SVM原始输出(决策函数值)做概率转换,原始输出的零点对应SVM决策边界,但转换后的概率0.5并不等于原始输出零点,直接用0.5截断概率自然和predict()结果出现差异。
指标有效性判断
- F1分数:用
predict()结果计算是有效的。predict()的输出是模型基于训练时的最优决策边界(考虑类别权重)生成的,这个边界是为优化当前类别分布下的分类性能设计的,因此F1分数能准确反映模型实际分类效果。 - ROC AUC:用
predict_proba()计算是有效的。ROC AUC核心是评估模型对正负样本的区分能力,依赖概率的相对排序而非绝对阈值。SVC的predict_proba()输出的概率排序和模型决策函数输出排序一致,因此ROC AUC可可靠衡量模型的区分性能。
内容的提问来源于stack exchange,提问作者hithisispeter
相关产品推荐
相关产品推荐

