ROC AUC 怎么计算才不弄反?核对正类、概率列与单类别报错

以明确正类的人工二分类评分核对 ROC AUC 的概率列、排序方向和单类别评测边界,避免把无有效指标写成成功。

二分类 ROC AUC 应接收与指定正类对应的连续评分。直接传预测类别,会丢掉阈值两边的排序信息;把负类概率当正类评分,还会把方向反过来。先确认正类、概率列和评测集类别,再计算,比看到一个漂亮数字后补猜测更可靠。

以下代码在 Windows、Python 3.11、scikit-learn 1.7.2、NumPy 2.4.6 的本地环境运行核对。数据是教学用人工构造样例,不是业务测评;示例数字只用于检查代码路径。

ROC AUC 怎么计算才不弄反?核对正类、概率列与单类别报错

先准备环境

在自己可写的目录打开终端。首次运行先创建虚拟环境;Windows 用下面的命令,macOS/Linux 把激活命令换成 source .venv/bin/activate。安装只需要在该环境里进行一次。

python -m venv .venv
.venv\Scripts\activate
python -m pip install scikit-learn==1.7.2 numpy==2.4.6

把正类写清楚,不按记忆取第二列

对实际分类器,先打印 model.classes_,再打印 model.predict_proba(X_valid).shape。例如 classes_ 为“不通过、通过”,业务正类是“通过”,才选对应列。不能把所有任务的正类都默认理解为概率数组的第二列。

roc_auc_score 文档描述二分类连续评分的输入;LogisticRegression 文档说明 predict_proba 的列顺序对应 classes_。下面手工构造概率,只验证列选择和计算方向,不冒充模型预测能力。

运行一个方向检查

保存下面代码为 check_auc.py,运行 python check_auc.py。正式使用时,把 classes 替换为 model.classes_,把 proba 替换为验证集的 predict_proba 结果;labels 必须与这些行一一对应。

import numpy as np
from sklearn.metrics import roc_auc_score

labels = np.array(['不通过', '通过', '不通过', '通过', '不通过', '通过'])
# 演示概率和类别列;不是实际模型的评测成绩。
classes = np.array(['不通过', '通过'])
p_positive = np.array([0.1, 0.9, 0.2, 0.8, 0.3, 0.7])
proba = np.column_stack([1 - p_positive, p_positive])
positive_label = '通过'
col = np.flatnonzero(classes == positive_label)
if len(col) != 1:
    raise ValueError('正类必须在模型 classes_ 中唯一存在')
y_binary = (labels == positive_label).astype(int)
if np.unique(y_binary).size != 2:
    raise ValueError('评测集必须同时包含正类和负类')
score = proba[:, col[0]]
print('positive column:', int(col[0]))
print('correct AUC:', roc_auc_score(y_binary, score))
print('wrong-column AUC:', roc_auc_score(y_binary, proba[:, 1-col[0]]))
print('hard-label AUC:', roc_auc_score(y_binary, (score >= 0.95).astype(int)))
assert roc_auc_score(y_binary, score) == 1.0
assert roc_auc_score(y_binary, proba[:, 0]) == 0.0
one_class = np.ones(3, dtype=int)
if np.unique(one_class).size != 2:
    print('single-class split: blocked before scoring')

怎样判断示例是否正确

本地运行输出:正类列号为 1,正确 AUC 为 1.0,取错列为 0.0,用 0.95 切成全零硬标签后为 0.5。这里人为安排所有正例分数高于负例,所以 1.0 是演示预期,不是某个模型的实测成绩。

ROC AUC 反映排序区分能力,不说明概率已经校准,也不能直接告诉你应该采用哪个上线阈值。若要考察漏检和误检,应另外检查指定阈值下的混淆矩阵或召回;比较不同模型时保持同一批独立验证样本。

只有一种类别时,先停止计算

若某个评测切片只有正例或只有负例,ROC 的比较前提不成立。不同版本可能出现异常,或警告并返回 NaN;本教程的 1.7.2 环境应将这类情况当作无有效指标处理,不能把 NaN 填成 0、1 或所谓默认成绩。

代码在调用前检查两类是否同时存在,并输出 single-class split: blocked before scoring。真实数据应保留该分组的样本数和类别计数,检查抽样、时间切分或过滤是否留下单类;也可能这个群体本来就没有另一类,此时直接报告“本切片不适用 ROC AUC”,不要把未来数据混进来凑类别。

排查结果异常还要看哪三处

  • 如果 AUC 突然接近 0:先核对正类列是否取反、标签映射是否反向,不先假设模型完全失效。
  • 如果概率行数和真值不同:追查过滤、排序、join 后的样本编号,禁止截掉多余行后继续算。
  • 如果类别超过两种:本脚本不适用。多分类要按文档明确 multi_class、平均方式和完整概率列;多标签要逐目标定义,不能强行压成一列。

下一步是在自己的独立验证集中打印样本 ID、真值和正类评分的前几行,人工回查对应关系,再运行指标。该流程核对计算口径,不能替代代表性数据和更全面的业务验收。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30827.html

赞 (0)
AI小管家的头像AI小管家
AI 检测图片怎么缩放?用 OpenCV 保持比例并还原框坐标
上一篇 1天前
用 ChatGPT 设计图像数据增强:验证翻转后的图片和检测框
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部