, ,

[결과 판단] F1 Score — AI/OCR 탐지 성능을 하나의 숫자로 평가하는 방법

결론 먼저 — 측정 결과

지표 공식
Precision (정밀도) TP / (TP + FP) 0.8611 (86.1%)
Recall (재현율) TP / (TP + FN) 0.9118 (91.2%)
F1 Score 2 × P × R / (P + R) 0.8857 (88.6%)

실측 데이터

구분 약어 의미 수량 내역
True Positive (TP) 올바르게 찾은 것 실제 문제를 문제로 정확히 탐지 31 문제 31건
False Positive (FP) 잘못 찾은 것 문제가 아닌데 문제로 잘못 탐지 5 지문 5건
False Negative (FN) 찾지 못한 것 문제인데 탐지하지 못함 3 지문 2건 + 문제 1건

F1 Score란 무엇인가

F1 Score는 Precision(정밀도)과 Recall(재현율)의 조화 평균이다. “찾은 것이 얼마나 정확한가”와 “놓친 것이 얼마나 적은가”를 하나의 숫자로 요약한다.

공식

F1 = 2 × Precision × Recall / (Precision + Recall)

   = 2 × TP / (2 × TP + FP + FN)

한글로 풀어 쓰면:

F1 = (2 × 올바르게 찾은 수) / (2 × 올바르게 찾은 수 + 잘못 찾은 수 + 찾지 못한 수)

왜 Accuracy가 아니라 F1을 쓰는가

시험지에서 문제를 찾는 작업을 생각해보자. 시험지 한 장에 텍스트 블록이 100개 있고, 그 중 문제는 31개뿐이다.

  • Accuracy(정확도): “전체 중 맞힌 비율”. 만약 “아무것도 문제가 아니다”라고 답해도 69%를 맞힌다. 불균형 데이터에서 무의미한 지표.
  • F1 Score: “아무것도 안 찾음” → Recall=0 → F1=0. 실제로 찾아야 하는 것을 찾았는지를 제대로 반영한다.

ML, 검색, OCR 등 “찾아야 하는 대상이 전체의 일부”인 작업에서는 F1이 표준 지표다.


Precision과 Recall — 각각 언제 중요한가

지표 의미 높으면 낮으면 중요한 상황
Precision 찾은 것 중 진짜 비율 헛찾기가 적음 엉뚱한 것을 많이 찾음 스팸 필터, 의료 진단 (오탐 비용이 큼)
Recall 진짜 중 찾은 비율 놓침이 적음 진짜를 많이 놓침 암 검진, 보안 탐지 (미탐 비용이 큼)

F1은 둘 중 하나만 높아서는 안 되는 상황에서 쓴다. 한쪽을 극단적으로 올리면 다른 쪽이 떨어지는데, F1은 이 균형을 하나의 숫자로 표현한다.


본 측정 결과 해석

Precision 86.1% — “찾았다고 한 것 중 86.1%가 진짜 문제”

36건을 문제로 탐지했는데(TP 31 + FP 5), 그 중 31건이 실제 문제. 5건의 지문을 문제로 잘못 판단했다.

  • 개선 방향: 문제와 지문을 구분하는 기준을 더 엄격하게 → FP 감소 → Precision 상승

Recall 91.2% — “실제 문제 34건 중 91.2%를 찾음”

실제 존재하는 문제+지문 34건(TP 31 + FN 3) 중 31건을 찾았다. 3건을 놓침 (지문 2건 + 문제 1건).

  • 개선 방향: 탐지 기준을 더 관대하게 → FN 감소 → Recall 상승 (단, FP가 늘어날 수 있음)

F1 88.6% — 종합 판단

Precision과 Recall이 비교적 균형 잡혀 있어 F1이 두 지표의 중간값에 가깝다. 0.9 이상이면 “실용적으로 사용 가능한 수준”으로 보는 경우가 많다.


TP / FP / FN / TN 한눈에 정리

실제 문제 (Positive) 실제 문제 아님 (Negative)
탐지함 (Predicted Positive) TP (올바르게 찾음) = 31 FP (잘못 찾음) = 5
탐지 안 함 (Predicted Negative) FN (찾지 못함) = 3 TN (올바르게 제외) = 측정 안 함

