F1-Score
F1スコアは適合率と再現率の調和平均であり、両方が高くない限り低い値にとどまります。計算式、Fベータ、マクロとマイクロのF1、物体検出での用途について解説します。
F1スコアは、適合率と再現率の調和平均を組み合わせた単一の指標です。F1 = 2 × 適合率 × 再現率 / (適合率 + 再現率)で計算します。値は0から1の範囲で、モデルに偽陽性も偽陰性もない場合にのみ1になります。調和平均は入力値の小さい方に引き寄せられるため、適合率または再現率のどちらかが低いとF1も低くなります。そのため、F1は欠陥検出、不正検出、文書検索など、不均衡な問題を要約する一般的な指標です。このような問題では正解率が誤解を招くことがあります。F1スコアはバランスFスコアまたはF値とも呼ばれ、バイナリのピクセルマスクではDice係数と同じ値になります。
F1スコアの計算方法#
混同行列の件数を使うと、F1 = 2TP / (2TP + FP + FN)と表せます。真陰性は式に含まれないため、F1はモデルが陽性クラスをどれだけ適切に扱うかだけを測定します。これは、陽性がまれで陰性があまり重要でないタスクに適しています。真陰性が重要な場合は、マシューズ相関係数やバランス正解率を使うと、4つすべての区分を評価できます。F1を単純平均と区別するのは調和平均です。適合率が1.0、再現率が0.1のモデルでは、算術平均は0.55ですが、F1は0.18です。
Fベータとマルチクラス平均#
F1では適合率と再現率を等しく重み付けします。一般化したFベータスコアでは、再現率を適合率のβ倍重要なものとして扱います。そのため、見逃しのコストが高い医療スクリーニングなどではF2が再現率を重視し、誤警報のコストが高いスパムフィルタリングなどではF0.5が適合率を重視します。
クラスが2つを超える場合は、各クラスの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}")このスクリプトは、良品のF1が0.875、不良品のF1が0.500、マクロF1が0.688、マイクロF1が0.800であると出力します。モデルは部品10個のうち8個を正しく分類するため、マイクロF1は正解率0.80と等しくなります。マクロF1がそれより低いのは、性能の低い不良品クラスが多数派のクラスと同じ重みで扱われるためです。
物体検出におけるF1#
検出器には、信頼度しきい値ごとに適合率と再現率があるため、信頼度に対するF1曲線も得られます。この曲線のピークは、誤検出と見逃しのバランスが最もよい信頼度しきい値を示します。これは、デプロイ済みモデルが動作する単一の運用点です。F1は、すべてのしきい値にわたって統合しモデルを順位付けする平均適合率(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値を平均するため、その直前に出力される平均適合率と平均再現率の調和平均とはわずかに異なる場合があります。










