재현율
고친 사람 github-actions[bot]
재현율은 찾아야 할 것을 시스템이 빠짐없이 찾았는지 알려 줍니다. 버그가 다시 일어나는 비율을 가리키는 재현율은 뜻이 다릅니다. 이 항목은 검색과 알림의 결과를 재는 재현율을 다룹니다.
쉽고 빠른 이해
재현율은 정말 찾아야 하는 것 가운데 시스템이 찾아낸 것의 비율입니다. 서버 장애가 열 번 났고 그중 여덟 번에 알림이 울렸다면 재현율은 0.8입니다.
이 수가 없으면 놓친 것이 어디에도 드러나지 않습니다. 울린 알림은 기록에 남습니다. 안 울린 알림은 기록조차 없습니다.
- 정말 찾아야 하는 것을 전부 모읍니다
- 그중 시스템이 찾아낸 것을 셉니다
- 찾아낸 수를 전체 수로 나눕니다
재현율만 좇으면 헛것, 곧 잘못 고른 것까지 끌어안기 쉽습니다. 전부 「해당한다」고 골라도 재현율은 1이 되기 때문입니다. 그래서 고른 것 가운데 맞은 비율인 정밀도와 늘 함께 봅니다. 하나라도 놓치면 크게 잃는 일에서는 재현율을 앞세웁니다.
상세
술래가 숨은 친구 다섯 명 가운데 세 명을 찾았습니다. 찾은 세 명은 술래 곁에 모여 있어 눈에 잘 띕니다. 못 찾은 두 명은 아직 숨어 있습니다. 몇 명이 숨었는지 처음부터 알아야 술래가 얼마나 찾았는지 말할 수 있습니다.
재현율은 정말 해당하는 것 가운데 시스템이 찾아낸 것의 비율입니다. 서버 장애가 열 번 났고 그중 여덟 번에 알림이 울렸다면 재현율은 8을 10으로 나눈 0.8입니다. 값은 0과 1 사이에 놓입니다. 1이면 하나도 놓치지 않은 것입니다.
이 수를 따로 세는 까닭은 놓친 것이 결과 목록에 나타나지 않기 때문입니다. 울린 알림은 기록에 남습니다. 안 울린 알림은 기록조차 없습니다. 재현율을 세어야 시스템이 무엇을 흘렸는지 드러납니다.
판정 대상을 가르는 네 칸
재현율을 계산하려면 장애 한 건, 메일 한 통처럼 판정할 대상 하나하나를 두 물음으로 가릅니다. 정말 해당하나, 그리고 시스템이 골랐나입니다. 물음마다 답이 둘이라 칸이 넷 나옵니다.
「해당한다」는 판정을 양성, 「아니다」라는 판정을 음성이라고 합니다. 판정이 맞았으면 앞에 「참」을, 틀렸으면 「거짓」을 붙입니다. 시스템이 놓친 것은 「아니다」라고 잘못 판정한 것이므로 거짓 음성입니다.
| 정말 해당한다 | 정말은 아니다 | |
|---|---|---|
| 시스템이 골랐다 | 참 양성 | 거짓 양성 |
| 시스템이 안 골랐다 | 거짓 음성 | 참 음성 |
이 네 칸짜리 표가 혼동 행렬입니다. 재현율은 이 가운데 왼쪽 열만 봅니다. 정말 해당하는 것 안에서 찾아낸 비율이기 때문입니다. 식으로 쓰면 참 양성 수를 「참 양성 수 + 거짓 음성 수」로 나눈 값입니다.
코드로 세어 보겠습니다. 지난달 장애 다섯 건마다 알림이 울렸는지를 True 와 False 로 적어 두었습니다. 변수 이름 tp 는 참 양성(true positive), fn 은 거짓 음성(false negative)을 줄인 것입니다.
fired = [True, True, False, True, True]
tp = fired.count(True) # 4
fn = fired.count(False) # 1
tp / (tp + fn) # 0.8
장애 다섯 건 가운데 네 건에 알림이 울렸으니 재현율은 0.8입니다. 남은 한 건은 알림 없이 지나간 장애입니다.
정밀도와 나눠 쓰는 분자
정밀도는 시스템이 고른 것 가운데 정말 해당하는 것의 비율입니다. 재현율과 정밀도는 참 양성을 분자로 같이 씁니다. 두 수는 분모만 다릅니다.
flowchart TD
R["정말 해당하는 것 · 재현율의 분모"] --> TP["찾아낸 것 · 참 양성"]
R --> FN["놓친 것 · 거짓 음성"]
P["시스템이 고른 것 · 정밀도의 분모"] --> TP
P --> FP["잘못 고른 것 · 거짓 양성"]
화살표는 위의 상자가 무엇으로 나뉘는지를 가리킵니다. 참 양성은 위의 두 상자에 모두 매달려 있습니다. 재현율은 「정말 해당하는 것」 전체로 나눕니다. 정밀도는 「시스템이 고른 것」 전체로 나눕니다. 그래서 거짓 음성은 재현율에만 들어갑니다. 거짓 양성은 정밀도에만 들어갑니다.
전부 고르면 1이 되는 수
재현율은 쉽게 끌어올릴 수 있습니다. 모든 것을 「해당한다」고 고르면 놓치는 것이 하나도 없습니다. 거짓 음성이 0이니 재현율은 1입니다.
스팸 필터가 들어온 메일을 전부 스팸함에 넣었다고 합시다. 진짜 스팸은 하나도 안 빠졌으니 재현율은 1입니다. 그 대신 중요한 메일까지 전부 스팸함으로 갑니다. 받은편지함은 텅 빕니다.
이 필터의 정밀도는 들어온 메일 가운데 스팸이 차지하는 비율까지 떨어집니다. 그래서 재현율은 혼자 보지 않고 정밀도와 짝지어 봅니다.
두 수를 하나로 묶어야 할 때는 F1 점수를 흔히 씁니다. F1 점수는 두 수의 조화평균(Harmonic mean)입니다. 조화평균은 두 수 가운데 작은 쪽으로 크게 끌려 내려가는 평균입니다. 재현율만 1로 올리고 정밀도를 버린 시스템은 F1 점수가 낮게 나옵니다.
임계값을 내리면 오르는 재현율
많은 시스템은 항목마다 점수를 매긴 뒤 선 하나를 넘는 것만 고릅니다. 이 선이 임계값입니다. 알림이라면 오류율이 0.05를 넘을 때 울리게 정해 두는 식입니다. 이때 0.05가 임계값입니다.
선을 0.05에서 0.02로 내리면 더 많이 고릅니다. 애매하던 진짜 장애까지 걸리니 재현율은 대개 오릅니다. 대신 별일 아닌 흔들림에도 알림이 울려 정밀도는 내려갑니다.
두 수를 함께 올리려면 선을 옮기는 것으로는 안 됩니다. 점수를 매기는 방법을 고쳐야 합니다.
임계값을 바꿔 가며 정밀도와 재현율을 점으로 찍고 이어 보면 곡선이 하나 나옵니다. 이 그래프가 정밀도-재현율 곡선입니다. 한 시스템에서 두 수를 어떻게 맞바꿀 수 있는지 한눈에 보여 줍니다.
재현율을 앞세우는 경우
하나를 놓쳤을 때 잃는 것이 크면 재현율을 앞세웁니다. 헛것, 곧 거짓 양성이 조금 늘어나는 것은 감수합니다. 반대로 잘못 고른 것 하나가 더 비싸면 정밀도를 앞세웁니다.
| 상황 | 놓치면 생기는 일 |
|---|---|
| 서비스 장애 알림 | 사용자가 먼저 장애를 겪는다 |
| 사기 거래를 1차로 걸러 내는 검사 | 돈이 나간다 |
| 암 검진의 첫 검사 | 병을 늦게 발견한다 |
| 침입 탐지 | 침입자가 오래 머문다 |
| 소송에 낼 증거 문서 찾기 | 내야 할 문서를 빠뜨린다 |
이런 일은 흔히 두 단계로 나눕니다. 1차는 재현율을 높여 넓게 건집니다. 2차는 건진 것을 다시 보며 헛것을 걸러 냅니다. 검진에서 첫 검사가 양성이면 정밀 검사를 한 번 더 받는 것이 이 구조입니다.
검색 엔진도 같은 구조를 씁니다. 먼저 후보 문서를 넉넉히 뽑습니다. 그다음 후보의 순서를 다시 매겨 위쪽에 올릴 문서를 고릅니다. 앞 단계에서 놓친 문서는 뒤 단계가 아무리 좋아도 다시 살아나지 않습니다.
알림의 재현율
운영에서 재현율이 가장 또렷하게 드러나는 곳은 알림입니다. 알림의 재현율은 장애 가운데 알림이 울린 장애의 비율입니다. 여기서 장애는 사람이 손써야 했던 일을 말합니다.
알림이 놓친 장애는 대개 다른 길로 알려집니다. 사용자 문의가 들어오거나 옆 팀이 이상을 전해 옵니다. 장애 기록을 모아 두면 이런 장애까지 셀 수 있습니다.
세는 법은 단순합니다. 장애마다 알림이 울렸는지 적어 둡니다. 알림이 울린 장애 건수를 장애 전체 건수로 나눕니다.
재현율을 올리려고 알림 조건을 느슨하게 하면 헛울림이 늘어납니다. 헛울림은 장애가 아닌데 울린 알림이라 거짓 양성입니다. 헛울림이 잦으면 사람들이 알림을 흘려 보게 됩니다. 이런 상태가 알림 피로입니다.
검색의 재현율
검색에서는 찾던 문서 가운데 검색이 돌려준 문서의 비율이 재현율입니다. 문서가 찾던 것인지 아닌지를 적합성이라고 합니다.
검색의 재현율은 분모를 세기가 어렵습니다. 문서가 백만 건이면 그 가운데 적합한 문서가 몇 건인지 아무도 모릅니다. 그래서 평가할 때는 문서 모음과 질의를 미리 정해 둡니다. 그다음 사람이 문서마다 적합성을 매깁니다. 이렇게 준비한 평가 자료가 테스트 세트입니다.
결과 목록이 길면 위에서 k건만 잘라 재기도 합니다. 적합한 문서가 모두 스무 건이라고 합시다. 첫 화면 열 건에 그중 다섯 건이 들어 있으면 상위 10건 재현율은 5를 20으로 나눈 0.25입니다. 이 값이 상위 k 재현율입니다. 영어로는 recall@k 라고 적습니다.
재현율을 가리키는 다른 이름
같은 값을 분야마다 다른 이름으로 부릅니다. 뜻과 식은 모두 같습니다.
| 이름 | 쓰는 분야 |
|---|---|
| 재현율 · recall | 검색 · 머신러닝 |
| 민감도 · sensitivity | 의학 검사 |
| 참 양성률 · TPR(True Positive Rate) | 통계 · 분류 성능 곡선 |
의학에서 민감도는 병이 있는 사람 가운데 검사가 양성으로 잡아낸 사람의 비율입니다. 병을 가진 사람을 덜 놓치는 검사일수록 민감도가 높습니다.
참 양성률이라는 이름은 ROC 곡선(Receiver Operating Characteristic curve)에서 자주 만납니다. ROC 곡선은 임계값을 바꿔 가며 두 비율을 점으로 찍어 이은 곡선입니다. 세로축은 참 양성률입니다. 가로축은 거짓 양성률, 곧 정말 아닌 것 가운데 시스템이 잘못 고른 것의 비율입니다.
운영에서는 거짓 음성을 미탐이라고도 부릅니다. 재현율이 낮다는 말은 미탐이 많다는 말과 같습니다.
특이도는 다른 이름이 아니라 재현율과 짝이 되는 다른 수입니다. 정말 아닌 것 가운데 시스템이 「아니다」라고 맞힌 비율입니다. 의학 검사에서는 민감도와 특이도를 짝지어 봅니다.
같은 이름을 쓰는 다른 재현율
버그 보고서의 재현율은 전혀 다른 값입니다. 같은 절차를 되풀이했을 때 버그가 다시 나타나는 비율을 말합니다. 열 번 시도해 세 번 나타났다면 「10회 중 3회」처럼 적습니다.
이 재현율이 낮은 버그는 고치기 어렵습니다. 버그를 다시 일으킬 수 없으면 원인을 좁혀 들어갈 방법이 마땅치 않습니다. 스레드의 실행 순서에 따라 결과가 갈리는 경쟁 상태가 흔히 이런 버그를 만듭니다.
관련 항목
재현율을 계산하는 판정 칸
혼동 행렬 · 참 양성 · 거짓 음성 · 거짓 양성 · 참 음성 · 미탐 · 오탐
재현율과 나란히 보는 평가 지표
정밀도 · 정밀도와 재현율 · F1 점수 · 조화평균 · 정확도 · 특이도 · 상위 k 재현율 · 정밀도-재현율 곡선 · ROC 곡선 · AUC
재현율을 움직이는 판정 기준
임계값 · 분류 · 이진 분류 · 분류기 · 결정 경계 · 오류율
재현율로 성능을 재는 시스템
검색 · 검색 엔진 · 알림 · 스팸 필터 · 이상 탐지 · 침입 탐지 시스템 · 추천 시스템 · 머신러닝
재현율을 재는 데 쓰는 평가 자료
재현율 평가를 흐리는 문제
클래스 불균형 · 데이터 누수 · 과적합 · 표본 편향
재현율을 좇을 때 늘어나는 운영 부담
재현율이라는 이름을 함께 쓰는 버그 추적 개념
재현성 · 버그 리포트 · 경쟁 상태 · 하이젠버그
다른 이름: recall · 민감도 · sensitivity · 참 양성률 · TPR