TN(True Negative)은 “문제가 아닌 것을 문제가 아니라고 판단한 수”인데, 전체 텍스트 블록 수를 알아야 계산할 수 있다. F1 Score 계산에는 TN이 필요 없다.


F1 변형 — F-beta Score

Precision과 Recall에 서로 다른 가중치를 주고 싶으면 F-beta Score를 쓴다.

F_β = (1 + β²) × P × R / (β² × P + R)
β 값 의미 용도
β = 1 P와 R 균등 → F1 일반적인 균형 평가
β = 0.5 Precision에 가중 → F0.5 오탐이 비싼 작업 (스팸 필터)
β = 2 Recall에 가중 → F2 미탐이 비싼 작업 (암 검진)

본 작업(문제 탐지)에서는 놓친 문제(FN)와 잘못 찾은 지문(FP) 모두 문제이므로 β=1(F1)이 적절하다.


실무에서 F1을 쓸 때 주의점

  1. 클래스가 여러 개면: Macro F1(각 클래스 F1의 평균), Micro F1(전체 TP/FP/FN 합산), Weighted F1(클래스 비율 가중) 중 택1
  2. 데이터 수가 적으면: F1 변동 폭이 크다. 교차 검증(Cross-Validation)으로 안정적 수치를 얻어야 한다.
  3. 임계값(threshold)에 따라 달라진다: 탐지 기준을 느슨하게 하면 Recall↑ Precision↓, 엄격하게 하면 반대. PR 곡선으로 최적점을 찾는다.
  4. F1이 높아도 실패할 수 있다: 놓친 1건이 치명적인 경우(의료, 보안), F1보다 Recall 단독 지표가 더 중요할 수 있다.

1 년 운영 후 — 단일 측정값이 못 보여주는 것

위 본문은 단일 시점의 F1 = 0.886 측정을 다룬다. 같은 모델을 1 년 가까이 운영하면서, 이 한 숫자가 무엇을 가리고 무엇을 드러내는지 가 점점 분명해졌다. 본 확장 섹션은 그 1 년 회고다.

본 글 내용과 직접 연결되는 측정 기준 정의는 시험지 OCR에서 TP/FP/FN 계산 기준 — 전체 객체 수 보존 관점 에 정리되어 있다. 동일한 기준을 운영 1 년 내내 유지했다.

월별 F1 추이 (실측, 익명화)

F1 Precision Recall 운영 사건
2025-08 0.886 0.861 0.912 (위 본문 측정)
2025-09 0.892 0.870 0.916
2025-10 0.847 0.815 0.882 새 시험지 폼 도입, 도메인 시프트
2025-11 0.871 0.852 0.891 threshold 조정 (0.50 → 0.55)
2025-12 0.901 0.892 0.910 신규 폼 라벨링 데이터로 미세조정
2026-01 0.898 0.889 0.907
2026-02 0.884 0.873 0.895
2026-03 0.879 0.866 0.892 새 학교 폼 다수 유입
2026-04 0.905 0.901 0.909 2 차 미세조정
2026-05 0.908 0.905 0.911 (현재)

가장 중요한 관찰 두 가지:

  1. 2025-10 의 0.886 → 0.847 하락 — 새 시험지 폼이 학습 데이터에 없던 레이아웃이라 모델이 처음 보는 패턴에 노출됐다. F1 하나로는 "데이터가 변했나, 모델이 망가졌나"를 구분할 수 없다. 같이 본 지표: 입력 도메인 분포 시프트(시험지 폼 ID 분포), 평균 confidence 분포(좌측 이동). 이 둘이 같이 떨어지면 데이터 시프트로 판정.
  2. 2025-11 의 threshold 조정 효과 — 모델 자체는 그대로 두고 분류 threshold 만 0.50 → 0.55 로 올렸을 때 Precision +3.7%p, Recall −2.5%p. F1 만 보면 +2.4%p 개선처럼 보이지만, 실제 비즈니스 KPI 인 "오탐 1 건당 검수자 시간 비용" 이 18% 줄었다. F1 의 1%p 가 어떤 비즈니스 효과로 환산되는지 를 모르고는 threshold 결정이 자의적이 된다.

