精确率、召回率、F1值:一文讲透机器学习评估指标与混淆矩阵

发布时间:2026/9/20 1:06:22
精确率、召回率、F1值:一文讲透机器学习评估指标与混淆矩阵
写这篇东西的起因是我有一次给组里的实习生讲模型评估报告。他公式背得很熟Precision、Recall、F1 的定义张口就来但一看到混淆矩阵里的四格数字就懵了问他这个模型到底能不能上线他憋了半天回了一句准确率有 85%应该可以吧。问题就出在这他只知道准确率而且不知道 85% 到底意味着什么。这四个指标——精确率、准确率、召回率、F1 值——是机器学习评估里最基础也最容易混的一套概念。面试要考论文要写模型上线前要汇报但真正能一口气说清楚它们区别的人其实不多。这篇我打算换个思路不按教科书顺序讲而是先从直觉建立概念再给记忆锚点最后落到随机森林、UCF101 这类实际项目里怎么用、怎么避坑。适合正在学机器学习的人、准备面试的开发者以及模型评估时不只看 accuracy 的算法工程师。1. 四个指标各管哪一摊事用看病和考试建立直觉1.1 准确率最容易懂但最容易被骗的指标准确率Accuracy的定义大家都见过预测正确的样本数除以总样本数。公式写出来就是Accuracy (TP TN) / (TP TN FP FN)它表达的是你全部判断里判断对的比例。听起来很合理但这里藏着一个特别大的坑准确率在正负样本不均衡时会严重失真。我常用一个体检场景来解释。假设某单位组织 1000 人体检其中只有 10 人真的生病了。现在有个医生特别省事不管谁来统统回复没病。那么他的准确率是多少990 个没病的人他全说对了10 个有病的人他全漏了。Accuracy 990 / 1000 99%。一个完全没做任何检测、只会复读你没事的模型在准确率上居然能拿到 99 分。这就是为什么在金融风控、罕见病筛查、异常检测这类正样本极少的场景里只看准确率会让你误以为模型很强实际上模型可能什么都没学到。所以记住第一句话准确率是全局打分的但它默认正负样本差不多重要、数量差不多多。一旦样本失衡它就会偏向多数类给你一种虚假的安全感。1.2 精确率查出来的里面有多少是目标精确率Precision要回答的是另一个问题在你预测为正的那些样本里有多少真的是正的Precision TP / (TP FP)还是用体检举例子。这次医生认真了一点会做一些检查然后挑出一批人告诉他们你可能是病人。精确率衡量的就是医生挑出来的这批人里面真正生病的人占了多大比例。如果医生挑了 20 个人出来说有事结果里面只有 8 个真的生病其余 12 个是虚惊一场那 Precision 8 / 20 40%。精率衡量的本质是误报的代价。FP假阳性越少精确率越高。在警察抓坏人的语境里Precision 就是抓的人里面真坏人的比例它惩罚的是冤枉好人。所以你记住查准率这个中文译名就行它关心的是查出来的准不准。1.3 召回率目标里面有多少被查出来召回率Recall的视角完全不同它关心的是所有真正的正样本里你找回了多少Recall TP / (TP FN)同一批体检的人里面有 10 个真病人。医生检查完之后只找出了 6 个剩下 4 个漏掉了告诉他们没病。那 Recall 6 / 10 60%。召回率衡量的是漏报的代价。FN假阴性越少召回率越高。还是警察抓坏人的类比100 个坏人警察抓到了 60 个跑了 40 个那 Recall 就是 60%。它惩罚的是放走坏人。所以这两个指标一定要并在一起理解精确率看的是抓得准不准怕的是冤枉好人FP。召回率看的是抓得全不全怕的是放跑坏人FN。我当年把这两个概念记牢靠的就是把Precision对应查准率、Recall对应查全率这两组中文译名绑定在一起。Precision 是查出来的里面对的比Recall 是该查出来多少、查出来了多少。1.4 F1 值数学上最狠的平衡分知道了 Precision 和 Recall 之后自然会遇到一个问题一个模型精确率 0.9、召回率 0.1另一个模型精确率 0.5、召回率 0.5到底哪个更好直接给 F1 值。它把精确率和召回率揉成一个数F1 2 * Precision * Recall / (Precision Recall)很多人在这一步不理解为什么是这么奇怪的公式尤其不理解为什么要乘 2。其实是先有调和平均再有这个形式F1 本质是 Precision 和 Recall 的调和平均公式等价于 2 / (1/P 1/R)。那个乘 2的作用是保证当 PR 的时候F1 等于这个相同的数。比如 PR0.5F1 2/(1/0.5 1/0.5) 2/(22) 0.5刚好等于原值。调和平均最大的特点就是特别惩罚偏科。你可以试一下P0.9、R0.1 时F1 2 * 0.9 * 0.1 / (0.9 0.1) 0.18。而算术平均算出来是 0.5。也就是说一个模型即使精确率很高只要召回率烂得很F1 就会非常难看。这其实是故意的。因为在实际场景里又准又全才是目标只抓住少数几个但抓得准或者抓了一大堆但大多是错的都不能算靠谱。F1 的存在就是逼着模型在两个方向上都过关。2. 精确率和召回率的跷跷板阈值一动此消彼长2.1 阈值才是幕后推手理解了四个指标的定义之后最容易产生的疑问是为什么不把 Precision 和 Recall 都调高模型就不能又准又全吗答案要从分类模型的输出逻辑说起。大多数分类模型逻辑回归、神经网络、SVM 等输出的其实不是类别本身而是一个概率。比如判断一封邮件是不是垃圾邮件模型输出的是 0.8意味着它有 80% 的把握这是垃圾邮件。那怎么决定0.8 算垃圾还是不算需要一个阈值默认是 0.5。大于等于 0.5 判为正小于 0.5 判为负。但你仔细想这个 0.5 并非天经地义它只是一个约定俗成的默认值。我实际调参的时候经常把这个阈值来回移动效果非常直观。拿二分类举例看这张阈值变化的影响阈值设置判断倾向预测为正的数量精确率召回率0.7严格只有很有把握才判正变少升高降低0.5默认概率过半就判正中等中等中等0.3宽松有点苗头就判正变多降低升高原理也不难推。阈值设得高模型只在高置信度时才说正FP 自然变少Precision 上升但那些概率不高其实却是正样本的样本也被拒之门外FN 变多Recall 下降。反过来阈值调低模型更愿意说正FN 变少、召回率上升但误报也跟着多起来精确率下降。这个现象用保安查证件类比特别形象查得严放进来的人确实都挺可信但把不少可疑的人也放跑了这叫高精确率、低召回率查得松逮回来很多人盘问结果一半是良民但真要找的人一个没跑掉这叫低精确率、高召回率。2.2 业务场景决定你是宁缺毋滥还是宁可错杀既然精确率和召回率是跷跷板那在具体项目里往哪边倾斜就要看业务代价。这是模型评估里最需要想清楚的一件事FP 和 FN哪个对你的成本更高垃圾邮件拦截更适合高精确率。因为 FP 意味着把正常邮件误判成垃圾邮件如果老板的面试通知被你的模型扔进垃圾箱代价非常大。这时候宁可漏掉几封垃圾邮件Recall 略低也要保证正常邮件不被误伤。癌症早期筛查适合高召回率。因为 FN 意味着真病人被漏掉可能错过最佳治疗期这是人命关天的事。所以宁可多做检查把一批没病的人也拉进来复查Precision 低一些也不能放过一个病人。反欺诈风控也是主打高召回率。每漏一个欺诈交易代价都是真金白银所以模型的阈值经常调得比较宽松宁可多拦下几笔正常交易引发一次人工复核也不能让欺诈单子通过。商品推荐系统更偏精确率。推荐给用户的商品如果一堆是用户不感兴趣的用户会烦少推几个没毛病召回率可以牺牲一点。所以你看四个指标本身没有高下之分只有在具体业务里合不合适之分。评估模型前先问自己这个场景里误报和漏报哪个更贵问清楚之后指标就往对应的方向倾斜。2.3 调和平均为什么比算术平均更合理既然我们经常要在 Precision 和 Recall 之间做取舍F1 作为平衡分的角色就很重要了。为什么非要用调和平均而不是直接把 P 和 R 加起来除以 2这个问题面试里经常被追问我讲一个极端案例就明白了。假设一个模型 P1、R0也就是说它预测为正的那些样本全是对的但一个真阳性都没找回来。你手写算术平均(1 0) / 2 0.5看起来好像还行及格了。但 F1 会怎么算F1 2 * 1 * 0 / (1 0) 0。哪一个是公平的显然是 0。这个模型实际上什么都没干等于告诉医生我没查出任何病人但我说有病的人一定有病这算什么成绩调和平均的本质就是短板效应它强制要求 P 和 R 不能差太远。一个小短板就会把整体分拉得很难看。实际调模型时如果一个候选模型的 P 从 0.6 涨到 0.8 但 R 从 0.6 跌到 0.3F1 直接从 0.6 跌到 0.43你就能立刻意识到这个改动方向有问题。这就是 F1 的价值它不是一个可看的参考值而是一个能帮你快速否决坏模型的筛选器。3. 混淆矩阵与记忆锚点四个指标一次记牢3.1 混淆矩阵四格是唯一的根据地很多教程会把四个公式直接扔给你背。我的建议是别背公式背混淆矩阵的四个格子就够了因为三个核心公式都能从四格图里推出来。混淆矩阵长这样预测为正预测为负实际为正TP真正例FN假负例漏报实际为负FP假正例误报TN真负例我记这四个格子的方法是抠英文单词字面意思就非常直白TPTrue Positive我把一个样本预测为 Positive而且它真的是 Positive预测对了。TNTrue Negative我预测为 Negative它确实也是 Negative也预测对了。FPFalse Positive我预测为 Positive但它是假的——我以为是正的结果不是这就是误报。FNFalse Negative我预测为 Negative但它是假的——我说它不是结果它偏偏是这就是漏报。拿到这四个数字公式就水到渠成Accuracy (TP TN) / 总数看的是主对角线上两块。Precision TP / (TP FP)看的是被预测为正那一列里TP 占多大比例。Recall TP / (TP FN)看的是实际为正那一行里TP 占多大比例。你每次拿起分不清的指标就在草稿纸上画一下这个 2x2 表格永远比默背公式靠谱。3.2 一套故事连记三个指标做题的细节公式推导解决了剩下的问题是怎么在脑子里给精确率和召回率建立直觉锚点。我常用的方法是考试做题的场景因为人人都经历过。假设一场考试一共 20 道题。你实际会做 14 道不会 6 道。考场上时间不够你只写了 16 道题空了 4 道。这 16 道做出来的题里有 12 道做对了4 道做错了。空掉的 4 道里有 2 道其实你本来是会做的但来不及写另外 2 道是真不会。先把数字塞进混淆矩阵所有 20 道题就是总样本会不会做是真实标签答不答题是模型的预测结果。实际会做且写出来且做对TP 12实际不会但盲目写了且做错FP 4实际会做但没写出来FN 2实际不会也没写TN 2然后算三个指标Accuracy (12 2) / 20 70%也就是所有题里你处理对了的比例。Precision 12 / 16 75%也就是你写了答案的题里真正答对的比例。它代表你写出来的东西靠谱程度如何Recall 12 / 14 ≈ 85.7%也就是你会做的 14 道题里你成功写出来多少。它代表你会的知识发挥出来多少这个例子特别能说明问题你能不能得高分既取决于你写出来的对不对Precision也取决于你会的有没有都写出来Recall。如果不答题的 2 道题你硬挤时间写哪怕写错了Recall 不变但 Precision 会下降如果平时复习更扎实会做的题变多Recall 的基础就上去了。3.3 准、全、总、衡四个汉字锚点故事的缺点是有点长平时记不住那么细。所以我后面又压缩了一版用四个汉字做快速锚点准确率Accuracy记总它是总体判断正确率胜在全局容易忽视样本不均衡。精确率Precision记准它是查出来的里面准不准对应查准率。召回率Recall记全它是该找回的多不多对应查全率。F1 值记衡它是在准和全之间取一个平衡分。你只要记住准、全、总、衡四个字开会时被问到某个指标先在脑子里过一遍如果问题是预测为正的里面有多少是对的这是准。 如果问题是正样本里有多少被找出来了这是全。 如果问题是整体对了多少这是总。 如果问题是想要一个兼顾准和全的单一分数这是衡。3.4 Sklearn 分类报告里的指标对应关系实际操作时工程上大概率不会手算而是直接跑 sklearn 的 classification_report。新手第一次看这张表很容易懵我帮你们对应一下。假设二分类模型跑完输出precision recall f1-score support 0 0.85 0.90 0.87 100 1 0.78 0.69 0.73 50 accuracy 0.83 150 macro avg 0.81 0.79 0.80 150 weighted avg 0.82 0.83 0.82 150这里有四个注意点类别 0 和类别 1 各有自己的 Precision、Recall、F1。你要判断模型在少样本类别类别 1上的表现看的是它那一行的 Recall 和 F1而不是下面的 accuracy。accuracy 那一行只有一个值而且略低于 1 的 Precision这是正常的因为它算的是全局所有 150 个样本里预测对的比例。macro avg 是把每类的 Precision 先平均再算平均值等于把类别 1 和类别 0 等权重看待少数类的影响被放大了。weighted avg 是按每类样本数加权平均样本多的类别影响更大。在实际模型对比时如果两类样本数量差很多我通常看 weighted avg如果明确是为了让模型把少数类也学好就看 macro avg甚至只看少数类的 Recall。理解了这张报告你才能在开会时真正说出哪个指标是好的哪个是被掩盖的。4. 建议多少值合适没有标准答案但有基线逻辑网上经常有人问精确率、准确率、召回率建议多少值合适。这是个典型的没有标准答案的问题因为不同任务难度天差地远。但我们可以把合适这个词拆成一个可操作的判断流程先定基线再看提升幅度最后结合业务代价。4.1 先算闭眼猜的基线要判断一个指标到底好不好第一步不是看它多少分而是看不训练模型闭着眼睛猜能得到多少分。最常用的基线有两个多数类基线把所有样本全部预测为数量最多的那个类别。在类别分布 80%/20% 的时候这个准确率就是 80%。随机猜测基线在类别完全均衡50%/50%时随机乱猜的准确率是 50%类别不均衡时按 p 比例随机猜测准确率往往低于多数类基线。你的模型准确率如果只是略高于多数类基线比如基线 80%模型训练出来 82%那基本等于没学会只是轻微比盲目乐观好一点点。举个例子信用卡欺诈检测正常交易占 99.9%欺诈占 0.1%。全猜正常准确率就有 99.9%。你辛苦训练一个模型准确率到了 99.95%从数字上看相当亮眼但仔细算算只比基线提升了 0.05 个百分点。真正该看的是欺诈类别的 Recall模型到底找回了多少笔欺诈交易如果一个都没找到那 99.95% 的准确率完全是个幻觉。所以我的习惯是任何模型上线前先跑一行代码算一下多数类基线准确率把它写进实验记录里。这样不管汇报的数字多好看听众都能立刻看出真实增量有多少。4.2 随机森林建模时该看哪个指标随机森林是大家最常用的入门级模型但很多人训练完只看一个 accuracy。我建议至少多看三个方面。第一看类别分布。如果data[label].value_counts()显示正负比是 9:1accuracy 就很难说明问题应该看少数类的 Precision 和 Recall。第二看是否用了类别权重。随机森林在 sklearn 里有个class_weightbalanced参数可以根据样本量自动调整权重。我实测下来对于不均衡数据不调这个参数直接训练模型的分类报告往往全挤向多数类调了之后少数类 Recall 通常会有明显提升但 Precision 可能会掉一些这是正常的权衡。第三看 OOB score 和分类报告是否一致。随机森林自带 out-of-bag 估计OOB score 是对泛化能力的近似估计。如果你看到 OOB score 88%、但测试集 accuracy 只有 75%别急着奇怪先回去核对数据切分很有可能测试集和训练集分布不一致。不均衡数据的随机森林调优我经验里最有用的三个手段调高少数类权重、降低min_samples_leaf让模型能学到少数类细节、用class_weightbalanced_subsample配合随机采样。每次调整后都同时看少数类的 Precision 和 Recall而不要只看整体 accuracy。4.3 二分类与多分类时 F1 的两种形态micro、macro、weighted大家平时说 N1 时默认是二分类的全局 F1但一到多分类就必须面对 micro、macro、weighted 三种平均方式的选择。这个问题尤其在 UCF101 这种上百类别任务里非常重要。micro-F1把所有类别的 TP、FP、FN 全部汇总之后再算一个 F1。它容易受大类的样本量影响样本多的类别表现好整体分就好看。macro-F1先把每个类别单独算 F1再对所有类别的 F1 取算术平均。每个类别权重相同所以容易暴露表现差的少数类。weighted-F1按照每个类别的样本数给 F1 加权介于前两者之间更贴近总体表现但不会让少数类消失。实际选择上我的一般判断是如果任务追求每个类别都要尽量好比如视频动作识别里各类动作样本差不多重要选 macro-F1如果任务就是尽量提升整体效果且少数类样本本来就少、属于难例选 weighted-F1。UCF101 的官方排行榜长期使用 top-1 准确率和各类平均准确率本质上接近 macro同时汇报我建议复现时两个都打印出来看数字是否互相印证。4.4 实际业务中常见的目标区间经验值虽然不能给一定合适的数值但我可以根据自己的项目经验给一些参考区间帮大家建立多少算正常的体感。注意这是经验值不是铁律。场景主要关注指标常见合理区间判断依据通用图像分类类别相对均衡Accuracy比随机基线高 20 个百分点以上算优秀先看随机猜 50% 起搜索/推荐排序Precision0.7 - 0.9用户点击率间接决定反欺诈二分类Recall0.85 - 0.95Precision 可放宽到 0.3漏一笔损失远大于误报一次医疗筛查Recall0.95 以上漏诊代价极高通用不均衡分类F1 / macro-F1F1 0.6 - 0.85 视任务难度明显超过多数类基线这些数值的意义不是让你硬套而是提醒你90% 的精确率不一定好30% 的精确率也可能才是最合适的。关键永远是回到业务的 FP/FN 代价去判断。5. UCF101 视频动作分类实战Pytorch 里怎么算与怎么避坑理论说完了得落到代码上。UCF101 是我经常拿来做实验的视频动作分类数据集正好拿来演示这四个指标在真实项目里怎么算、怎么被坑。UCF101 的基本情况是101 个动作类别约 13320 段视频每个类别大约 100 多段视频官方提供了三套训练/测试划分。虽然类别之间样本数量大体接近但不同动作的难度差异巨大有些类别比如引体向上和俯卧撑特别容易被混淆。因此这个数据集非常适合用来演示只看 accuracy 会吃亏这件事。5.1 UCF101 评估流程与核心代码模板视频动作分类的常见做法是先用预训练模型2D CNN 时序模块或者 3D CNN / X3D提取视频特征然后跑分类头。Pytorch 里的评估脚手架大概是这样的import torch import torch.nn.functional as F from sklearn.metrics import classification_report, confusion_matrix # model 已经 load 好权重并已移到 GPU def evaluate(model, val_loader, devicecuda): model.eval() # 关键切换到评估模式 all_preds [] all_labels [] with torch.no_grad(): # 关键关闭梯度计算省显存 for videos, labels in val_loader: videos videos.to(device) labels labels.to(device) logits model(videos) probs F.softmax(logits, dim-1) # top-1 预测 _, preds torch.max(probs, dim1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) # 三个核心代码段整体准确率、分类报告、混淆矩阵 accuracy (sum(1 for a, b in zip(all_preds, all_labels) if a b) / len(all_labels)) report classification_report(all_labels, all_preds, digits4) cm confusion_matrix(all_labels, all_preds) print(fTop-1 Accuracy: {accuracy:.4f}) print(report) return accuracy, report, cm这段代码里那两个model.eval()和torch.no_grad()看起来不起眼但漏掉它们会吃大亏下一节细说。分类报告里会直接给出每个类别的 Precision、Recall、F1你拿着它就能定位哪些动作类别拖了后腿。如果你想快速看 101 个类别的宏观指标可以这样算from sklearn.metrics import precision_recall_fscore_support # macro: 每类指标先算出再平均 macro_p, macro_r, macro_f1, _ precision_recall_fscore_support( all_labels, all_preds, averagemacro ) # weighted: 按样本数加权平均 weighted_p, weighted_r, weighted_f1, _ precision_recall_fscore_support( all_labels, all_preds, averageweighted )5.2 六个最容易被忽略的坑坑一忘了model.eval()。视频模型里普遍有 BatchNorm 和 Dropout。训练模式下BatchNorm 用的是当前 batch 的均值和方差Dropout 会随机失活神经元二者都会导致预测结果不稳定。我在 UCF101 上曾经因为没切 eval同一批验证数据跑两次accuracy 从 74% 波动到 68%完全无法复现。所以评估前务必先model.eval()。坑二batch 大小不一致导致累加准确率错误。有的同学喜欢自己写循环用correct preds.eq(labels).sum().item()这种方式累加。如果最后一个 batch 不足 batch_size直接累加是没问题的因为 item() 是实际样本数。但如果你图省事写correct (preds labels).sum().item()然后除以总的 batch 数得到平均 batch 准确率那就完蛋了因为每个 batch 样本数可能不同你会给最后的小 batch 赋予和其他大 batch 同等的权重。坑三只看整体 accuracy被多数类别绑架。UCF101 各类样本数接近均衡但不同动作的识别难度差异大。整体 accuracy 80% 时可能球类运动的 Recall 已经到 92%但体育体操类的 Recall 只有 45%。这必须在分类报告里逐类别看否则你会以为模型已经很好了。坑四验证集/测试集抽帧方式不一致。视频动作分类里一个视频通常要抽样几帧作为输入。如果训练时用随机抽帧评估时也随机抽帧那同一个模型评估两次某些类别的预测结果会变。我在实验里固定随机种子后同一模型两次评估准确率仍然可能差 1 个百分点就是因为 DataLoader 里的随机抽帧没控制住。正确的做法是评估阶段固定抽帧逻辑比如均匀抽帧或者给评估 DataLoader 设置torch.manual_seed(0)确保可复现。坑五只用 top-1 accuracy 作为唯一榜单指标。UCF101 官方常用 top-1但很多学术论文会同时报 top-5。如果类别间混淆严重比如说两个动作本来就非常相似top-5 可能仍然把正确答案囊括在内而 top-1 表现在卡住不动。你在对比模型时至少同时看 top-1 accuracy 和 macro-F1甚至可以看 top-5 accuracy避免被单一指标误导。坑六检查点只保留最高 accuracy忽略验证集上的 macro-F1。训练过程中验证 accuracy 最高的轮次不一定泛化最好尤其是最后几个 epoch 可能已经过拟合accuracy 还在涨但少数类别的 Recall 已经被牺牲了。我现在的习惯是每个 epoch 结束时同时计算 validation accuracy 和 weighted-F1保存F1最高的 checkpooint而不是仅仅看 accuracy 最高的一个。别小看这种细节它经常直接决定最终榜单名次。5.3 从准确率到混淆矩阵真正需要提升的是什么回到文章开头那个问题模型到底能不能上线只回答准确率 85%是不够的。我在这类视频分类项目里的完整分析路径是这样的第一步看 classification_report找到 Precision 和 Recall 都低的类别。 第二步看 confusion_matrix确认它错成了什么类别。 第三步根据混淆矩阵确定优化方向。拿 UCF101 举例我训练过一个 3D 模型整体准确率到了 78%。但看混淆矩阵发现射箭有 30% 被预测成了掷标枪捶打和切菜板也大量互混。这类错误原因往往不是模型结构不行而是视频抽帧后动作相似度太高、时序信息丢失或者标注本身就模糊。对应的优化手段也有方向性如果某类 Recall 低优先做数据增强、增加该类别的采样频率过采样。如果两类互相混淆考虑在损失函数里加入类别关系约束或者把模型改成 SlowFast 这类能更好捕捉时序的架构。如果样本少的类别 Recall 一直上不去尝试换用预训练权重更大的模型或者做多阶段微调。这些优化完成后回看指标时我不只看 top-1 accuracy 有没有涨更关注当初那种表现差的类别 Recall 和 F1 涨没涨。如果整体 accuracy 涨了 1%但射箭类的 F1 从 0.4 掉到 0.3那这次训练方向反而是失败的。在这套流程里精确率、准确率、召回率、F1 值不再只是四个孤立的公式而是一套诊断工具准确率告诉你整体水平Precision 告诉你模型报出来的结果是否可信Recall 告诉你模型有没有把关键目标漏掉F1 帮你快速否决那些严重偏科的候选模型。把它们配合混淆矩阵一起看模型哪里好、哪里需要喂更多数据一眼就能判断。最后分享一个我个人的小习惯每次实验结束我会在实验记录里固定写三行——多数类基线准确率、最优模型 weighted-F1、最难类别的 F1。项目上线后复盘这三行数字远比训练日志里的 loss 曲线有用。因为基线数字提醒你模型的真实增量weighted-F1 代表整体效果最难类别 F1 则暴露模型的短板。你要是刚接触这些指标不妨也把这个格式抄进自己的实验记录本里时间久了会感谢自己当年的坚持。