ROC、AUC、增益:三张图各回答什么问题
上一章的阈值表回答的是「在某个阈值下模型表现如何」。这一章的两张图回答的是另外两个问题:不管阈值,这个模型的排序能力有多强(ROC / AUC),以及把这个排序拿去用,能省多少钱(增益 / 提升度)。三张图配齐,Step 8 的可视化一节就完整了。
ROC:把所有阈值一次画完
上一章那张阈值表有 7 行,每行是一个阈值下的(召回率,误报率)。ROC 曲线就是把所有可能的阈值都画上去连成一条线。横轴是误报率 FPR = FP/(FP+TN),纵轴是召回率 TPR = TP/(TP+FN)。
| 模型 | AUC | 曲线形状 |
|---|---|---|
| 逻辑回归 | 0.943 | 光滑——每个样本的概率都不同 |
| 朴素贝叶斯 | 0.932 | 光滑 |
| 决策树(深度 4) | 0.897 | 阶梯状——深度 4 的树只有 10 片叶子,最多只能输出 10 种不同概率 |
| 瞎猜 | 0.500 | 对角虚线 |
AUC 的意思,一句话:随机抽一个正例和一个负例,模型给正例打的分更高的概率。逻辑回归的 0.943 就是「这件事有 94.3% 的把握」。这个解释比「曲线下面积」好懂得多,而且可以直接写进报告给非技术读者看。
树的曲线是阶梯状的,这解释了一个常见困惑:为什么树的 AUC 常常低于逻辑回归,但准确率不一定更差?因为 AUC 奖励「排序精细」——树把 336 个训练样本归到 10 片叶子里,同一片叶子里的地区在树看来完全一样,没法互相排序。而如果你的用途正是「排序取前 N 名」,这就是个真实的缺点,值得写进 8.4。
ROC 的横轴分母是负例总数。如果你的数据 99% 是负例(比如欺诈检测),FPR 从 0.01 涨到 0.02 在图上几乎看不出来,而实际误报数量翻了一倍。
所以:正例占比很低(< 10%)时,用 PR 曲线(精确率-召回率曲线)代替 ROC,因为它的两个轴都只和正例有关,不会被海量负例稀释。
本书示例数据正例占 42.3%,ROC 完全适用。但如果你自己的数据不平衡,在 8.2 里加一句「因正类占比仅 X%,同时报告 PR 曲线与平均精确率(AP)」,这一句就是加分。
增益表:唯一能翻译成钱的那张图
ROC 和 AUC 是给技术读者的。给决策者看的是这一张——把地区按模型分数从高到低排,分成若干箱,看每箱里真正未达标的比例:
| 分箱(按分数降序) | 地区数 | 命中 | 箱内未达标率 | 提升度 lift | 累计覆盖 |
|---|---|---|---|---|---|
| 前 20% | 28 | 28 | 1.000 | 2.36 | 45.9% |
| 20–40% | 29 | 22 | 0.759 | 1.79 | 82.0% |
| 40–60% | 29 | 9 | 0.310 | 0.73 | 96.7% |
| 60–80% | 29 | 1 | 0.034 | 0.08 | 98.4% |
| 80–100% | 29 | 1 | 0.034 | 0.08 | 100% |
基础率(整个测试集的未达标比例)是 42.4%。所以:
- 第一箱的未达标率是 100%,是基础率的 2.36 倍——这就是提升度。
- 只走访前 20% 的地区,就覆盖了 45.9% 的高风险地区;随机走访同样数量只能覆盖 20%。
- 前 40% 覆盖 82.0%。再往后每箱的 lift 都掉到 1 以下——意味着投到 40% 就该停了,继续投等于随机撒钱。
8.3 / 9.1 应用方案 将 144 个地区按模型输出的未达标概率降序排列,分为五等分: · 第一等分(29 个地区)的实际未达标率为 100%,为基础率 (42.4%)的 2.36 倍; · 前两个等分(58 个地区,占 40%)已覆盖全部未达标地区的 82.0%; · 第三等分之后的提升度降至 0.73 以下,投放效率低于随机。 据此建议的投放规则:年度可投放名额若为 15 个,全部取自第一 等分;若名额扩至 40 个,取满前两个等分后停止。相比现行的 按人口平摊(命中率约等于基础率 42%),同样的 15 个名额, 预计命中数由约 6 个提升至 14–15 个。 停止规则:当候选地区的模型概率低于 0.15(对应第三等分起点) 时不再投放,因该区间的提升度已低于 1。
「停止规则」那一段是这门课最像决策支持系统的一段话。能算出「该停在哪」的模型,才叫决策支持;只报一个准确率的,是一份技术练习。
三张图的分工,一句话各一张
| 图 | 回答 | 给谁看 | 报告里的位置 |
|---|---|---|---|
| 混淆矩阵 + 阈值表 | 在我选的这条线上,四种后果各多少? | 你自己、评分员 | 8.1 / 8.4 |
| ROC + AUC | 不管阈值,这个模型的排序能力有多强?多个模型怎么比? | 技术读者 | 8.2 / 8.4 |
| 增益 / 提升度表 | 拿去用,能省多少?该在哪停? | 决策者 | 8.2 / 8.3 / 9.1 |
三张都要有。如果只能有一张,选第三张——因为这门课在商学院,而 LO5 要的是「a prototypical Big Data Analytics Solution to address one of the SDGs」,解决方案的价值要能被业务方看懂。
| ISAS | OSAS | BDAS | |
|---|---|---|---|
| ROC / AUC | Evaluation 节点(选 ROC 图);Analysis 节点给 AUC | roc_curve、roc_auc_score、RocCurveDisplay | BinaryClassificationEvaluator(metricName='areaUnderROC');曲线要自己从 roc 属性取点画 |
| 增益 / 提升度 | Evaluation 节点自带 Gains、Lift、Response、Profit 四种图——这是 SPSS 在这门课里最值钱的一个功能 | 手写:按概率排序 → qcut 分箱 → 每箱命中率 / 基础率 | ntile(10).over(Window.orderBy(desc('prob'))) 后 groupBy 聚合 |
| 成本/利润 | Evaluation 节点的 Profit 图(可填收入与成本) | 手写代价函数(第 18 章) | 手写 |
ISAS 的 Evaluation 节点值得专门花二十分钟:它一次给出 Gains / Response / Lift / Profit 四张图,而且 Profit 图允许你填单位收益和单位成本——那正是第 18 章代价敏感分析的可视化版本。把这四张图截进 ISAS 报告,Step 8.2 会非常充实,而且 OSAS、BDAS 两次可以拿它当参照说「我们用 Python 复现了同样的增益分析,结果一致」。
1. 箱数取决于样本量。10 分箱是行业惯例(decile),但本例测试集只有 144 行,10 箱后每箱 14 个,箱内比例的抖动会很大。样本少就用 5 箱,并在报告里说明原因。(Demo 里可以切换 5/10 箱对比看抖动。)
2. 增益表必须在测试集上算。在训练集上算的增益表会好看得多,也毫无意义。这是一个很常见的错误,因为很多工具默认在全量数据上出图。SPSS 的 Evaluation 节点要接在 Partition 之后并勾选只用 Testing 分区。
1. 一张 ROC 图,含至少两个模型 + 对角线,图注写「AUC = X,含义:随机抽取一个正例与一个负例,模型给正例更高分的概率为 X」。
2. 一张增益/提升度表(5 或 10 箱)+累计增益曲线,在测试集上算。
3. 投放方案与停止规则那一段(上面模板),约 200 字。这一段同时供 8.3 与 9.1 使用。
4. 一句指标选择说明:若正类稀少,加一句「同时报告 PR 曲线与 AP,因 ROC 在负例占绝对多数时会低估误报的绝对数量」。
这一章的一句话
ROC 回答「排序能力有多强」(AUC 0.943 = 随机一正一负、正例得分更高的概率为 94.3%),增益表回答「拿去用值多少钱」(前 20% 覆盖 45.9%、提升 2.36 倍、第三箱起提升度跌破 1 所以该停)——后一张是决策支持的落点,也是这门课在商学院里真正要你交的东西。
下一章处理 Step 8 剩下的部分,也是最难的部分:怎么把结果读成一句不出错的人话。会用到两个演示——四份统计量完全相同却长得完全不同的数据,以及一个会让你差点写出「医生越多死亡率越高」的符号翻转。