F1-Score
F1 점수는 정밀도와 재현율의 조화 평균이므로 두 값이 모두 높지 않으면 낮게 유지됩니다. 공식, F-beta, 매크로 및 마이크로 F1, 객체 검출 활용을 다룹니다.
F1-score는 정밀도와 재현율을 조화 평균으로 결합하는 단일 지표입니다: F1 = 2 × 정밀도 × 재현율 / (정밀도 + 재현율). 값의 범위는 0에서 1까지이며, 모델에 거짓 양성과 거짓 음성이 모두 없을 때만 1에 도달합니다. 조화 평균은 입력값 중 더 작은 값에 가까워지므로 정밀도나 재현율 중 하나라도 낮으면 F1도 낮게 유지됩니다. 따라서 F1은 불균형 문제인 결함 탐지, 사기 선별, 문서 검색에서 일반적인 요약 지표로 사용됩니다. 이러한 문제에서는 정확도가 실제 성능을 잘못 나타낼 수 있습니다. F1-score는 balanced F-score 또는 F-measure라고도 하며, 이진 픽셀 마스크에서는 Dice 계수와 같은 값입니다.
F1-score 계산 방법#
혼동 행렬의 개수로 나타내면 F1 = 2TP / (2TP + FP + FN)입니다. 참음성은 공식에 포함되지 않으므로 F1은 모델이 양성 클래스를 얼마나 잘 처리하는지만 측정합니다. 이는 양성 사례가 드물고 음성 사례에는 관심이 적은 작업에 적합합니다. 참음성이 중요한 경우에는 Matthews 상관 계수 또는 균형 정확도가 네 가지 항목을 모두 반영합니다. 단순 평균과 F1의 차이는 조화 평균에 있습니다. 정밀도가 1.0이고 재현율이 0.1인 모델의 산술 평균은 0.55이지만 F1은 0.18입니다.
F-베타 및 다중 클래스 평균화#
F1은 정밀도와 재현율에 동일한 가중치를 부여합니다. 일반적인 F-베타 점수는 재현율을 정밀도보다 β배 중요하게 취급합니다. 따라서 놓친 사례의 비용이 큰 의료 선별 검사에서는 F2가 재현율을 더 중시하고, 오탐의 비용이 큰 스팸 필터링에서는 F0.5가 정밀도를 더 중시합니다.
클래스가 두 개보다 많으면 클래스별로 F1을 계산한 다음 평균을 냅니다:
- Macro F1: 클래스별 점수의 비가중 평균으로, 드문 클래스와 흔한 클래스에 동일한 가중치를 부여합니다.
- Weighted F1: 클래스별 실제 예시 수를 가중치로 적용한 클래스별 점수의 평균입니다.
- Micro 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, macro F1을 0.688, micro F1을 0.800으로 출력합니다. 모델은 부품 10개 중 8개를 올바르게 분류하므로 micro F1은 정확도 0.80과 같으며, macro F1은 결함 클래스의 비중이 다수 클래스와 같기 때문에 더 낮습니다.
객체 탐지에서의 F1#
탐지기는 모든 confidence 임계값에서 정밀도와 재현율을 가지므로 confidence에 따른 F1 곡선도 형성합니다. 이 곡선의 최고점은 오탐과 누락된 객체의 균형이 가장 좋은 confidence 임계값을 나타내며, 배포된 모델은 이 단일 운영 지점에서 실행됩니다. F1은 모든 임계값을 통합해 모델 순위를 매기는 평균 정밀도(mAP)를 보완합니다. YOLO26 validation은 이 곡선을 BoxF1_curve.png로 저장하고, 평균 F1이 최고점에 이르는 confidence에서 정밀도, 재현율, 클래스별 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}")Mean F1은 클래스별 F1 값을 평균한 것이므로 위에 출력된 평균 정밀도와 평균 재현율의 조화 평균과 약간 다를 수 있습니다.










