深夜的酒吧门口,保安老周正对着名单发愁——VIP通道前挤了上百号人,可真正的VIP只有几个。他有两个指标必须同时盯着:拦下来的人里到底有几个是真VIP?所有真VIP里他又放进来几个?调严一点,混进来的闲人少了,但VIP也可能被挡在门外;调松一点,VIP是进来了,可牛鬼蛇神也跟着混进舞池。机器学习里的 PR 曲线与 AP 评估指标,讲的就是老周这碗饭:当重要的人永远是少数时,你如何画出“拦人与放人”的权衡曲线,并给这位保安的工作打个总分。
对 AI 从业者而言,PR 曲线与 AP 是数据不平衡场景下最诚实的“照妖镜”。它让你在正样本稀缺的推荐、风控、医疗任务中,一眼看穿模型是真正抓到了目标,还是在靠海量负样本伪装高准确率。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
Recall Precision PR曲线构建 遍历所有阈值,绘制P-R关系曲线 Precision = TP/(TP+FP) Recall = TP/(TP+FN) PR曲线与AP可视化:展示Precision-Recall曲线构建、AP计算、与ROC差异及阈...
精确率与召回率
深夜酒吧门外,保安老周有个“VIP 准入判断器”——来一个人,他根据对方衣着、谈吐、有没有会员卡打个分数,分数超过某个门槛就放进 VIP 区。可他很快发现,两个数字必须同时记:第一,放进 VIP 区的人里,真正是 VIP 的有几个?第二,今晚真正的 VIP 中,他又放进来几个?前者怕混进闲人,后者怕漏掉贵宾。这两个数字,就是精确率与召回率的雏形。
在机器学习里,VIP 被称为“正例”,普通客人被称为“负例”。模型做出的每一次判断,都会落入一张四格登记表:真 VIP 被放进(TP)、普通客人被放进(FP)、真 VIP 被拦下(FN)、普通客人被拦下(TN)。这张表叫混淆矩阵。精确率回答的是“放进的人里有多少是真 VIP”,召回率回答的是“真 VIP 里有多少被放进”。它们分别用两个公式刻画:
1. TP 的含义:True Positive,即“预测为正、实际也为正”的样本——登记表第一格,真 VIP 被保安请进门的次数。
2. FP 的含义:False Positive,即“预测为正、实际为负”的样本——普通客人混进 VIP 区的次数。
3. 精确率(Precision):把 TP 除以“所有被放进 VIP 区的人数(TP+FP)”,得到“放进的人中真 VIP 占比”。分子越高,误拦越少。
4. 召回率(Recall):把 TP 除以“所有真 VIP 的人数(TP+FN)”,得到“真 VIP 中被放进的比例”。分子越高,漏掉越少。
老周看了一眼登记表恍然大悟:精确率高,说明他眼光毒、不放进闲人;召回率高,说明他尽职、不放过一个贵宾。可惜这两个目标天然冲突——VIP 区都挤不下了,闲人自然也会混进去;一个都不放,自然也不可能漏掉 VIP。这正是接下来要讲的权衡故事。
PR曲线构建
老周决定把“准入分数门槛”做成一个旋钮。旋钮拧到最高,只有分数 97 分以上的“绝对贵宾”能进——精确率接近 100%,可绝大多数 VIP 被挡在门外,召回率惨不忍睹。旋钮慢慢往下拧,放进的人越来越多,VIP 也被放进来一些,可普通客人跟着混进来,精确率开始下滑。老周每拧一格,就在一张坐标纸上记一个点:横轴是召回率,纵轴是精确率。把所有点连起来,就得到一条从左上角伸向右下角的曲线——这就是 PR 曲线。
在实际建模中,模型对每个样本输出一个“VIP 程度分数”(通常在 0 到 1 之间)。把所有测试样本按分数从高到低排队,然后像老周拧旋钮一样,从队首开始逐个“放行”。每放行一个人,就重新算一次当前的精确率和召回率。这个扫描过程用一个累加公式描述:
1. 排序后的样本序列:把所有样本按模型分数降序排列,下标 i 从 1 到 N,分数高的人排在前面。
2. 指示变量 yᵢ:当第 i 个样本是真的 VIP 时取 1,否则取 0。这是一串由真实标签组成的 0/1 序列。
3. 前 k 个放行:阈值扫到第 k 个位置时,前 k 个人全部放进 VIP 区。分子是前 k 人里真 VIP 的数量。
4. 召回率与精确率:召回率用真 VIP 总数 N_pos 做分母;精确率用已放行的 k 人做分母。k 越大,放进的人越多,召回率必然上涨,而精确率视混入闲人的情况波动下滑。
老周看着渐渐成形的曲线笑了:左上角是“谁都不放”的极端,右下角是“来者不拒”的极端,而现实中的每一次调门,都落在这条权衡曲线上。一条优秀的 PR 曲线,像一条贴着天花板走的滑梯——在召回率还很低时精确率就能保持很高,直到快要全放行时才愿意低头。
AP与面积
现在问题来了:两个夜店都有保安,老周和新来的小李,谁更靠谱?只看某一个旋钮位置不公平——老周在严格档位表现好,小李在宽松档位表现好。要公平比较,就得看两个人在“从最严调到最松”的整条路上,综合表现谁更优秀。PR 曲线下方的面积,正是这样一个综合打分:面积越大,说明保安在更多档位下都能同时保住房客准确度与贵宾覆盖率。
这个面积在学术上叫平均精确率(Average Precision,简称 AP)。因为 PR 曲线是一条锯齿状折线,不方便直接算积分,工程上常用“梯形法”或“矩形法”把它切成很多竖直小条,逐条求面积再累加。用公式表达,就是把积分拆成离散求和:
1. P(r):把召回率记为 r,P(r) 表示“召回率刚好等于 r 时的精确率”。PR 曲线本质上就是函数 P(r) 的图形。
2. 积分 ∫₀¹:从召回率 0 到 1,把每一个可能档位上的精确率都扫一遍。精确率曲线上方和横轴围成的区域,就是要算的面积。
3. 离散化:实际操作中我们只有有限个档位,取第 k 个档位,前一个档位召回率为 Rₖ₋₁,当前为 Rₖ。
4. 累加求和:用每个小段的召回率增量作为“宽度”、该段精确率 Pₖ 作为“高度”,所有小矩形面积相加,就得到 AP 的近似值。
老周的成绩单出来了:AP 是 0.92,小李是 0.78。这意味着在绝大多数“严格程度”下,老周放进 VIP 区的人里真 VIP 的比例都更高。一个只会“全放行”的菜鸟保安,他的 PR 曲线几乎是一条水平线,高度恰好等于 VIP 在全场客人中的占比——因为全放行时精确率就等于先验比例。AP 这枚金币,把整个权衡过程浓缩成了一个可排序的分数。
不平衡数据
假设老周所在的夜店其实是个高端会所,一晚来 10000 个客人,真 VIP 只有 10 个。这时来了个偷懒的保安小赵,他干脆把门一关,谁都不放。你拿准确率去考核他:10000 个客人里他拦住了 9990 个普通客人,准确率高达 99.9%!老板差点给他发年终奖,可第二天 VIP 客户集体投诉——10 个贵宾全被挡在门外。准确率这座“好评率”,被海量的普通客人(负样本)绑架了。
用公式看更清楚。准确率的分母包含所有样本,而负样本天生占绝对多数:
1. 分子 TP+TN:判断对的两种情况加起来——真 VIP 被放进,普通客人被拦下。
2. 分母四格总和:所有来到门口的人,无论 VIP 还是闲人、放行还是拦截,全部相加。
3. 负样本膨胀:当普通客人占 99.9% 时,TN 这一格巨大无比,即使 TP 为 0,准确率也能逼近 100%。
PR 曲线就没有这个问题,因为它的两个公式里根本没有 TN 出现过。无论是精确率的分母 TP+FP,还是召回率的分母 TP+FN,都只关心“VIP 相关”的样本和“被放进的人”。所以当正样本稀少、而负样本铺天盖地时,PR 曲线是唯一不会装睡的保安——它逼着你看清:你到底有没有接住那 10 个 VIP。
阈值选择
老周终于明白了 PR 曲线的妙处:它不是一块挂在墙上的奖状,而是一张标满了“严格程度”的地图。同一个模型,今晚是明星私密派对,VIP 区容不得半点闲人,他就把阈值调高,往曲线左上角走;明晚是开业大酬宾,老板说宁可多放几个闲人也不能让贵宾等太久,他就把阈值调低,往曲线右下角走。阈值不是死的 0.5,而是生意策略的旋钮。
为了帮老周找一个“既不冤枉闲人、又不怠慢贵宾”的折中档位,工程师发明了 F1 分数——精确率和召回率的调和平均:
1. 两个指标相乘:把精确率和召回率放在分子相乘。只要有一个趋近 0,乘积就被拖垮,F1 立刻变低。
2. 两者相加作分母:分母是两者之和,起到归一化作用,让 F1 始终落在 0 到 1 之间。
3. 系数 2:乘以 2 是为了把 F1 拉到两者算术平均值附近。它是“严格版平均”——只有两者都高,F1 才高,不像算术平均那样可以让一个高分的指标给另一个低分指标“拉票”。
沿着 PR 曲线滑动,F1 像一个平衡探测器,会告诉你哪个档位兼顾了两者的利益。但老周心里清楚:最终选哪个档位,从来不是数学说了算,而是老板的业务账本说了算。医疗筛查宁可错杀不可漏诊,就走高召回;金融放贷宁可少赚不愿坏账,就走高精确。PR 曲线把决策权交还给业务,而不是让模型替你拍板。
对比ROC
在保安培训手册里,还有另一张地图叫 ROC 曲线。如果说 PR 曲线关注的是“VIP 有没有被接住”,那 ROC 曲线关注的是“普通客人被冤枉的比例”。ROC 的横轴是假阳性率,纵轴是真阳性率。和老周的记分方式相对照,真阳性率 TPR 恰好就是召回率;而假阳性率 FPR 则是“被误拦的普通客人占所有普通客人的比例”:
1. TPR 等于召回率:真阳性率的分子分母与召回率完全一致,所以 ROC 的纵轴就是 PR 曲线的横轴。
2. FPR 的含义:False Positive Rate,指“所有普通客人里,被冤枉地放进 VIP 区的比例”。它与精确率看问题的角度正好相反。
3. 分母差异的本质:FPR 分母含 TN。当普通客人海量时,TN 巨大,FPR 会被稀释得很小,ROC 曲线看起来“光滑漂亮”。
回到那个 10000 人的会所:普通客人有 9990 个,即使模型瞎放 500 个闲人进来,FPR 也只有 5%,ROC 曲线依然漂漂亮亮;可在 PR 曲线上,这 500 个闲人会让精确率直接崩盘。所以选型规则很明确:正样本稀少、你只关心 VIP 抓没抓住时,用 PR 曲线;类别基本均衡、你想看整体判别力时,用 ROC 曲线。老周把两张地图叠在桌上——ROC 是给“不怕闲人多”的场合看的,PR 是给“VIP 才是命根子”的场合看的。数据不均衡的夜里,他只信 PR。
AI 应用场景
信贷风控中的坏账拦截
阶段:模型评估与上线前验证
解决的问题:信贷场景中会违约的人通常只有 2%-5%,如果只看准确率,一个“谁都不放贷”的模型能拿到 95% 以上的 Acc,可它一分钱业务都没做。用 PR 曲线评估,能直接看出模型在“抓坏账”这个核心任务上的真实表现;用 AP 分数,还能在多个候选模型间排出优劣。
具体案例:某消费金融公司用 XGBoost 和神经网络分别做违约预测,两个模型的 Acc 都接近 96%。画 PR 曲线后发现,神经网络在召回率 0.6 附近精确率还保持 0.7,而 XGBoost 在那里精确率已跌到 0.4。公司于是选择神经网络,并把阈值调到曲线拐点处,既拦下大部分坏账,又不误伤太多优质客户。
医疗影像中的疾病筛查
阶段:模型效果监控
解决的问题:早期肺癌在体检人群中的占比不足 0.5%,漏诊一个病人可能造成严重后果。筛查模型应该优先保证高召回率——把可疑人员尽量都捞出来,随后再由医生二次确认。PR 曲线用来观察模型在高召回区段的精确率,防止它为了不漏诊而把每个人都说成疑似。
具体案例:某三甲医院引入 AI 辅助读片系统,体检者中真实病变率约 0.3%。团队要求在召回率不低于 95% 的前提下比较两个模型,PR 曲线显示模型 A 在该区段精确率 12%,模型 B 只有 5%,意味着模型 A 每次标记 100 个可疑者里能找出 12 个真病人,大幅减少医生复核工作量。
内容审核中的违规拦截
阶段:模型上线后效果监控
解决的问题:电商平台每天上传数百万商品,违规商品占比不到 1%。平台先用高召回模型筛出所有可疑商品,再由人工审核团队终审。PR 曲线用于评估这第一道筛子的价值:它能在捞出多少违规品的同时,不让审核团队被海量误报淹没。
具体案例:某平台审核流水线上,初筛模型 AP 从 0.31 优化到 0.52 后,人工审核队列中违规率从 9% 提升到 18%,审核工作量直接减半,违规商品漏网率还下降了三分之一。
Python 演示
import numpy as npfrom sklearn.metrics import precision_recall_curve as sk_prfrom sklearn.metrics import average_precision_score as sk_apfrom sklearn.metrics import accuracy_score rng = np.random.default_rng(42) n_samples = 10000pos_ratio = 0.05y_true = (rng.random(n_samples) < pos_ratio).astype(int) score_pos = rng.beta(8, 2, size=y_true.sum())score_neg = rng.beta(2, 5, size=(n_samples - y_true.sum()))y_score = np.concatenate([score_pos, score_neg]) def custom_pr(labels, scores): order = np.argsort(-scores) labels_sorted = labels[order] tp = np.cumsum(labels_sorted) fp = np.cumsum(1 - labels_sorted) total_pos = labels_sorted.sum() recall = tp / total_pos precision = tp / (tp + fp) precision = np.r_[1.0, precision] recall = np.r_[0.0, recall] return precision, recall def custom_ap(labels, scores): precision, recall = custom_pr(labels, scores) ap = 0.0 for i in range(1, len(recall)): ap += (recall[i] - recall[i - 1]) * precision[i] return ap precision, recall, thresholds = sk_pr(y_true, y_score)sklearn_ap = sk_ap(y_true, y_score)custom_ap_value = custom_ap(y_true, y_score) acc_all_negative = accuracy_score(y_true, np.zeros_like(y_true))acc_default_thr = accuracy_score(y_true, (y_score >= 0.5).astype(int))pos_rate = y_true.mean() print("正样本占比: {:.2%}".format(pos_rate))print("sklearn AP: {:.4f}".format(sklearn_ap))print("custom AP: {:.4f}".format(custom_ap_value))print("全预测为负类时的准确率: {:.4f}".format(acc_all_negative))print("默认阈值0.5时的准确率: {:.4f}".format(acc_default_thr))tar_idx = np.argmin(np.abs(recall - 0.8))print("在召回率约80%时的精确率: {:.2%}".format(precision[tar_idx]))
y_true = (rng.random(n_samples) < pos_ratio).astype(int)按 5% 概率生成真实标签,模拟 VIP 稀少的夜店。score_pos = rng.beta(8, 2, ...)给正样本分配偏高的分数,让模型大体上能把 VIP 和非 VIP 区分开。order = np.argsort(-scores)所有候选人按 VIP 程度分数从高到低排序,相当于老周的准入名单。tp = np.cumsum(labels_sorted)前缀累加:每放行 k 人,统计其中真 VIP 的累计数量。fp = np.cumsum(1 - labels_sorted)前缀累加:已放行的 k 人里,混入的普通客人数量。precision = tp / (tp + fp)每个阈值得分档位上的精确率序列。recall = tp / total_pos每个档位上的召回率序列。ap += (recall[i] - recall[i-1]) * precision[i]矩形法累加每个召回率增量与对应精确率的乘积,近似积分得到 AP。acc_all_negative = accuracy_score(y_true, np.zeros_like(y_true))一个什么都不做的模型,靠“谁都不放”也能拿到的虚假高准确率。target_idx = np.argmin(np.abs(recall - 0.8))找到召回率最接近 80% 的档位,查看该业务点上的精确率。
常见误区
误区我训练的模型准确率到了 97%,上线肯定没问题。评估报告上 Accuracy 那一栏数字这么漂亮,领导看了都满意。
正解在正样本占比不到 5% 的任务里,一个“谁都不放行”的保安也能拿到 95% 的准确率——可他一个 VIP 都没接住。准确率的分母被海量负样本填满,TN 再大也只是“拦对了普通人”而已。PR 曲线与 AP 才真正回答“VIP 有没有被抓住”,评估模型必须结合业务目标看这两项。
为何常见:入门时最先接触的就是准确率,直觉上“对的样本除以全部样本”听起来天经地义,很容易忽略正负样本比例失衡时这个指标会被支配。
误区模型 A 的 AP 是 0.85,模型 B 的 AP 是 0.80,所以 A 在所有情况下都碾压 B。
正解AP 是整条曲线的“平均表现”,但它掩盖了局部差异。可能 A 在高召回区段精确率崩盘,而你的业务恰恰要求在高召回区段运行;也可能 B 虽然总分低,但在“召回率 0.9 以上”这个你真正需要的区间精确率更高。决策前必须回到 PR 曲线上,观察目标区段的形态,而不是只对着一个分数做比较。
为何常见:人天生喜欢用单一数字做决策,AP 恰好是个“很能打的单数字”,容易让人跳过曲线细节直接比较。
误区网上说 ROC 曲线比 PR 曲线用得更普遍,那我以后统一画 ROC 不就行了?反正是同一个模型,换个图不至于差太多。
正解在类别高度不平衡时,ROC 的横轴是 FPR,其分母含海量负样本,任何一个 FP 都会被稀释得微不足道,曲线永远显得“乐观漂亮”;而 PR 曲线的精确率直接面对 FP 的冲击,能诚实地暴露模型抓正样本的能力。选哪个取决于问题本身:正样本稀少且你只关心它,就选 PR;类别均衡、想评估整体排序力,才选 ROC。
为何常见:初学者接触的大多是 MNIST 等均衡数据集,ROC 和 PR 差别不大,容易形成“两者等价”的错误印象。
误区模型输出的是概率,那大于 0.5 判为正例不是理所当然的吗?阈值不用调,0.5 肯定是全局最优。
正解0.5 只是“两类最对称”时的默认分界,并不对应任何业务目标。疾病筛查需要召回率 95% 以上,就要把阈值调低;放贷风控需要精确率足够高,就要把阈值调高。PR 曲线就是用来指导调阈值的工具——它把每个阈值对应的精确率/召回率都明明白白画出来,让你按业务需求选档位,而不是把命运交给默认值。
为何常见:很多模型库的默认分类函数就是按 0.5 截断,用久了会误以为 0.5 是数学上推导出的最优值,而忽略了决策阈值本质上是业务参数。
面试题
Q1. 关于精确率(Precision)的定义,下列说法正确的是
- A.所有预测为正的样本中,实际为正的比例← 正确答案
- B.所有实际为正的样本中,预测为正的比例
- C.所有样本中预测正确的比例
- D.预测正确的样本占预测为正样本的比例
答案:A。精确率的分母是“所有被放进 VIP 区的人(TP+FP)”,分子是“其中真 VIP(TP)”,所以 A 正确。B 是召回率;C 是准确率;D 混淆了正确预测与“预测为正”的边界,若预测为负但正确也被算入则方向就错了。
Q2. 召回率(Recall)刻画的是模型哪方面的能力
- A.所有真正的正例中被模型找出来的比例← 正确答案
- B.所有预测结果中被正确分类的比例
- C.所有负例中被正确排除的比例
- D.所有样本中被正确分类的比例
答案:A。召回率 = TP / (TP+FN),分母是所有真 VIP,分子是找到的真 VIP,所以它回答“真 VIP 里找回了多少”。B 和 D 描述的是准确率,C 描述的是特异度(负例被正确排除的比例),都与召回率无关。
Q3. 把分类阈值从 0.9 降低到 0.5,精确率和召回率通常如何变化
- A.精确率上升,召回率下降
- B.精确率下降,召回率上升← 正确答案
- C.精确率和召回率同时上升
- D.精确率和召回率同时下降
答案:B。阈值降低等于保安放行标准变松,放进 VIP 区的人变多,真 VIP 更容易进来故召回率上升;同时普通客人混入的概率也增大,即 FP 增多,精确率 = TP/(TP+FP) 的分子增长赶不上分母增长,精确率下降。这是 PR 曲线最基本的权衡关系。
Q4. 在正样本占比仅 1% 的分类任务中,为什么准确率不适合做主要评估指标
- A.负样本占绝大多数时 Accuracy 被 TN 主导,看起来虚高← 正确答案
- B.Accuracy 公式中不含正样本的信息
- C.负样本占比极小时 Accuracy 会恒等于 0
- D.Accuracy 只适合回归问题不能用于分类
答案:A。Accuracy = (TP+TN)/(TP+FP+FN+TN),当负样本占 99% 时,只要把所有样本判为负类,TN 一项就贡献约 99% 的正确率。方案 B 错在 Accuracy 含 TP 项;方案 C 错在负样本占极小值时准确率反而容易被 TN 推高而非归零;方案 D 是常识错误。
Q5. 平均精确率(AP)的数学含义是
- A.PR 曲线下的面积← 正确答案
- B.ROC 曲线下的面积
- C.精确率最高的那个点的值
- D.精确率与召回率的乘积
答案:A。AP 是对 PR 曲线在召回率 0 到 1 区间上做积分,近似等于曲线下面积,本质是“每个召回率档位上精确率的加权平均”。ROC 曲线下面积叫 AUC;C 只取了单点最值;D 恰好是另一种派生指标,也不是 AP。
Q6. 以下哪些场景更适合使用 PR 曲线评估模型
- A.癌症筛查中正样本占比不足 0.5%,漏诊代价极高← 正确答案
- B.MNIST 手写数字分类任务中十类样本数量近似均衡
- C.信用卡欺诈检测中欺诈交易仅占总交易量的 0.1%← 正确答案
- D.推荐系统评估模型对少数高价值用户的捕获能力← 正确答案
答案:ACD。PR 曲线在正样本稀少且业务聚焦正类时最能暴露模型真实能力,A、C、D 都符合。B 是类别均衡任务,正负样本数量相当,此时用 ROC 衡量整体判别力即可,PR 曲线与 ROC 差异不大,不是非选 PR 不可的特型场景。
Q7. 某模型对测试集预测后得到 TP=40、FP=10、FN=60,则该模型的精确率和召回率分别为
- A.精确率 80%,召回率 40%← 正确答案
- B.精确率 40%,召回率 80%
- C.精确率 50%,召回率 50%
- D.精确率 40%,召回率 40%
答案:A。精确率 = TP/(TP+FP) = 40/(40+10) = 80%,即放进 VIP 区的人里八成是真 VIP;召回率 = TP/(TP+FN) = 40/(40+60) = 40%,即真实正例只找回四成。两者常在阈值变化时此消彼长,题目特意把两个数字设计成易混淆的组合。
Q8. 关于 F1 分数,下列说法正确的有
- A.F1 是精确率与召回率的调和平均← 正确答案
- B.F1 的计算公式是 2×P×R/(P+R)← 正确答案
- C.F1 只与精确率有关,与召回率无关
- D.F1 的值一定大于精确率和召回率中较大的那个
答案:AB。F1 用调和平均而不是算术平均,它的特点是被较小值“拖后腿”,只有当精确率和召回率都高时 F1 才高,A、B 正确。C 明显错误;D 错误,调和平均永远落在两者之间,既不会大于较大者,也不会小于较小者。
Q9. 已知某模型 PR 曲线近似经过三个点:(0, 1)、(0.25, 0.8)、(0.5, 0.6)、(1.0, 0.4),用矩形法(左侧取高)近似计算 AP 最接近
- A.AP ≈ 0.55← 正确答案
- B.AP ≈ 0.60
- C.AP ≈ 0.50
- D.AP ≈ 0.65
答案:A。矩形法把召回率区间 [0,1] 切成三段,用各段左侧高度乘以宽度累加:AP ≈ (0.25−0)×0.8 + (0.5−0.25)×0.6 + (1.0−0.5)×0.4 = 0.20 + 0.15 + 0.20 = 0.55。题目中 (0,1) 是曲线起点“谁都不放”时精确率为 1 的极端点,不能作为矩形的高度。
Q10. 关于 PR 曲线与 ROC 曲线的比较,下列说法正确的有
- A.数据高度不平衡时 ROC 曲线容易显得乐观← 正确答案
- B.PR 曲线下面积一定等于 ROC 曲线下面积
- C.AP 对正样本的表现变化更敏感← 正确答案
- D.两条曲线在任何数据集上都完全等价
答案:AC。ROC 的横轴 FPR 分母含 TN,负样本海量时 FP 被稀释,曲线偏乐观,A 正确。PR 曲线直接以正类预测为核心,正样本表现变化会显著改变曲线形态,C 正确。两种曲线度量的是不同方面的性能,面积没有相等关系,B、D 都错误。