1000 个样本、正类只占 5%。「全判负类」拿到准确率 0.950,召回 0.000; 真能干活的模型准确率 0.705,召回 0.740——按准确率排名,真模型反而更差。
第八章讲完了六种架构和一次 LoRA 实战。 从这一章起进「训练完之后」:怎么用指标客观说清一个模型到底行不行。
一、准确率就是「猜对的比例」
公式很简单:(猜对的正类 + 猜对的负类)÷ 总数。也就是对角线加起来除以全部。 它直观、好解释、汇报时最好说。所以它是第一个被算出来的指标。 问题在于它把两类错误当成一样重。把正类漏掉和把负类误判,在准确率里都只是「错了一个」。 现实里这两件事的代价往往差得很远:漏掉一个欺诈交易可能损失几十万, 误判一个正常交易只是多一次人工复核。
二、不平衡数据上它会骗人
Demo 造了 1000 个样本,正类只有 50 个(5%)。 「全判负类」这个什么都不做的策略,准确率 0.950。 真模型(阈值 0.5)准确率 0.705,召回 0.740——它抓到了 37 个真阳性,漏了 13 个,误报 282 个。 按准确率排名,真模型(0.705)比「什么都不做」(0.950)差了 0.245。 这就是准确率最危险的地方:它会把有用的模型判成没用的。 比例越悬殊,这个偏差越大。正类占 1% 时,全判负类的准确率是 0.99,任何真模型都比不过。
三、什么时候可以用准确率
两个条件同时满足时,准确率是可靠的:类别大致均衡(比如四六开、三七开), 以及两类错误的代价差不多。 手写数字识别就是这样:十个类别各占一成左右,认错一个 3 和认错一个 7 代价相同。 这种情况下准确率很好用,没必要上更复杂的指标。 反过来,欺诈检测、疾病筛查、故障预警、召回率敏感的场景,准确率基本不能用。 这些场景的共同点是:关心的那类样本很少。 做训练师,接手一个任务时第一个该问的问题是「正类和负类各占多少」。这个数决定了后面所有指标怎么选。
四、该配哪些指标一起看
召回率:该抓的抓到了多少。分母是真正的正类总数。 精确率:抓到的里面有多少是真的。分母是模型判为正类的总数。 F1:两者的调和平均,一个数概括平衡程度。 AUC:不分阈值,衡量模型整体的排序能力。 这四个和准确率不是替代关系,是补充关系。 汇报时最好给出「准确率 + 召回 + 精确」三个数,让人自己判断。只报一个数,一定会被追问。
五、动手 Demo:准确率的陷阱:全判负类 0.950,真模型只有 0.705
造 1000 个二分类样本,正类只占 5%(正类打分均值 1.2、负类 0,都有标准差 1 的噪声); 比较三种做法——全判负类、全判正类、按阈值 0.5 判——各自的准确率、召回率、精确率和命中误报数。
tp = int(((pred == 1) & (y == 1)).sum())
fp = int(((pred == 1) & (y == 0)).sum())
fn = int(((pred == 0) & (y == 1)).sum())
tn = int(((pred == 0) & (y == 0)).sum())
acc = (tp + tn) / float(N)
rec = tp / float(tp + fn) if tp + fn else 0.0
pre = tp / float(tp + fp) if tp + fp else 0.0
实跑输出:
--------------------------------------------------------------------
准确率的欺骗性:全判负类也能拿 0.950
--------------------------------------------------------------------
样本数 1000,其中正类 50 个(5%)
打分 正类 ~ N(1.2, 1),负类 ~ N(0, 1),有重叠
做法 准确率 召回率 精确率 命中 / 误报
----------------------------------------------------------
全判负类 0.950 0.000 0.000 0 / 0
全判正类 0.050 1.000 0.050 50 / 950
真模型(阈值 0.5) 0.705 0.740 0.116 37 / 282
「全判负类」拿到了多少准确率 0.950
它抓到了几个真阳性 0 个(一共 50 个)
它的召回率 0.000
这就是准确率最危险的地方:当正类只占 5% 时,「什么都不做、全判负类」就能拿到 0.950。
更刺眼的是:真模型的准确率 **0.705**,反而比「全判负类」低了 0.245。如果按准确率排名,这个真能干活的模型会被判成更差的那个。
如果只看准确率这一个数,会得出「全判负类更好,可以上线」的结论。但它一个正样本都没抓到,实际价值是零。
所以评估不平衡数据时,第一件事不是算准确率,是看正负类各占多少。比例悬殊(比如 1:20 以上)时,准确率基本不能用。
正确做法是同时看召回率和精确率——这两个数才回答「该抓的抓到了吗」和「抓错的多么」。下一节开始一个个讲。
「全判负类」准确率 0.950、召回 0.000、精确率 0.000。三个数放一起看,问题一眼就看出来了。 真模型准确率 0.705,比全判负类低 0.245。但它抓到了 37 个真阳性,这才是业务要的东西。 精确率只有 0.116,意思是「判为正类的 319 个里,只有 37 个是真的」。 这个数很难看,但它是真实代价——要抓 37 个真的,就得容忍 282 个误报。 这里的打分是我用两个高斯分布造的,所以召回和精确率的平衡点很粗糙。 真实模型会好一些,但「准确率高、召回低」这个陷阱的结构是一样的。
30 秒实验
- 把正类比例从 5% 改成 50%,看准确率还有没有欺骗性。
- 把正负类的打分均值差从 1.2 改成 2.5,看真模型的三个指标怎么变。
- 想一想:你自己的工作里,有没有正在用准确率汇报不平衡任务的场景?
常见误区
- 「准确率 95% 就是好模型」——类别不平衡时它可能什么都没做。
- 「准确率是客观指标,不会骗人」——它是客观的,但会误导,因为它假设两类错误等价。
- 「不平衡就该扔掉准确率」——不用扔,但必须同时报召回和精确。
自测三问(点开对答案)
1. 准确率怎么算? —— (猜对的正类加猜对的负类)除以样本总数。 2. 为什么不平衡数据上准确率会骗人? —— 它把两类错误当等价,而少数类对总数的贡献太小,全判多数类就能拿高分。 3. 准确率什么时候可以放心用? —— 类别大致均衡,且两类错误的业务代价差不多时。准确率不够用,就得拆开看。下一节先讲精确率:抓到的里面有多少是真的。
- ☐ (本节完,下一节 9.1.2 精度:控制模型评估的误报率)