阈值是什么:先把分数变成类别
设模型对样本 x 输出分数 s(x),阈值为 t,则二分类判定规则可以写成:
ŷ = 1,当 s(x) > t
ŷ = 0,当 s(x) ≤ t
其中,正类通常表示需要被识别出来的类别。使用 predict_proba 时,s(x) 可以是条件概率 P(y = 1 | X);使用 decision_function 时,输出的是决策分数。阈值 t 就是从连续分数到 0/1 标签的判定线。scikit-learn 官方文档《3.3. Tuning the decision threshold for class prediction》把学习概率与依据分数采取判定区分为两个问题:模型负责输出分数,阈值负责把分数转换为具体类别。
为什么默认值不是合适的起点
在 scikit-learn 的二分类接口中,正类默认在预测概率大于 0.5 时被选中;若使用决策函数,默认判定线则是 0。这些规则看起来中性,但官方文档《3.3. Tuning the decision threshold for class prediction》明确指出,硬编码默认值对多数实际任务并不理想。
原因是 0.5 没有表达漏判与误判各自需要承担多大代价。默认值也没有说明更应关注召回率还是精确率。因此,它可以作为计算指标时的参照点,却不应被当成无需论证的通用答案。阈值选择取决于业务代价权衡,没有通用最优值。
阈值移动:严格与宽松的取舍
精确率和召回率分别按下式计算:
P = (TP)/(TP + FP), R = (TP)/(TP + FN)
scikit-learn 官方文档《recall_score》与《precision_score》分别给出了这两个计数公式。阈值提高后,预测为正类的范围缩小,典型表现是召回率下降、精确率上升;阈值降低后,判定更宽松,召回率通常提高,但精确率可能下降。这体现了寻找全部正类与避免误报正类之间的权衡,scikit-learn 官方文档《3.3. Tuning the decision threshold for class prediction》也作了相同说明。
以同一批样本为例,其中正类 10 个、负类 90 个:
- A 档阈值为 0.5,属于库默认设定。TP = 8、FP = 2、FN = 2、TN = 88。
- B 档阈值提高到 0.7,判定更严格。TP = 5、FP = 1、FN = 5、TN = 89,精确率升至 0.8333,召回率降至 0.5000。
- C 档阈值降低到 0.3,判定更宽松。TP = 9、FP = 7、FN = 1、TN = 83。
三档逐项算出来是这样(F2 取 β = 2):
| 档位 | 阈值 | TP | FP | FN | TN | 精确率 | 召回率 | F1 | F2 |
|---|---|---|---|---|---|---|---|---|---|
| A · 默认 | 0.5 | 8 | 2 | 2 | 88 | 0.8000 | 0.8000 | 0.8000 | 0.8000 |
| B · 更严 | 0.7 | 5 | 1 | 5 | 89 | 0.8333 | 0.5000 | 0.6250 | 0.5435 |
| C · 更松 | 0.3 | 9 | 7 | 1 | 83 | 0.5625 | 0.9000 | 0.6923 | 0.8036 |
按 F1 看,默认档 A 最高(0.8000);按 F2 看,最松的 C 反而最高(0.8036),因为 β = 2 把召回率的权重提到了 4 倍,A 漏掉的 2 个正类在这里代价被放大。同一个模型、同一组分数,只是把比较口径从 F1 换成 F2,最优档位就从 A 换成了 C——这正是「先定指标、再定阈值」的含义。表里每行的档位都能点进计算台复核。
路径一:先写清业务代价
设误判为正类的代价为 C_FP,漏判为正类的代价为 C_FN,则可以比较不同阈值下的总代价:
L(t) = C_FP · FP(t) + C_FN · FN(t)
选阈值之前,应先说明哪一种错误更贵、代价比例如何。scikit-learn 官方示例《Post-tuning the decision threshold for cost-sensitive learning》把正类设为“坏信用”,其漏判代价是相反误判代价的 5 倍;在真正正例和真正负例的代价均记为 0 的条件下,优先避免漏判。该示例还说明:在模型概率已经校准、数据具有代表性且规模足够的前提下,概率阈值可设为两种代价之比 1/5。这个数值属于该示例及其前提,不是可套用于所有任务的默认值。
路径二:事先指定 Fβ 目标
Fβ 是精确率与召回率的加权调和平均:
F_β = ((1 + β^2)PR)/(β^2P + R)
scikit-learn 官方文档《3.4.4.9. Precision, recall and F-measures》说明:当 β>1 时更偏向召回率,β<1 时更偏向精确率,β=1 时二者等权。
因此,可以先确定 β,再比较各候选阈值对应的 Fβ。
阈值与 AUC 的关系
阈值只决定从 ROC/PR 曲线上取哪个工作点。scikit-learn 官方文档《3.3. Tuning the decision threshold for class prediction》指出,同一个分类器若输出相同的预测分数,就会得到同一条 ROC 曲线和 PR 曲线;改变阈值后,类别标签和精确率、召回率会变化,但预测分数与曲线不变,由该 ROC 曲线计算的 AUC 也不会改变。
在本站输入真实标签和预测概率后,可以绘制 ROC/PR 曲线并拖动阈值,观察工作点移动时各项指标如何变化,同时保持对“改阈值”和“改模型输出”的区分。