F1 만 보면 놓치는 3 가지

M1. 클래스 불균형 안의 작은 클래스

시험지 OCR 의 "문제" vs "지문" 분류에서 지문이 ~70%, 문제가 ~30%. 정확히는 이미 위 본문에서 다룬 시나리오인데, 클래스가 더 추가되면 (예: "표", "그림 캡션", "각주") 작은 클래스의 F1 이 매크로 평균에 묻혀 안 보인다. 대응: F1-macro / F1-micro / F1-weighted 를 같이 본다.

  • F1-macro — 클래스별 F1 의 단순 평균. 작은 클래스에 같은 가중치.
  • F1-micro — 전체 TP/FP/FN 으로 한 번에 계산. 큰 클래스가 압도.
  • F1-weighted — 클래스 수 비례 가중. macro 와 micro 의 절충.

운영 모니터링에서는 F1-macro 가 가장 빨리 문제를 알려준다. 큰 클래스가 잘 분류되는 동안 작은 클래스 한 개가 망가져도 F1-micro 는 거의 안 움직이지만 F1-macro 는 두 자릿수 떨어진다.

M2. 라벨링 오류 vs 모델 오류

운영 초기 0.886 측정 직후 한 검토 라운드에서 ground truth 자체의 라벨링 오류가 ~3% 정도 있었음이 드러났다. 그 3% 가 모델의 "오답" 으로 잡혀 F1 을 깎고 있었다. ground truth 가 진실이라는 전제가 흔들리면 F1 의 절대값은 의미가 줄어든다. 대응: 분기별 ground truth 재검토 + inter-annotator agreement (kappa) 별도 측정.

M3. 비즈니스 비용은 비대칭

위 본문에 "Precision vs Recall, 각각 언제 중요한가" 표가 있다. 1 년 운영하며 확인한 것은, 둘의 비용이 항상 비대칭이고 그 비대칭이 시간에 따라 변한다 는 점이다.

  • 초기 (검수자 인력 충분, 시범 운영) — Recall 우선. 놓침이 비용. F1 보다 Recall 직접 추적.
  • 중기 (검수자 시간 한정) — Precision 우선. 오탐이 검수 비용. F1 보다 Precision 직접 추적.
  • 후기 (자동화 비중 ↑) — 둘 다 critical, F1 적정.

같은 모델·같은 데이터지만 운영 단계에 따라 봐야 하는 지표가 달라진다. F1 하나로 1 년 내내 운영하면 단계 전환을 놓친다.


의사결정 — F1 vs 다른 지표를 언제 쓸까

상황 추천 지표 이유
모델 비교 (논문·블로그용) F1, F1-macro 표준, 비교 가능성
운영 SLO 단일 알람 F1-macro (월별) 클래스별 회귀를 잡는다
오탐 비용 정량화 가능 Precision-Recall AUC + threshold tuning F1 은 단일 threshold 의 단면일 뿐
데이터 시프트 의심 F1 + confidence 분포 + 입력 도메인 분포 F1 단독으로는 원인 미식별
클래스 N ≥ 5 F1-macro + 클래스별 F1 분리 추적 작은 클래스 회귀 가시화
라벨링 품질 의심 kappa (inter-annotator) F1 의 분모/분자 자체를 검증

요약: F1 은 단일 게이지가 아니라 시리즈로 봐야 의미가 있다. 1 년 추이, 클래스별 분리, threshold 별 PR-curve — 이 셋을 같이 보면 F1 하나 보는 것보다 정보량이 5 배 가까이 늘어난다.

참고 문서


개정 이력

  • 2026-05-07 — 최초 발행 (F1 정의, 측정값, P/R 트레이드오프).
  • 2026-05-19 (확장판) — 1 년 운영 회고, F1 만으로 놓치는 3 가지, 지표 의사결정 표, 참고. AdSense W6 long-form L4.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다