分类模型评估指标
混淆矩阵
| 预测为正 | 预测为负 | |
|---|---|---|
| 真实为正 | 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) | 预测概率与观测频率的差异度量。 | 生产系统中需要可信置信度的场景。 |
多分类评估
跨多个类别对指标取平均时:
- Micro 平均:汇总所有类别的基本计数,各样本同等权重。用于整体性能。
- Macro 平均:分别计算每个类别的指标,再取平均,各类别同等权重。突出少数类的表现。
- Weighted 平均:Macro 平均,按各类样本数加权。折中方案。
若 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)。这个差异揭示了模型在少数类上表现不佳——仅看总体准确率很容易忽视这一点。
指标选择
- 明确业务成本:每类错误的代价是多少?
- 选择点值指标:已知成本时,优化阈值并报告精确率/召回率/Fβ。未知成本时,F1-Score 是合理的默认。
- 检查概率校准:部署前,验证 LogLoss 和 ECE 或 Brier Score。
- 评估排序能力:用 AUPRC (不均衡) 或 ROC-AUC (均衡) 评估整体区分能力。
- 处理不均衡:若 Macro-F1 ≪ Micro-F1,分析哪些少数类表现差。考虑重采样、代价敏感学习或 Focal Loss。