文章 · 2024-01-01

分类模型评估指标

混淆矩阵

预测为正 预测为负
真实为正 TP (真正例) FN (假负例)
真实为负 FP (假正例) TN (真负例)

这四个基本计数是所有标准分类指标的基础。

点值型指标

这些指标对应于一个确定的分类阈值(通常为 0.5)。

指标 公式 含义 适用场景
准确率 (Accuracy) $\frac{TP+TN}{TP+FP+FN+TN}$ 整体预测正确的比例。 类别均衡、两类错误成本相等。在不均衡数据上常产生误导。
精确率 (Precision) $\frac{TP}{TP+FP}$ 在预测为正的样本中,真正为正的比例。 垃圾邮件过滤、医学诊断确认。
召回率 (Recall) $\frac{TP}{TP+FN}$ 在真实为正的样本中,被正确预测的比例。 疾病筛查、欺诈检测。
特异性 (Specificity) $\frac{TN}{TN+FP}$ 在真实为负的样本中,被正确预测的比例。 信贷风控;避免错误拒绝。
F1-Score $2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}$ 精确率和召回率的调和平均。 两类错误同等重要的场景。
Fβ-Score $(1+\beta^2) \frac{\text{P} \cdot \text{R}}{\beta^2 P + R}$ 倾向于召回 (β>1) 或精确率 (β<1)。 召回关键 (β=2);精确率关键 (β=0.5)。
平衡准确率 (Balanced Accuracy) $\frac{\text{Recall} + \text{Specificity}}{2}$ 对类别不均衡不敏感。 数据不均衡;罕见病识别。
MCC (马修斯相关系数) $\frac{TP \cdot TN - FP \cdot FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}$ 相关系数 (−1 到 1);对不均衡鲁棒。 极度不均衡的二分类。

常见陷阱:在 99:1 不均衡数据上,一个总是预测"负"的模型达到 99% 准确率,但毫无用处。

阈值无关指标

这些指标评估模型在所有可能阈值下的性能。

指标 方法 何时使用
ROC 曲线 & AUC 以召回率 vs. 假正例率绘制,随阈值变化。AUC 是曲线下面积。 类别相对均衡;阈值可调;成本未知;评估排序能力。
PR 曲线 & AUPRC 以精确率 vs. 召回率绘制;AUPRC 是曲线下面积。 正样本稀少 (如点击率 <1%);关心假正例。对不均衡数据,PR 曲线比 ROC-AUC 能更真实反映模型性能,因为大量真负例会让 ROC-AUC 虚高。

概率质量指标

这些指标直接评估预测概率的质量,而非最终类标。

指标 含义 适用场景
对数损失 (Log Loss) 负对数似然。对预测错误且有信心的样本重惩罚。越低越好。 训练和调优概率模型。
布里尔分数 (Brier Score) 预测概率与真实标签 (0 或 1) 的均方误差。越低越好。 天气预报、体育预测;评估概率准确性。
期望校准误差 / 最大校准误差 (ECE / MCE) 预测概率与观测频率的差异度量。 生产系统中需要可信置信度的场景。

多分类评估

跨多个类别对指标取平均时:

若 Macro-F1 远低于 Micro-F1,说明模型在少数类上表现不佳。始终先绘制类别分布。

常见问题

混淆精确率和召回率。 召回率衡量你抓住了什么 (漏报);精确率衡量误报 (虚警)。

F1 并非通用。 若业务更看重召回 (如癌症筛查),用 F2;若精确率最重要 (如法务文档检索),用 F0.5。

AUC 不可跨数据集直接比较。 不同的类别分布、样本难度和数据规模会影响曲线形态。不应直接比较不同测试集的 AUC 值。

排序能力 vs. 概率校准。 高 ROC-AUC 表示模型排序能力强,但不保证预测概率准确。生产部署前,需同时用 AUC 和 LogLoss 或 ECE 验证。

Python 实战模板

这个模板用 scikit-learn 在不均衡的多分类数据集上计算多种指标。

import numpy as np
from sklearn.metrics import (accuracy_score, precision_recall_fscore_support,
                             roc_auc_score, average_precision_score,
                             log_loss, brier_score_loss, confusion_matrix, matthews_corrcoef)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 1. 生成一个不均衡的多分类数据集
X, y = make_classification(n_samples=3000, n_classes=3,
                           weights=[0.7, 0.25, 0.05], # 类别权重不均衡
                           n_informative=5, n_redundant=2,
                           flip_y=0.03, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)

# 2. 训练一个简单的逻辑回归模型
model = LogisticRegression(max_iter=1000, multi_class="ovr", random_state=42)
model.fit(X_train, y_train)
y_proba = model.predict_proba(X_test)
y_pred = model.predict(X_test)

# 3. 计算各类指标
print("--- Classification Metrics ---")

# 点值指标 (加权平均)
acc = accuracy_score(y_test, y_pred)
prec, rec, f1, _ = precision_recall_fscore_support(y_test, y_pred, average='weighted')
mcc = matthews_corrcoef(y_test, y_pred)

print(f"Accuracy (Weighted) : {acc:.4f}")
print(f"Precision (Weighted): {prec:.4f}")
print(f"Recall (Weighted)   : {rec:.4f}")
print(f"F1-Score (Weighted) : {f1:.4f}")
print(f"Matthews Corr Coef  : {mcc:.4f}\n")

# 宏平均指标 (更能反映小类性能)
macro_prec, macro_rec, macro_f1, _ = precision_recall_fscore_support(y_test, y_pred, average='macro')
print(f"Precision (Macro)   : {macro_prec:.4f}")
print(f"Recall (Macro)      : {macro_rec:.4f}")
print(f"F1-Score (Macro)    : {macro_f1:.4f}\n")


# 概率质量指标
logloss = log_loss(y_test, y_proba)
# Brier Score 需要对每个类分别计算后平均
brier = np.mean([brier_score_loss((y_test == k), y_proba[:, k]) for k in np.unique(y_test)])

print(f"LogLoss             : {logloss:.4f}")
print(f"Brier Score (Avg)   : {brier:.4f}")

输出示例:

--- Classification Metrics ---
Accuracy (Weighted) : 0.8944
Precision (Weighted): 0.8861
Recall (Weighted)   : 0.8944
F1-Score (Weighted) : 0.8862
Matthews Corr Coef  : 0.7183

Precision (Macro)   : 0.7989
Recall (Macro)      : 0.7311
F1-Score (Macro)    : 0.7552

LogLoss             : 0.2819
Brier Score (Avg)   : 0.0542

Macro-F1 (0.755) 明显低于 Weighted-F1 (0.886)。这个差异揭示了模型在少数类上表现不佳——仅看总体准确率很容易忽视这一点。

指标选择

  1. 明确业务成本:每类错误的代价是多少?
  2. 选择点值指标:已知成本时,优化阈值并报告精确率/召回率/Fβ。未知成本时,F1-Score 是合理的默认。
  3. 检查概率校准:部署前,验证 LogLoss 和 ECE 或 Brier Score。
  4. 评估排序能力:用 AUPRC (不均衡) 或 ROC-AUC (均衡) 评估整体区分能力。
  5. 处理不均衡:若 Macro-F1 ≪ Micro-F1,分析哪些少数类表现差。考虑重采样、代价敏感学习或 Focal Loss。
© 2026 Yuxu Ge ·