分类模型评价标准详解
一、基于混淆矩阵的核心指标
1. 混淆矩阵结构
| 预测为正例 | 预测为负例 | |
|---|---|---|
| 实际正例 | TP | FN |
| 实际负例 | FP | TN |
2. 基础计算指标
-
准确率 (Accuracy)
(TP + TN) / (TP + TN + FP + FN)适用:类别均衡场景
-
精确率 (Precision)
TP / (TP + FP)含义:预测为正例中的真实正例比例(查准率)
-
召回率 (Recall)
TP / (TP + FN)含义:真实正例中被正确预测的比例(查全率/敏感度)
-
特异度 (Specificity)
TN / (TN + FP)含义:真实负例中被正确预测的比例
-
F1-Score
2 * (Precision * Recall) / (Precision + Recall)精确率与召回率的调和平均数
二、多分类扩展指标
1. 宏平均 (Macro-averaging)
- 对每个类别独立计算指标后取算术平均
- 特点:平等对待所有类别,不受类别大小影响
2. 微平均 (Micro-averaging)
- 将所有类别的TP/FP/FN汇总后计算全局指标
- 特点:受大类样本影响较大
3. 加权平均 (Weighted-averaging)
- 按每个类别的样本数量加权计算平均
- 特点:反映整体性能,兼顾类别不平衡
三、概率与排序类指标
1. ROC曲线与AUC
- ROC曲线:横轴为假正率(FPR),纵轴为真正率(TPR)
- AUC值 :ROC曲线下的面积
- 0.5-0.7:较低区分能力
- 0.7-0.9:中等区分能力
-
0.9:优秀区分能力
2. PR曲线 (Precision-Recall Curve)
- 横轴为召回率,纵轴为精确率
- 适用:正负样本极度不平衡场景
3. Log Loss (对数损失)
- (y*log(p) + (1-y)*log(1-p))- 衡量预测概率与真实标签的差距,值越小越好
4. Brier Score
- 预测概率与真实结果(0/1)的均方误差
- 适用:概率校准评估
四、特定场景专用指标
| 指标 | 适用场景 | 计算特点 |
|---|---|---|
| Kappa系数 | 一致性检验 | 考虑随机一致性的影响 |
| MCC(马修斯相关系数) | 二分类不平衡 | 均衡考虑混淆矩阵四格,取值范围-1,1 |
| Hamming Loss | 多标签分类 | 错误预测标签比例 |
| Jaccard相似度 | 多标签分类 | 预测标签与真实标签的交并比 |
| Top-k准确率 | 排序/检索任务 | 前k个预测中是否包含正确标签 |
五、选择建议
| 场景 | 推荐优先指标 |
|---|---|
| 类别均衡 | Accuracy + F1-Score |
| 类别严重不平衡 | Precision/Recall + F1 + PR-AUC |
| 医疗诊断/风险识别 | Recall(漏检代价高)+ Specificity |
| 垃圾邮件过滤 | Precision(误判代价高) |
| 概率输出需要排序 | AUC + Log Loss |
| 多标签分类 | Hamming Loss + Jaccard |
六、重要注意事项与R语言实现对照
1. 单一指标不可靠
问题 :单一指标无法全面反映模型性能,需结合多个指标综合评估。
R语言实现 :在train()中指定summaryFunction一次性输出多项指标。
r
library(caret)
# 二分类:同时输出ROC、Sens、Spec、F1等
train_ctrl <- trainControl(
method = "cv",
summaryFunction = twoClassSummary, # 输出ROC、Sens、Spec
classProbs = TRUE
)
# 多分类:输出宏平均、微平均、F1等
train_ctrl2 <- trainControl(
method = "cv",
summaryFunction = multiClassSummary, # 输出Mean_F1、Mean_Sens等
classProbs = TRUE
)
# 验证集上批量计算多种指标
cm <- confusionMatrix(predictions, actuals) # 一次性输出Acc、Kappa等
cm$overall # 准确率、Kappa
cm$byClass # 精确率、召回率、F1等
2. 业务优先级
问题 :根据误分类代价(如漏检/误判代价)选择侧重的指标。
R语言实现:自定义损失函数或指定优化目标。
r
# 指定优化目标(metric参数)
model <- train(
Class ~ .,
data = train_data,
method = "rf",
trControl = trainControl(method = "cv"),
metric = "Kappa" # 或 "Accuracy"(均衡数据)、"ROC"(概率排序)
)
# 自定义加权损失函数(侧重召回率)
custom_loss <- function(data, lev = NULL, model = NULL) {
recall <- posPredValue(data$pred, data$obs, positive = "yes")
precision <- posPredValue(data$pred, data$obs, positive = "yes")
weighted_f1 <- 2 * (precision * recall * 2) / (precision + recall * 2)
c(WeightedF1 = weighted_f1)
}
3. 数据分布变化
问题 :训练集与验证集/测试集分布不一致时,指标会大幅波动。
R语言实现:监控跨数据集指标差异。
r
# 训练集指标
train_pred <- predict(model, train_data)
train_acc <- confusionMatrix(train_pred, train_data$Class)$overall["Accuracy"]
# 测试集指标对比
test_pred <- predict(model, test_data)
test_acc <- confusionMatrix(test_pred, test_data$Class)$overall["Accuracy"]
# 查看交叉验证各折指标变异情况
print(model$results) # 含均值与标准差
# 计算衰减并预警
drop <- train_acc - test_acc
if (drop > 0.05) warning("测试集准确率下降超5%,可能存在过拟合")