Precision
適合率は、正例と予測されたもののうち正しい予測の割合です。式はTP / (TP + FP)です。有病率による変化、物体検出器での算出方法、適合率を高める方法を解説します。
適合率とは、モデルが陽性と予測したもののうち、正しかったものの割合です。「モデルが陽性と判定したとき、どのくらい正しいか」という問いに答え、真陽性をすべての陽性予測で割って計算します。適合率 = TP / (TP + FP)です。ここで偽陽性(FP)は、モデルが誤って陽性と判定した陰性例を指します。適合率は0から1の範囲で、0.95なら警告20件につき1件が誤警報であることを意味します。医療分野では陽性的中率(PPV)とも呼ばれ、偽発見率は1から適合率を引いた値です。スパムフィルターが正規のメールを隠す場合、検査システムが良品を廃棄する場合、監視カメラが影を検知して警備員を呼ぶ場合など、誤警報のコストが高い場面で適合率が特に重要になります。
適合率の計算方法#
適合率は混同行列の2つのセル、真陽性と偽陽性を使って計算します。この2つを合わせると、すべての陽性予測になります。見逃した陽性例は式に含まれないため、最も確信度の高い1例だけを判定するモデルでも、ほとんど何も検出できないまま適合率1.0に達する場合があります。そのため適合率は、見逃しをちょうど考慮する再現率(TP / (TP + FN))と併せて報告され、F1スコアはこの2つを1つの値にまとめます。モデルが陽性予測をまったく行わない場合、適合率は0 / 0となり未定義です。scikit-learnなどのライブラリは警告を出して0として報告します。
クラスが2つを超える場合、各クラスを陽性、それ以外を陰性としてクラスごとに適合率を計算し、その後平均します。マクロ平均適合率はすべてのクラスを等しく重み付けします。単一ラベルのマルチクラス分類では、マイクロ平均適合率は正解率と等しくなります。
適合率は有病率に左右されます#
再現率と特異度は、モデルが陽性と陰性をそれぞれどのように扱うかを表すため、陽性の割合が減っても変わりません。適合率は両方のグループを組み合わせて計算するため、有病率が下がると低下します。同じ偽陽性率でも、陰性例が増えれば真陽性の検出あたりの誤警報が増えるからです。以下のscikit-learnのスクリプトでは、1つのスクリーニングモデルを2種類の有病率で評価します。
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score
# One screening model at two prevalences: it finds 90% of positives and flags 1% of negatives
for positives in (1000, 100):
negatives = 10_000 - positives
tp, fp = int(0.9 * positives), int(0.01 * negatives)
counts = [tp, positives - tp, fp, negatives - fp] # TP, FN, FP, TN
# Rebuild labels and predictions for 10,000 cases from the confusion-matrix counts
y_true = np.repeat([1, 1, 0, 0], counts)
y_pred = np.repeat([1, 0, 1, 0], counts)
accuracy = accuracy_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
print(f"{positives} positives: accuracy {accuracy:.3f}, recall {recall:.2f}, precision {precision:.2f}")10,000例中に陽性が1,000例ある場合、モデルの適合率は0.91です。陽性が100例の場合、再現率は0.90のままで、正解率は0.989に上昇しますが、真陽性90件に対して誤警報が99件となり、適合率は0.48に低下します。そのため、バランスの取れたテストセットで測定した適合率は、陽性がより少ないデプロイ環境で実際に得られる適合率を過大評価します。たとえば、希少疾患のスクリーニングが該当します。
物体検出における適合率#
物体検出では、信頼度しきい値を超える予測ボックスがすべて陽性予測になります。予測は信頼度の高い順に照合され、同じクラスのラベル付き物体とIntersection over Union(IoU)がしきい値以上で重なり、その物体が高スコアのボックスにまだ割り当てられていない場合に限り、ボックスは真陽性になります。背景上のボックス、クラスが誤っているボックス、位置が大きくずれたボックス、すでに照合済みの物体に対する重複ボックスは、すべて偽陽性として数えられます。
信頼度しきい値を上げると、誤りであることが多い低スコアのボックスが除外されるため、通常は再現率が下がる一方で適合率が上がります。すべてのしきい値における適合率と再現率をプロットすると適合率再現率曲線が得られ、その下の面積が平均適合率(AP)です。平均適合率(mAP)はクラス間のAPを平均し、mAP50-95では10個のIoUしきい値についても平均します。YOLO26の検証では、各信頼度しきい値におけるクラスごとの適合率をBoxP_curve.pngとして保存します。また、平均F1が最大となる信頼度での適合率(P)を再現率やmAPとともに報告します。
適合率の改善方法#
- 信頼度しきい値を上げる: 最も手早い方法ですが、再現率は低下します。
- 難しい陰性例を追加する: 誤警報を引き起こす類似物体や何もないシーンを学習データに追加し、モデルが検出対象にすべきでないものを学習できるようにします。このように最も紛らわしい陰性例を選ぶ方法を難しい陰性例マイニングと呼びます。
- ラベルの欠落を修正する: アノテーターが見落とした物体を正しく検出しても、偽陽性としてカウントされます。そのため、不完全な正解ラベルがあると、適合率は実際より低く見えます。
- 混同されるクラスを分ける: 混同行列を見ると、モデルがどのクラスを混同しているかが分かります。該当するクラスの組み合わせについて、例を増やすかクラス定義を明確にすると、誤ったクラスの偽陽性を減らせます。
適合率と関連用語#
- 再現率: 実際の陽性のうちモデルが検出した割合で、TP / (TP + FN) と計算します。再現率は見逃しを数え、適合率は誤警報を数えます。
- 特異度: 実際の陰性のうち正しく陰性と判定された割合で、TN / (TN + FP) と計算します。スクリーニングスクリプトが示すように、陽性がまれな場合、特異度が0.99でも適合率が0.5を下回ることがあります。
- 正解率: すべての予測のうち正しいものの割合です。不均衡データでは、多数派クラスの影響が支配的になります。
- 数値精度: 各値の保存に使用するビット数です。たとえば32ビットや16ビット浮動小数点を指し、同じ単語の別の意味です。
- 測定における精度: 繰り返し測定した値がどれだけ互いに近いかを表します。一方、正確さは測定値が真の値にどれだけ近いかを表します。常に実際より2 kg重く表示するはかりは、精度は高くても正確ではありません。










