F1-Score
F1 分数是精确率和召回率的调和平均值,因此只有两者都较高时,F1 分数才会较高。涵盖公式、F-beta、宏平均与微平均 F1,以及检测中的应用。
F1 分数是将精确率和召回率合并为调和平均值的单一指标:F1 = 2 × 精确率 × 召回率 /(精确率 + 召回率)。它的取值范围为 0 到 1,只有模型没有假阳性和假阴性时才会达到 1。调和平均值会偏向较小的输入值,因此只要精确率或召回率较低,F1 就会保持较低水平。这使 F1 成为类别不平衡问题的常用汇总指标,适用于缺陷检测、欺诈筛查和文档检索等任务,因为在这些任务中,准确率可能会产生误导。F1 分数也称为平衡 F 分数或 F 度量;对于二值像素掩码,它与 Dice 系数相同。
F1 分数的计算方法#
用混淆矩阵计数表示时,F1 = 2TP / (2TP + FP + FN)。公式中不包含真阴性,因此 F1 只衡量模型处理正类的能力。这适用于正类稀少且负类不太重要的任务;如果真阴性也很重要,则 Matthews 相关系数或平衡准确率可以涵盖四个单元格。调和平均值正是 F1 与普通平均值的区别所在:精确率为 1.0、召回率为 0.1 的模型,其算术平均值为 0.55,而 F1 为 0.18。
F-Beta 与多类别平均#
F1 对精确率和召回率赋予相同权重。通用的 F-beta 分数将召回率的重要性设为精确率的 β 倍。因此,在漏诊代价高昂的医学筛查等场景中,F2 更看重召回率;而在误报代价高昂的垃圾邮件过滤等场景中,F0.5 更看重精确率。
类别数超过两个时,先为每个类别计算 F1,然后再求平均:
- 宏平均 F1:各类别分数的非加权平均值,因此稀有类别与常见类别权重相同。
- 加权 F1:各类别分数的加权平均值,权重为每个类别的真实样本数。
- 微平均 F1:将所有类别的 TP、FP 和 FN 汇总后计算的单个 F1。在单标签多类别任务中,它等于准确率。
from sklearn.metrics import f1_score
# Imbalanced inspection labels: 8 good parts, 2 defective parts
y_true = ["ok"] * 8 + ["defect"] * 2
y_pred = ["ok"] * 7 + ["defect"] + ["defect", "ok"]
# F1 for each class, then two ways to average them
per_class = f1_score(y_true, y_pred, labels=["ok", "defect"], average=None)
print(f"F1 ok: {per_class[0]:.3f}, F1 defect: {per_class[1]:.3f}")
print(f"Macro F1: {f1_score(y_true, y_pred, average='macro'):.3f}")
print(f"Micro F1: {f1_score(y_true, y_pred, average='micro'):.3f}")脚本输出的 good parts 类 F1 为 0.875、defects 类 F1 为 0.500、宏平均 F1 为 0.688、微平均 F1 为 0.800。模型对 10 个部件中的 8 个分类正确,因此微平均 F1 等于其 0.80 的准确率;宏平均 F1 则更低,因为表现较差的 defects 类与占多数的类别权重相同。
目标检测中的 F1#
检测器在每个置信度阈值下都有精确率和召回率,因此也会随置信度变化形成一条 F1 曲线。曲线峰值表示最能平衡误检和漏检的置信度阈值,也是已部署模型实际运行时所用的单一工作点。F1 补充了平均精度均值(mAP);mAP 会综合所有阈值来为模型排序。YOLO26的验证会将这条曲线保存为 BoxF1_curve.png,并报告平均 F1 达到峰值时的精确率、召回率和各类别 F1。
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validation sweeps confidence thresholds and saves BoxF1_curve.png
metrics = model.val(data="coco8.yaml")
# Precision, recall, and F1 at the confidence where mean F1 peaks
print(f"Precision: {metrics.box.mp:.3f}")
print(f"Recall: {metrics.box.mr:.3f}")
print(f"Mean F1: {metrics.box.f1.mean():.3f}")平均 F1 是各类别 F1 值的平均值,因此可能与上方报告的平均精确率和平均召回率的调和平均值略有不同。










