Step 8(20%):混淆矩阵,与那条你可以挪的阈值
Step 8 是全课最大的单步权重:20%,比 Step 5 和 Step 4 加起来还多。而它一行 fit() 都不需要——它要的全是读数、判断和表达。这一章处理最基础也最有杠杆的一块:那张两行两列的表,以及它背后那条你本来就有权挪动的线。
四个格子,四种业务后果
混淆矩阵不是一个统计概念,是一张后果清单。填它的时候要同时填第三列:
| 格子 | 技术含义 | 在这个 SDG 项目里意味着什么 | 谁承担 |
|---|---|---|---|
| TP(真正例) | 预测未达标,确实未达标 | 资源投到了真正需要的地区 —— 这是我们要最大化的 | — |
| FN(漏报) | 预测达标,实际未达标 | 一个高风险地区整年没有得到干预。代价是儿童生命 | 那个地区的孩子 |
| FP(误报) | 预测未达标,实际达标 | 一次多余的走访/一批投错的疫苗。代价是钱和人力 | 预算 |
| TN(真负例) | 预测达标,确实达标 | 正确地没有打扰 | — |
第三列写出来,Step 8 就赢了一半。因为一旦你写下「FN 的代价是儿童生命,FP 的代价是一趟车费」,接下来的一切——阈值怎么定、该报哪个指标、模型好不好——全都有了依据。
四个格子派生出的指标,各回答一个不同的问题:
| 指标 | 公式 | 它回答的问题 | 什么时候是主指标 |
|---|---|---|---|
| 准确率 Accuracy | (TP+TN)/N | 总共对了多少? | 只在两类大致平衡时有用(第 17 章) |
| 精确率 Precision | TP/(TP+FP) | 我报警的那些,有多少是真的? | 误报很贵时(人工复核成本高) |
| 召回率 Recall | TP/(TP+FN) | 真正的问题,我抓到了几成? | 漏报很贵时——本项目属于此类 |
| F1 | 2PR/(P+R) | 两者的调和平均 | 要一个综合数字时的默认选择 |
| 特异度 Specificity | TN/(TN+FP) | 真正没问题的,我放过了几成? | 医学筛查语境常用 |
| Kappa | (p₀−pₑ)/(1−pₑ) | 扣掉「碰巧猜对」之后还剩多少? | 和准确率一起报,免费的可信度加成 |
那条线本来就可以挪
模型输出的不是「是」或「否」,是一个 0 到 1 的概率。「≥ 0.5 判为正例」这个规则是软件的默认设置,不是模型的一部分,也不是数学结论。
下面这台把两个旋钮交给你:判定阈值,和「漏报比误报贵多少倍」的代价比。混淆矩阵、每个阈值的指标、总代价、以及最优阈值全部当场算:
取默认代价比 10:1(漏掉一个高风险地区 = 十次多余走访),扫一遍阈值:
| 阈值 | 准确率 | 精确率 | 召回率 | F1 | 漏报 FN | 误报 FP | 总代价 |
|---|---|---|---|---|---|---|---|
| 0.10 | 0.757 | 0.641 | 0.967 | 0.771 | 2 | 33 | 53 |
| 0.15 | 0.792 | 0.678 | 0.967 | 0.797 | 2 | 28 | 48 ← 最优 |
| 0.20 | 0.813 | 0.707 | 0.951 | 0.811 | 3 | 24 | 54 |
| 0.30 | 0.819 | 0.740 | 0.885 | 0.806 | 7 | 19 | 89 |
| 0.50(默认) | 0.875 | 0.852 | 0.852 | 0.852 | 9 | 9 | 99 |
| 0.70 | 0.868 | 0.904 | 0.770 | 0.832 | 14 | 5 | 145 |
| 0.90 | 0.840 | 0.952 | 0.656 | 0.777 | 21 | 2 | 212 |
把阈值从 0.5 挪到 0.15,总代价从 99 降到 48——省掉 52%。模型一个字节都没改。
而请注意准确率在最优阈值处反而更低(0.792 vs 0.875)。这是这一章最重要的一句话:你要学会说「我故意牺牲准确率去换召回」,并给出为什么。
你几乎不可能拿到真实的成本数字。但你可以给出一个有依据的量级估计,并说明结论对它有多敏感——这正是决策分析的标准做法:
8.4 代价敏感的阈值选择 漏报(FN)的代价:一个高风险地区未获干预,按 1.2.5 的估算 约对应每年 2 例可避免的儿童死亡。 误报(FP)的代价:一次多余的实地走访与物资投放,约 NZ$400。 由于两者量纲不可直接换算,我们采用相对代价比进行敏感性分析 (在 0.05–0.95 区间以 0.05 步长扫描): 代价比 5:1 → 最优阈值 0.15,总代价 38,召回 0.967 代价比 10:1 → 最优阈值 0.15,总代价 48,召回 0.967 代价比 20:1 → 最优阈值 0.05,总代价 60,召回 0.984 结论:在 5:1 至 20:1 的整个合理区间内,最优阈值都远低于默认的 0.5,且召回率均不低于 0.96;代价比越高,最优阈值越低(这是 预期方向)。因此本项目建议采用阈值 0.15,并在部署时将其作为 可由决策者调节的参数(见 9.1)。
「敏感性分析」这四个字是这一段的灵魂。你不需要知道准确的代价比,你只需要证明在任何合理的代价比下结论都一样。这一段大约 150 字,是 Step 8 那 20% 里最高杠杆的 150 字。
F1 不是万能的:三种「综合指标」的选择
| 指标 | 它默认的假设 | 本项目该用吗 |
|---|---|---|
| F1 | 精确率和召回率一样重要 | 不完全合适——本项目漏报比误报贵得多 |
| Fβ(β=2) | 召回率比精确率重要 β² = 4 倍 | 更合适。写一句「采用 F2 作为主指标,因 FN 代价显著高于 FP」就足够 |
| 期望代价 | 你给出具体的代价比 | 最合适,就是上面那张表的最后一列。它能直接翻译成业务语言 |
很多报告默认用 F1,因为工具默认输出它。但如果你在 8.4 写明「本项目采用 F2 而非 F1,因为……」,这就是一处很容易拿到的加分——它证明你理解指标背后的假设,而不只是复制输出。
1. 行列搞反。sklearn 的 confusion_matrix 默认是「行 = 真实,列 = 预测」,而且类别按字母序排列——'high' 排在 'low' 前面,所以左上角是「真实 high、预测 high」。SPSS 的 Analysis 节点和很多教材是反的。报告里的矩阵一定要标清行列含义,别让读者猜。
2. 在不平衡数据上只报准确率。第 17 章那个 0.922 就是警告。
3. 用测试集反复调阈值,然后报那个最好的结果。严格来说阈值也是一个参数,应该在验证集或交叉验证里选。本课的规模下这个偏差不大,但报告里要老实说:「阈值基于测试集的代价扫描选定,存在轻微乐观偏差;更严格的做法是在训练集内用交叉验证选阈值。」诚实声明不扣分,被抓到没声明才扣分。
8.1「研究已挖出的模式」写什么
这一小节容易和 7.3、8.3 混。三者的分工:
| 小节 | 动词 | 例句 |
|---|---|---|
| 7.3 | 找到 | 「树的第一分裂点为人均 GDP 1 182 美元;该分支下 148 个地区中 82% 未达标。」 |
| 8.1 | 研究、核对 | 「我们核查了该分裂点在 5 折中的稳定性:5 折的分裂点分别为 X、Y、Z……,区间为 A–B,说明该门槛稳健/不稳健。同时检查了落入该叶的地区构成,其中 60% 来自西区。」 |
| 8.3 | 解释 | 「这条门槛提示:低于该收入水平时,单纯提高疫苗覆盖率不足以达标,需配套基础投入。」 |
8.1 的核心动作是「验一验这个模式靠不靠得住」:换个种子还在不在?换个算法有没有一致结论?某个子群里是不是反的?这三个检查各一句话,8.1 就写完了,而且它们让 8.3 的解释有了底气。
| ISAS | OSAS | BDAS | |
|---|---|---|---|
| 混淆矩阵 | Analysis 节点(勾 Coincidence matrices) | confusion_matrix、classification_report | MulticlassMetrics(predictionAndLabels).confusionMatrix() |
| 调阈值 | Analysis 的 propensity 阈值 / 在 Filler 节点里按 $LP-risk 概率重判 | (proba >= t).astype(int) | when(col('probability')[1] >= t, 1).otherwise(0) |
| 代价敏感 | C5.0 / CHAID 的 Misclassification costs 矩阵(直接在建模时告诉它 FN 贵 10 倍) | class_weight={0:1, 1:10} | weightCol(先造一列权重) |
| Kappa | Analysis 节点自带 | cohen_kappa_score | 手算或用 MulticlassMetrics |
SPSS 的 Misclassification costs 是三条线里最优雅的一处:你直接在建模对话框里填「把 high 判成 low 的代价 = 10」,算法在训练时就会考虑它。ISAS 那次一定要用一下这个功能,并对比「有代价矩阵」和「无代价矩阵」两组混淆矩阵——这是一个几乎免费的高质量对比实验。
1. 一张标注清楚的混淆矩阵(行列含义写明)+ 四格业务后果表(上面第一张表的第三列)。
2. 阈值扫描表:至少 7 行(0.1 到 0.9),列出准确率/精确率/召回率/F1/FN/FP/总代价。
3. 代价敏感性分析段(上面模板,约 150 字):代价比的来源、三个代价比下的最优阈值、结论对代价比的稳健性。
4. 主指标声明:「本项目以召回率与 F2 为主指标,准确率仅作参考,理由为 FN 代价显著高于 FP。」
5. Step 8.1 的三个稳定性检查各一句:换种子、换算法、看子群。
这一章的一句话
混淆矩阵的四个格子要配上四种业务后果,因为那才是定阈值的依据;而阈值 0.5 只是软件默认值——在 10:1 的代价比下,把它挪到 0.15 能让总代价从 99 降到 48,代价是准确率从 0.875 掉到 0.792,而你要学会说清「我故意换的」。
下一章讲三张图:ROC、AUC、增益。它们各回答一个不同的问题,而其中只有一张是业务方真正看得懂的。