You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:50:45