티스토리 뷰
정답률(Accuracy)이 전부일까? — Precision과 Recall이 등장하게 된 이유
세상에는 많은 머신러닝 모델이 있습니다. 그 모델이 얼마나 "잘 작동하는지" 평가하는 기준이 필요하죠. 이때 가장 먼저 떠오르는 건 정확도(Accuracy)일 겁니다. 예를 들어 100명 중 95명을 맞췄다면 정확도는 95%니까 꽤 괜찮아 보이죠. 그런데, 정말 그럴까요?
오늘은 정답률만으로는 볼 수 없었던 문제들을 짚어보고, 그 문제를 해결하려 등장한 Precision(정밀도) 과 Recall(재현율) 의 개념을 이해해보려 합니다.
왜 Accuracy만으로는 충분하지 않을까?
정확도는 가장 직관적인 지표입니다. 예측이 얼마나 맞았는지를 보는 거니까요. 다음과 같은 상황을 생각해봅시다.
✅ 예시: 암 진단 모델
- 전체 사람: 1000명
- 이 중 암 환자: 10명
- 모델이 모두 ‘암이 아니다’라고 예측함
→ 990명을 정확하게 예측했죠. Accuracy = 990 / 1000 = 99%
하지만... 암 환자 10명을 모두 놓쳤습니다. 이 모델은 “환자를 하나도 못 찾은 모델”입니다. 이게 좋은 모델일까요?
이런 식으로 클래스 불균형, 즉 어떤 클래스(예: 암 환자)가 아주 드문 경우, 정확도만으로는 모델의 성능을 제대로 평가할 수 없습니다.
정보검색 시스템에서의 고민: Precision과 Recall의 등장
이러한 평가 문제는 이미 1950년대에도 고민되던 문제였습니다.
그 당시 연구자들은 문서 검색 시스템을 개발하고 있었습니다. 논문을 검색하면 관련 문서를 찾아주는 시스템이죠. 그런데 이 시스템을 어떻게 평가해야 할까요?
🔍 예시: 논문 검색 시스템
- 관련 문서: 20개
- 검색 결과: 30개
- 이 중 관련 문서: 15개
- 관련 없는 문서: 15개
자, 이 시스템은 잘 작동한 걸까요? 단순히 Accuracy로는 평가하기 어렵습니다. 그래서 두 가지 새로운 질문이 등장합니다:
- Precision (정밀도)
- “검색된 문서 중에서 진짜 관련된 건 얼마나 있지?”
- Recall (재현율)
- “전체 관련 문서 중에 얼마나 찾아냈지?”
이 두 질문은 지금도 분류 모델 성능 평가의 핵심을 구성하고 있습니다.
Precision과 Recall은 어떤 질문에 답하는가?
두 지표는 아주 다른 성격의 질문에 답합니다.
지표 질문 예시 상황
Precision | 예측한 것 중 진짜인 건 얼마나? | “내가 스팸이라고 한 메일 중 실제 스팸은 얼마나?” |
Recall | 실제인 것 중 내가 잘 찾은 건 얼마나? | “전체 스팸 중 내가 스팸으로 잘 잡은 건 얼마나?” |
Confusion Matrix로 구조 이해하기
분류 문제는 보통 두 클래스 간의 예측입니다. 예를 들어 "암" vs "암 아님". 이때 예측 결과는 다음처럼 분류됩니다:
예측 Positive 예측 Negative
실제 Positive TP FN
실제 Negative FP TN
- TP (True Positive): 암인데 암이라고 예측
- FP (False Positive): 암이 아닌데 암이라고 예측 (오진)
- FN (False Negative): 암인데 암 아니라고 예측 (놓침)
- TN (True Negative): 암 아니고 암 아니라고 예측
이 네 가지 값을 조합하면 다양한 지표들이 나옵니다.
📐 Precision과 Recall 공식
- Precision = TP / (TP + FP)
→ "예측한 Positive 중 실제 Positive" - Recall = TP / (TP + FN)
→ "실제 Positive 중 내가 맞힌 비율"
📌 해석 예시
- Precision이 낮으면: 예측을 많이 했지만 그 중 틀린 게 많음
- Recall이 낮으면: 실제 정답을 많이 놓침
일상적 사례로 보는 Precision과 Recall
🎯 예시 1: 스팸 메일 필터
- Precision이 높다: 스팸이라고 표시된 건 거의 다 진짜 스팸
- Recall이 높다: 실제 스팸을 거의 다 걸러냄
→ Precision만 높으면 정답만 찍는데 많이 놓칠 수 있고,
→ Recall만 높으면 다 잡긴 하지만 일반 메일까지 걸러질 수 있음
🧬 예시 2: 암 진단
- Precision이 높다: 암이라고 예측한 사람 중 진짜 암일 확률이 높음 (오진 적음)
- Recall이 높다: 실제 암 환자를 놓치지 않음 (민감도 높음)
→ Recall이 낮으면 진짜 환자를 놓칠 수 있어 위험
정리: Precision과 Recall은 왜 등장했는가?
문제 상황 기존 지표의 한계 새로운 질문 해결된 지표
암 진단, 스팸 필터 | Accuracy만으로는 불균형 문제 파악 불가 | “진짜를 얼마나 잘 찾았는가?” | Recall |
논문 검색, 추천 시스템 | 결과가 많을수록 정확도 왜곡 | “예측한 것 중 진짜는 얼마나?” | Precision |
그런데 이건 Precision일까? – 혼동하기 쉬운 식들
Precision과 Recall을 처음 배우면, 비슷하게 생긴 다른 수식들도 "혹시 이것도 Precision 아닐까?" 하는 생각이 들 수 있습니다. 실제로 다음과 같은 식들을 보면 헷갈리기 쉽습니다.
❓ TN / (TN + FN)는 Precision일까?
이 식은 예측이 Negative였던 경우 중, 실제로 Negative인 비율을 계산하는 것입니다. 구조상 TP / (TP + FP)와 닮았죠. 그래서 얼핏 보면 “이것도 Negative에 대한 Precision인가?” 싶은 생각이 듭니다.
하지만 그렇지 않습니다.
- Precision의 정의는: 예측한 Positive 중, 진짜 Positive의 비율입니다.
- 즉, 관심 있는 클래스(Positive class) 를 기준으로 평가해야 Precision이라고 부릅니다.
반대로, TN / (TN + FN)는 Negative로 예측한 것 중 실제 Negative인 비율입니다. 이건 표준적인 명칭도 없고, 일반적으로 중요한 지표로 취급되지 않습니다. 왜냐하면 대부분의 경우 관심 있는 건 Positive 클래스(예: 암, 스팸, 사기 등)이고, 그걸 얼마나 잘 찾아냈느냐가 핵심이기 때문입니다.
⚠️ 비슷하다고 해서 Precision은 아니다
다음 표를 보면, 실제로 자주 혼동되는 식들이 어떤 의미를 갖는지 비교할 수 있습니다.
계산식 해석 정식 명칭 Precision인가?
TP / (TP + FP) | 예측 Positive 중 실제 Positive | Precision | ✅ 예 |
TP / (TP + FN) | 실제 Positive 중 예측 Positive | Recall | ❌ 아님 |
TN / (TN + FP) | 실제 Negative 중 예측 Negative | Specificity | ❌ 아님 |
FN / (FN + TP) | 실제 Positive 중 예측 Negative | False Negative Rate | ❌ 아님 |
TN / (TN + FN) | 예측 Negative 중 실제 Negative | 공식 명칭 없음 | ❌ 아님 |
이처럼 헷갈리기 쉬운 수식들도 정확하게 따져보면, 대부분은 Precision의 정의에서 벗어나 있습니다.
Precision은 반드시 예측한 Positive 중에 진짜 Positive가 얼마나 되는가에 대한 질문에만 답합니다.
Precision vs. Recall, 둘 다 중요하면 어떻게 해야 할까?
이쯤에서 또 다른 질문이 생깁니다.
“Precision은 높으면 Recall이 낮고, Recall을 높이면 Precision이 떨어지는 경우가 많은데... 둘 다 중요하면 어떻게 하지?”
이건 현실에서 자주 마주치는 딜레마입니다. 예를 들어 스팸 필터는 스팸을 다 잡고 싶지만, 중요한 메일을 걸러내면 안 되죠. 암 진단도 마찬가지입니다. 환자를 놓쳐선 안 되지만, 건강한 사람을 암이라고 오진해서도 안 됩니다.
이처럼 Precision과 Recall은 서로 trade-off 관계일 수 있습니다.
그래서 등장한 지표가 있습니다. 바로, 이 둘의 균형을 잡아주는 F1 Score입니다.
Precision과 Recall, 둘 다 중요할 때는? — F1 Score의 등장
이전 글에서는 정확도(Accuracy)의 한계 때문에 등장한 Precision과 Recall을 살펴봤습니다.
하지만 현실 문제는 여기서 한 걸음 더 복잡해집니다.
- Precision을 높이자니 Recall이 떨어지고,
- Recall을 높이자니 Precision이 낮아지고...
이 둘은 종종 서로를 희생시켜야만 올라가는 관계를 갖습니다.
이럴 땐 어떻게 해야 할까요? 바로, 이 질문에서 F1 Score가 등장하게 됩니다.
Precision과 Recall의 균형: 충돌은 필연일까?
🔁 Trade-off의 예
🎯 스팸 필터 예시
- Precision을 높이려면 → 확실한 것만 스팸으로 표시
→ 하지만 스팸이 많이 빠져나감 → Recall↓ - Recall을 높이려면 → 의심 가는 건 다 스팸 처리
→ 하지만 일반 메일까지 걸림 → Precision↓
🧬 암 진단 예시
- Recall을 극대화하려면 → 웬만하면 다 암이라고 예측
→ 암 환자는 놓치지 않지만, 건강한 사람도 암으로 오진
→ Precision↓, 진료 비용↑, 공포 유발
❗ Precision과 Recall 중 하나만 보면 생기는 문제
- Precision만 보면 모델이 너무 소심할 수 있음
- Recall만 보면 모델이 무조건 '경고'만 할 수도 있음
- 현실은 두 성능이 모두 중요한 경우가 많음
→ 그래서 등장한 개념: F1 Score
Precision과 Recall의 조화 평균(harmonic mean) 으로, 두 값을 하나의 지표로 통합
F1 Score는 왜 '조화 평균'을 쓰는가?
우리는 평균이라고 하면 보통 산술 평균을 떠올립니다.
예를 들어 Precision = 0.8, Recall = 0.6이면 보통 평균은 (0.8 + 0.6)/2 = 0.7이라고 생각하죠.
하지만 F1 Score는 이렇게 계산하지 않습니다.
정확한 수식은 다음과 같습니다:
F1=2⋅Precision⋅RecallPrecision+RecallF_1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}
이건 조화 평균(Harmonic Mean) 으로, 둘 중 작은 값을 중심으로 수렴합니다.
즉, Precision과 Recall 중 어느 하나가 낮으면 F1 Score도 낮게 나옵니다.
→ 두 성능이 모두 일정 수준 이상일 때만 F1이 높아집니다.
✅ 조화 평균을 쓰는 이유
평균 방식 특징
산술 평균 | 두 값의 크기만큼 단순히 더함 |
조화 평균 | 작은 값이 크기를 지배함 (둘 다 커야 높아짐) |
따라서 F1 Score는 Precision과 Recall이 동시에 높은 모델을 선호합니다.
둘 중 하나가 높고 하나가 낮은 경우, 그 모델을 “좋다”고 하지 않겠다는 철학이 반영되어 있는 것이죠.
수식으로 이해해보기 (예시)
Precision Recall F1 Score 계산 결과
1.0 | 0.0 | 2⋅1⋅01+0=0\frac{2 \cdot 1 \cdot 0}{1 + 0} = 0 | 완전 실패 |
0.8 | 0.8 | 2⋅0.8⋅0.80.8+0.8=0.8\frac{2 \cdot 0.8 \cdot 0.8}{0.8 + 0.8} = 0.8 | 잘 작동 |
0.8 | 0.2 | 2⋅0.8⋅0.20.8+0.2=0.32\frac{2 \cdot 0.8 \cdot 0.2}{0.8 + 0.2} = 0.32 | 좋지 않음 |
0.5 | 0.5 | 2⋅0.5⋅0.50.5+0.5=0.5\frac{2 \cdot 0.5 \cdot 0.5}{0.5 + 0.5} = 0.5 | 평균 수준 |
왜 조화평균을 쓰는가? (예시)
2025.04.07 - [머신러닝/머신러닝] - F1 스코어에서 조화평균을 쓰는 이유
F1 스코어에서 조화평균을 쓰는 이유
F1 스코어는 왜 조화평균을 쓸까?— 두 지표가 모두 ‘기여 단위가 역수 구조일 때’ 최적의 결합 방식이기 때문입니다.1️⃣ 우선 구조부터 짚고 갑시다: Precision vs RecallPrecision (정밀도):내가 ‘
eunjin123123.tistory.com
F1 Score는 언제 쓰면 좋을까?
✅ F1 Score가 특히 중요한 상황
- 클래스 불균형이 존재할 때
→ 예: 사기 거래 탐지, 고장 예측, 질병 진단 등 - Precision과 Recall 모두 중요할 때 → 한쪽만 높아도 안심할 수 없는 경우
- 정확도(Accuracy)가 과대평가되는 상황을 방지하고 싶을 때
❌ F1 Score가 덜 유용한 상황
- 모델의 확률 예측 품질이 중요할 때 → Log Loss, Brier Score
- 민감도와 특이도의 균형을 보고 싶을 때 → ROC Curve, AUC
일상적인 예로 다시 정리해보자
사례 Precision 중요 Recall 중요 F1 Score 필요
스팸 필터 | O (중요 메일 오탐 방지) | O (스팸 놓치면 불편) | ✔️ |
암 진단 | O (건강인 오진 방지) | O (환자 놓치면 치명적) | ✔️ |
테러 탐지 | 덜 중요 | 매우 중요 (놓치면 큰일) | ❌ Recall 중심 |
문서 추천 | Precision 중심 | Recall 상대적 중요↓ | ❌ Precision 중심 |
F1 Score의 확장형: Fβ Score
참고로, F1 Score는 Precision과 Recall을 동등하게 중요하게 여기는 경우에 사용하는 버전입니다.
하지만 경우에 따라 한쪽이 더 중요할 수 있죠. 이럴 땐 Fβ Score를 사용합니다:
Fβ=(1+β2)⋅Precision⋅Recallβ2⋅Precision+RecallF_\beta = \frac{(1 + \beta^2) \cdot \text{Precision} \cdot \text{Recall}}{\beta^2 \cdot \text{Precision} + \text{Recall}}
- β > 1: Recall을 더 중요하게 반영
- β < 1: Precision을 더 중요하게 반영
- β = 1: F1 Score
실무에서는 F2 (Recall 우선), F0.5 (Precision 우선) 도 자주 사용됩니다.
- Accuracy: 전체 중 얼마나 맞췄는지 보기 쉽지만, 클래스 불균형일 땐 성능을 왜곡해서 주의가 필요하다.
- Precision: Positive라고 예측한 것 중 얼마나 맞았는지를 알려줘서, 오탐(위양성)을 줄이는 데 핵심이다.
- Recall: 실제 Positive 중 얼마나 놓치지 않았는지를 보여줘서, 누락(위음성)이 위험한 상황에서 중요하다.
- F1 Score: Precision과 Recall 사이에 균형이 필요할 때, 둘 다 일정 수준 이상이어야 좋은 모델임을 평가할 수 있다.
'머신러닝 > 머신러닝' 카테고리의 다른 글
F1 스코어에서 조화평균을 쓰는 이유 (0) | 2025.04.07 |
---|
- Total
- Today
- Yesterday
- 데이터분석
- 류근관
- 여인권
- Python
- 사회심리학
- 일문따
- 인프런
- 보세사
- 백준
- 뇌와행동의기초
- 파이썬
- C/C++
- 일본어문법무작정따라하기
- 일본어
- 심리학
- 열혈프로그래밍
- 코딩테스트
- 통계
- 강화학습
- 오블완
- K-MOOC
- stl
- C
- jlpt
- 회계
- 윤성우
- 인지부조화
- 통계학
- c++
- 티스토리챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |