sklearn中roc_auc_score与plot_roc_curve的AUC计算差异问题
AUC结果偏差的核心原因
两个计算路径输入的预测值类型存在本质差异:
- 你手动调用
roc_auc_score()时,传入的yPred来自model.predict(X_test),输出是非0即1的硬分类标签,属于离散值。 plot_roc_curve()内部不会使用predict()的输出,而是自动调用模型的predict_proba()(或decision_function(),匹配模型自身实现逻辑),获取范围连续的预测置信度得分(比如正类的概率值),基于全量阈值扫描生成完整ROC曲线后计算AUC。
验证方式
修改你的代码,将连续预测概率传入roc_auc_score,即可得到和绘图组件完全一致的结果:
# 取样本属于正类的预测概率作为输入 y_pos_proba = model.predict_proba(X_test)[:, 1] print(roc_auc_score(y_test, y_pos_proba))
为什么硬标签计算的AUC会偏低
用离散的0/1标签计算AUC,相当于只截取了全量ROC阈值中的1个点的分类结果,丢失了模型对不同样本的置信度差异信息,无法完整反映模型对样本的排序能力,因此计算出的AUC必然低于基于连续得分得到的标准AUC。你在真实数据集上观测到的0.1量级的偏差,就是两种计算逻辑的固有差值,和模型训练效果无关。
补充提示
- 从sklearn 1.2版本开始,
plot_roc_curve已被弃用,推荐使用RocCurveDisplay.from_estimator或RocCurveDisplay.from_predictions替代,核心计算逻辑没有变化。 - 计算AUC时必须传入连续的预测分数(概率、决策得分等),不要直接传入
predict()输出的硬分类标签。
内容的提问来源于stack exchange,提问作者hafnerl
相关产品推荐
相关产品推荐

