결론 먼저 — 측정 결과
| 지표 | 공식 | 값 |
|---|---|---|
| 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을 쓸 때 주의점
- 클래스가 여러 개면: Macro F1(각 클래스 F1의 평균), Micro F1(전체 TP/FP/FN 합산), Weighted F1(클래스 비율 가중) 중 택1
- 데이터 수가 적으면: F1 변동 폭이 크다. 교차 검증(Cross-Validation)으로 안정적 수치를 얻어야 한다.
- 임계값(threshold)에 따라 달라진다: 탐지 기준을 느슨하게 하면 Recall↑ Precision↓, 엄격하게 하면 반대. PR 곡선으로 최적점을 찾는다.
- 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 | (현재) |
가장 중요한 관찰 두 가지:
- 2025-10 의 0.886 → 0.847 하락 — 새 시험지 폼이 학습 데이터에 없던 레이아웃이라 모델이 처음 보는 패턴에 노출됐다. F1 하나로는 "데이터가 변했나, 모델이 망가졌나"를 구분할 수 없다. 같이 본 지표: 입력 도메인 분포 시프트(시험지 폼 ID 분포), 평균 confidence 분포(좌측 이동). 이 둘이 같이 떨어지면 데이터 시프트로 판정.
- 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 배 가까이 늘어난다.
참고 문서
- scikit-learn — Precision, Recall, F1 — F1-macro/micro/weighted 정의 정전
- Google MLops — Model Evaluation — 운영 시 모니터링 패턴
- Cohen’s Kappa for inter-annotator agreement — 라벨링 품질의 standard
- PR-curve vs ROC-curve, 어느 쪽을 봐야 하나 — 불균형 데이터 평가
개정 이력
- 2026-05-07 — 최초 발행 (F1 정의, 측정값, P/R 트레이드오프).
- 2026-05-19 (확장판) — 1 년 운영 회고, F1 만으로 놓치는 3 가지, 지표 의사결정 표, 참고. AdSense W6 long-form L4.
답글 남기기