PyTorch二分类模型训练:别只盯着Accuracy看
很多新手在跑二分类模型时,习惯性地只看 Accuracy(准确率),但这在类别不平衡的情况下完全是误导。比如一个数据集 90% 都是负样本,模型只要无脑预测 0,准确率就能到 90%,但实际上这个模型根本没学会任何特征。
在 PyTorch 中,建议直接用
下一篇
主动学习实战:别乱标数据,让模型告诉你哪里不懂 →
我在实操中发现,真正衡量模型好坏得看这几个核心指标,建议大家在验证集上同步监控:
- Precision(精确率): 预测为正样本中实际为正的比例。如果你在做垃圾邮件过滤,Precision 高意味着误判少。
- Recall(召回率): 实际为正样本中被预测出来的比例。如果是做疾病筛查,Recall 必须高,绝不能漏诊。
- F1-Score: 前两者的调和平均数,综合评估模型性能。
- AUC-ROC: 衡量模型区分正负样本的能力,对类别不平衡不敏感。
在 PyTorch 中,建议直接用
torchmetrics 库,不用自己写公式,否则很容易在处理 Tensor 维度时出错。简单的实战配置如下:import torch
from torchmetrics.classification import BinaryAccuracy, BinaryPrecision, BinaryRecall, BinaryF1Score
# 初始化指标
acc_metric = BinaryAccuracy()
prec_metric = BinaryPrecision()
rec_metric = BinaryRecall()
f1_metric = BinaryF1Score()
# 在验证循环中使用
# preds 是模型输出的 logits,经过 sigmoid 后的概率
# target 是真实的 label
preds = torch.sigmoid(logits) > 0.5
acc = acc_metric(preds, target)
f1 = f1_metric(preds, target)
print(f"Accuracy: {acc}, F1: {f1}")另外一个坑是 Loss 函数的选择。做二分类一定要确认最后一层有没有加 Sigmoid。如果用了 nn.BCEWithLogitsLoss,它内部已经集成了 Sigmoid,千万不要在模型输出端再加一个 torch.sigmoid,否则会导致梯度消失,模型收敛极慢。
