分类概率与决策阈值
模型概率表示类别倾向,最终类别由 argmax 或阈值规则产生。
学习前需要掌握
背景与问题
分类模型可以给出概率或分数,但业务通常还需要一个行动:拦截、告警、复核或放行。这一步选择依赖阈值和错误代价,不只由模型内部参数决定。
相同的预测概率,在不同使用场景中可以合理地产生不同决策。将训练、概率估计和行动规则分开,有助于避免把默认阈值误当成必然最优。
概念定义
二分类阈值把正类概率与一个界限比较,再产生类别决定。多分类常选择概率最大的类别,但也可以根据成本、拒识规则或额外限制设计其他决策。
概率需要正确的类别语义、列顺序和校准解释。输出 0.8 不等于每个该样本必然正确,也不意味着模型在所有子群体中都具有相同可信程度。
直观理解
把阈值看成告警门槛。降低门槛会让更多样本被标成正类,可能找回漏掉的目标,也可能增加误报;它没有重新训练模型,只改变了对同一组输出的使用方式。
降低门槛后,多出的正类是谁
构造四条正类概率 [0.2,0.4,0.6,0.8],真实标签为 [0,1,0,1]。阈值 0.5 得到 [0,0,1,1]:一次误报、一次漏报。阈值降到 0.3 后得到 [0,1,1,1],找回第二条,但第三条仍是误报。
这个例子说明门槛移动改变的是错误分配,不是概率本身。是否值得降低门槛,需要把少漏一条与新增复核负担放在同一业务目标下衡量。
核心原理
预测正类前先确认哪一列对应正类,不能总是假设 predict_proba 的第二列就是业务关心的类别。类别编码、排序与模型 classes_ 都需要一致。
阈值改变混淆矩阵中的数量,从而改变 Precision、Recall 和 F1 等指标。通常应在验证或合适的折外预测上按任务成本选择,并保留独立测试。
理想校准概率加上明确成本可以推导决策门槛,但现实中还会受到容量、复核资源和概率误差影响。不能仅为了提高某个指标就忽视业务可执行性。
调整阈值不能修复输入泄漏、标签错误或概率分布漂移。上线后若阳性比例突然变化,还需要核对数据与人群,而不是无限降低或抬高门槛。
数学表达
核心表达
概率最大不保证正确或校准。阈值必须在验证数据上依据误报/漏报成本选择。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1获得 predict_proba
- 2检查概率列顺序
- 3定义错误成本
- 4在验证集比较阈值
代码对应位置
示例 1在同一组固定概率上比较阈值:只改变行动门槛,不重新训练模型。
计算与实现步骤
- 获得 predict_proba
- 检查概率列顺序
- 定义错误成本
- 在验证集比较阈值
- 锁定后测试
代码实现
示例 1
在同一组固定概率上比较阈值
example_01.py用途:只改变行动门槛,不重新训练模型。
import numpy as np
probabilities = np.array([0.2, 0.4, 0.6, 0.8])
for threshold in [0.5, 0.3]:
prediction = (probabilities >= threshold).astype(int)
print(f"threshold={threshold:.1f}: {prediction.tolist()}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
只改变行动门槛,不重新训练模型。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
probabilities = np.array([0.2, 0.4, 0.6, 0.8])
for threshold in [0.5, 0.3]:
prediction = (probabilities >= threshold).astype(int)
print(f"threshold={threshold:.1f}: {prediction.tolist()}")预期输出或运行结果
threshold=0.5: [0, 0, 1, 1] threshold=0.3: [0, 1, 1, 1]
常见错误 · 3 条
- 把概率当事实
- 测试集调阈值
- 忽略概率校准
实际应用
- 欺诈和筛查
- 拒绝策略
常见错误
- 把概率当事实
- 测试集调阈值
- 忽略概率校准
推荐学习资料
参考库不会生成虚假资源或无效外部链接。