结论:用sklearn.metrics.roc_curve和roc_auc_score可计算roc曲线与auc,但y_true需含两类样本且y_score必须为预测概率或决策得分,而非硬分类标签;auc是曲线下精确面积(0.5为随机,1.0为完美),多分类时average参数才生效,roc仅反映排序能力,不体现业务代价。

直接说结论:用 sklearn.metrics.roc_curve 和 sklearn.metrics.auc(或更推荐的 sklearn.metrics.roc_auc_score)就能算,但必须传对参数——尤其是预测概率而非硬分类标签。
为什么 roc_curve 报错 “Only one class present”?
这是最常卡住人的地方:你传给 roc_curve(y_true, y_score) 的 y_true 全是 0 或全是 1,或者 y_score 是模型输出的类别标签(如 [0, 1, 1, 0]),而不是预测概率或决策函数得分。
- 确保
y_true是二值数组(0和1),且两类都至少有一个样本 -
y_score必须是连续型分数:比如model.predict_proba(X)[:, 1](逻辑回归、随机森林等支持概率)或model.decision_function(X)(SVM、线性分类器) - 如果模型不输出概率(如默认的
SVC),别直接用predict()结果——那只会返回 0/1,roc_curve没法画出曲线
怎么画 ROC 曲线并标出 AUC 值?
用 matplotlib 画图本身很简单,关键在于坐标轴和标注是否准确。AUC 值不是“越大越好”的模糊概念,而是曲线下面积的精确数值(0.5 是随机猜测,1.0 是完美区分)。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 调用
fpr, tpr, _ = roc_curve(y_true, y_score)得到横纵坐标点 - 用
auc(fpr, tpr)计算面积;但更推荐直接用roc_auc_score(y_true, y_score),它内部做了更鲁棒的插值处理 - 画图时记得加
plt.plot([0, 1], [0, 1], 'k--', label='Random')作为参考线 - 别忘了
plt.xlabel('False Positive Rate')和plt.ylabel('True Positive Rate'),否则别人看不懂横纵轴含义
roc_auc_score 的 average 参数怎么选?
这在多分类场景下才生效,但很多人误以为二分类也要设。实际上:
- 二分类时
average参数被忽略,直接计算单个 AUC - 多分类时:
average='macro'对每个类单独算 ROC 再平均(不考虑样本量);average='weighted'按各类样本数加权;average=None返回每个类的 AUC 数组 - 如果你做的是 One-vs-Rest(OvR),默认
average='macro'是合理选择;但若某类样本极少,weighted更反映整体性能
真正容易被忽略的是:ROC 和 AUC 只评价排序能力,不反映阈值选择后的实际业务代价。比如在癌症筛查中,你可能宁愿多查几个健康人(高 FPR),也不愿漏掉一个患者(低 TPR)——这时得结合成本矩阵或 Precision-Recall 曲线来看,不能只盯着 AUC 数字。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










