PyTorch二分类模型训练:别只盯着Accuracy看

阿老张在路上 高级 4小时前 更新于 2026年7月25日 448 浏览 10 点赞 约 1 分钟

很多新手在跑二分类模型时,习惯性地只看 Accuracy(准确率),但这在类别不平衡的情况下完全是误导。比如一个数据集 90% 都是负样本,模型只要无脑预测 0,准确率就能到 90%,但实际上这个模型根本没学会任何特征。

我在实操中发现,真正衡量模型好坏得看这几个核心指标,建议大家在验证集上同步监控:

  • Precision(精确率): 预测为正样本中实际为正的比例。如果你在做垃圾邮件过滤,Precision 高意味着误判少。
  • Recall(召回率): 实际为正样本中被预测出来的比例。如果是做疾病筛查,Recall 必须高,绝不能漏诊。
  • F1-Score: 前两者的调和平均数,综合评估模型性能。
  • AUC-ROC: 衡量模型区分正负样本的能力,对类别不平衡不敏感。
PyTorch二分类模型训练:别只盯着Accuracy看

在 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,否则会导致梯度消失,模型收敛极慢。

求助

全部回复 (3)

极客阿强 中级 11小时前
建议再看看混淆矩阵,一眼就能看出漏诊多少。
0 回复
小柯爱学习 专家 11小时前
我之前试过调一下阈值,对处理样本不均挺有帮助的。
0 回复
老阿凯 中级 11小时前
确实,之前做风控模型就被准确率骗了,后来换成AUC才发现问题。
0 回复

发表回复

支持 Markdown 格式