模型评估与错误代价
评价指标必须匹配真实使用方式、类别分布和错误成本。
前置知识
通俗直觉
准确率只回答总体对了多少,却不区分漏报与误报的业务后果。疾病筛查、风险预警与普通图像分类的错误代价不同,不能凭同一个高分判断系统是否可用。
评价应先明确预测对象、正类和实际决策,再选择数据划分与指标。分数必须来自未参与相应训练与选择的数据,才能讨论对新样本的表现。
核心原理
混淆矩阵把二分类拆成 TP、FP、FN、TN。Precision 关注被预测为正的对象中有多少是真的,Recall 关注真实正例覆盖了多少;同一系统可以有很高精确率却漏掉大量正例。
F1 汇总精确率与召回率,但不直接包含真负例,也不等于业务成本。若漏报代价为误报的很多倍,可以建立明确的代价表达式,比较阈值变化带来的总影响,同时检查审核容量等约束。
概率质量、排序质量与阈值决策也不同。AUC 高不保证当前阈值合适;概率校准不足时,预测 0.8 也未必对应实际 80% 发生率。阈值和模型方案应在开发数据上选择,再独立评估。
总体指标需结合类别比例、切片和样本规模解释。类别分布或错误代价变化后,原来合适的阈值可能不再合适,应重新验证,而不是把一次测试分数当作永久认证。
案例:95% 准确率是否值得采用
构造 100 个样本,其中 10 个正类。模型找到其中 5 个,没有误报,于是准确率 95%、精确率 100%,但召回率仅 50%。如果每次漏报损失 20 个代价单位,总代价是 5 × 20 = 100。
全猜负类准确率也有 90%,却漏掉全部 10 个正类,代价为 200。这个模型比常量基线有进步,但是否足够仍取决于业务要求和其他阈值表现。数字仅用于说明代价比较,不能视作真实场景测得结果。
数学公式
误报成本高看精确率,漏报成本高看召回率。
工作流程
- 明确输入、输出与评价方式
- 建立简单基线
- 实现并检查关键中间量
- 在验证数据上诊断和迭代
代码示例
Python
example.pyfrom sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score
y_true = [0] * 90 + [1] * 10
y_pred = [0] * 95 + [1] * 5
tn, fp, fn, tp = confusion_matrix(y_true, y_pred, labels=[0, 1]).ravel()
cost = int(fp + 20 * fn)
print(f"tn={tn}, fp={fp}, fn={fn}, tp={tp}")
print(f"accuracy={accuracy_score(y_true, y_pred):.3f}")
print(f"precision={precision_score(y_true, y_pred):.3f}")
print(f"recall={recall_score(y_true, y_pred):.3f}")
print("cost:", cost)- 显式指定负类 0、正类 1,与矩阵展开顺序一致。
- 20 倍漏报成本是教学假设,真实成本需要业务确认。
计算上方案例的混淆矩阵与明确构造的代价,保留 legacy 结构与旧锚点。
运行输出(本地 scikit-learn 1.8.0):
example.pytn=90, fp=0, fn=5, tp=5
accuracy=0.950
precision=1.000
recall=0.500
cost: 100应用场景
- 建立可靠训练流程
- 诊断模型行为
常见误区
- 只报准确率或精确率,隐去少数类数量与漏报。
- 在最终测试集上选阈值或反复选模型,再用同一分数证明泛化。
- 把教学代价、默认阈值或一次类别比例直接当成所有业务的标准。
推荐学习资料
scikit-learn User Guide
覆盖监督学习、无监督学习、预处理、模型选择、评估和常见陷阱。
scikit-learn Contributors · scikit-learn
资料笔记
scikit-learn Examples
按算法和应用组织可运行示例,展示预处理、训练、评估与可视化流程。
scikit-learn Contributors · scikit-learn
资料笔记
scikit-learn/scikit-learn
经典机器学习算法、模型选择、预处理和评估工具的核心实现仓库。
scikit-learn Contributors · GitHub
仓库信息
研究 scikit-learn 实现和贡献流程
主要语言:Python / Cython包含数据集或实验需要额外环境资料笔记
Rules of Machine Learning
从指标、特征、管线和迭代方式总结构建真实机器学习系统的实践原则。
Martin Zinkevich · Google for Developers