2026년 7월 2일 | 개발 공부
Precision-Recall curve는 threshold를 바꿔 가며 precision, 즉 정밀도와 recall, 즉 재현율이 어떻게 갈라지는지 보는 평가 곡선이다. PR AUC는 이 곡선 아래 면적을 한 숫자로 접은 값이고, average precision은 실제 ranking의 계단 모양을 더 직접 반영한 요약값에 가깝다. 이름이 비슷해서 처음에는 ROC AUC 옆에 붙는 보조 지표 정도로만 봤는데, 희소한 양성 데이터를 다루다 보면 오히려 이쪽이 더 빨리 상황을 설명해 주는 순간이 많았다.
정확도 하나로 놓치는 구간
양성 샘플이 드문 문제에서는 accuracy가 꽤 그럴듯하게 보일 수 있다. 예를 들어 이상 거래, 결함 탐지, 의학 스크리닝, 검색 결과의 관련 문서 찾기처럼 대부분이 음성인 데이터에서는 전부 음성이라고만 말해도 숫자상 정확도는 높게 나온다. 하지만 실제로 중요한 것은 양성 몇 개를 얼마나 잘 건져 올렸는지다. 이때 accuracy는 놓친 양성의 비용을 너무 얇게 펴 버린다.
ROC AUC도 좋은 지표지만, 음성 샘플이 압도적으로 많으면 false positive rate가 작아 보이는 착시가 생길 수 있다. 모델이 양성을 조금 더 잘 찾은 것처럼 보여도, 실제 상위 후보를 사람이 열어 보면 대부분이 음성인 경우가 있다. 나는 이런 문제에서는 먼저 Precision-Recall curve를 같이 본다. “전체 배경에서 얼마나 구분했나”보다 “양성이라고 꺼낸 것들이 얼마나 쓸 만했나”를 빨리 확인할 수 있기 때문이다.
threshold를 움직이며 보는 곡선
분류 모델의 score를 하나의 threshold로 잘라 양성/음성을 정하면 precision과 recall은 서로 밀고 당긴다. threshold를 낮추면 더 많은 후보를 양성으로 잡기 때문에 recall은 올라가지만, 그 안에 음성도 많이 섞여 precision이 내려간다. threshold를 높이면 반대로 precision은 올라가지만, 약한 양성 신호를 많이 놓치면서 recall이 떨어진다. PR curve는 이 흔들림을 한 줄로 펼친 그림이다.
이 곡선에서 내가 먼저 보는 것은 최고점 하나가 아니다. 운영에서는 “어느 threshold가 제일 높나”보다 쓸 수 있는 recall 구간에서 precision이 얼마나 버티는가가 더 중요할 때가 많다. 스팸 필터처럼 false positive가 아픈 문제와 결함 탐지처럼 false negative가 아픈 문제는 같은 곡선을 보더라도 고르는 지점이 달라진다. 그래서 PR curve는 모델 선택 점수이면서 동시에 운영 정책을 고르는 지도에 가깝다.
PR AUC와 average precision의 느낌 차이
PR AUC는 Precision-Recall curve 아래 면적을 넓게 요약한다. 숫자가 높으면 여러 threshold에서 precision과 recall 균형이 좋았다는 뜻으로 읽을 수 있다. 다만 실제 구현마다 보간 방식이 조금씩 달라서, 작은 데이터셋이나 tie가 많은 score에서는 생각보다 값이 흔들릴 수 있다. 그래서 보고서에 PR AUC만 적어 두면 나중에 재현할 때 “어떤 방식으로 적분했더라”를 다시 뒤지는 일이 생긴다.
Average precision은 ranking을 위에서부터 훑으며 양성이 등장할 때의 precision을 누적하는 방식으로 이해하면 편하다. 상위 후보에 양성이 빨리 몰려 있으면 값이 좋아지고, 양성이 아래쪽에 흩어져 있으면 내려간다. 검색, 추천, 후보 선별처럼 실제로 상위 몇 개를 열어 보는 작업에서는 average precision 쪽 설명이 더 직관적일 때가 있다. 나는 두 값을 완전히 같은 말로 쓰지 않으려고 한다. 둘 다 PR 계열 요약이지만, 곡선 면적을 보는지, ranking의 양성 등장 위치를 보는지가 조금 다르다.
실험표에 같이 남길 값
PR 계열 지표를 실험표에 넣을 때는 base rate를 꼭 같이 적는다. 양성 비율이 1%인지 20%인지에 따라 같은 precision 0.6의 의미가 완전히 달라진다. 양성이 1%인 문제에서 precision 0.6은 꽤 강한 신호일 수 있지만, 양성이 50%인 문제라면 그다지 특별하지 않을 수 있다. 그래서 PR AUC 옆에는 양성 비율, 평가 샘플 수, 양성 샘플 수를 함께 둔다.
두 번째로는 운영 후보 지점 하나를 남긴다. 예를 들어 “recall 0.8을 유지할 때 precision”, “precision 0.9 이상일 때 가능한 recall”, “상위 100개 후보에서 양성 개수” 같은 식이다. 평균 면적은 모델 간 비교에 좋지만, 실제 작업자는 특정 threshold에서 행동한다. 평균이 좋아졌는데 운영 threshold 근처 성능이 내려갔다면 그 모델은 배포 후보로 바로 올리기 어렵다.
내가 먼저 의심하는 실패 패턴
PR curve가 좋아 보이는데 실제 샘플을 열어 보면 별로인 경우가 있다. 첫 번째 의심은 label leakage다. 양성과 직접 연결된 후처리 필드가 feature에 섞이면 곡선은 말끔하게 올라가지만 배포에서는 무너진다. 두 번째는 split 문제다. 같은 사용자, 같은 문서 묶음, 같은 환자의 가까운 기록이 train과 test에 나뉘면 희소 양성 문제에서는 특히 과하게 좋아 보인다.
세 번째는 score calibration과의 혼동이다. PR curve는 score의 순서 품질을 많이 본다. score가 0.9라고 해서 실제 양성 확률이 90%라는 뜻은 아니다. 그래서 threshold를 실제 확률처럼 쓰려면 reliability diagram이나 log loss 같은 calibration 지표를 따로 봐야 한다. 나는 PR curve를 볼 때마다 이 선을 한 번 그어 둔다. 순서를 잘 세운 모델과 확률까지 믿을 수 있는 모델은 같은 모델일 수도 있지만, 자동으로 같은 말은 아니다.
희소 양성 데이터에서는 좋은 숫자 하나보다 질문을 잘게 나누는 편이 덜 위험하다. 양성을 얼마나 앞쪽으로 끌어올렸는지, 사람이 열어 볼 후보 안에 음성이 얼마나 섞였는지, 운영 threshold에서 무엇을 포기하는지까지 같이 봐야 한다. Precision-Recall curve는 그 질문들을 한 장에 묶어 준다. 그래서 나는 imbalance가 큰 실험표를 볼 때 accuracy 다음 칸에 PR 계열 지표를 거의 습관처럼 붙인다.
'[개발 공부]' 카테고리의 다른 글
| Balanced Accuracy: 다수 클래스 뒤의 실패율 (0) | 2026.07.03 |
|---|---|
| Matthews Correlation Coefficient: 불균형 분류의 네 칸 점수 (0) | 2026.07.02 |
| Log loss: 틀린 확신의 비용 (0) | 2026.07.01 |
| Reliability diagram: 과신 구간을 눈으로 보는 표 (0) | 2026.06.30 |
| Expected Calibration Error: 확률 구간별 과신 (0) | 2026.06.30 |