사전 정밀도
개념

정밀도

gabury1고친 사람 github-actions[bot]

정밀도는 시스템이 골라낸 결과를 얼마나 믿어도 되는지 알려 줍니다. 검색 결과 열 건 가운데 찾던 문서가 여덟 건이면 정밀도는 0.8입니다. 측정이나 시계에서 쓰는 정밀도는 뜻이 다릅니다. 이 항목은 검색과 알림의 결과를 재는 정밀도를 다룹니다.

쉽고 빠른 이해

정밀도는 「이거다」 하고 골라낸 것 가운데 정말 맞은 것의 비율입니다. 스팸 필터가 메일 스무 통을 스팸함에 넣었다고 합시다. 그중 열여덟 통이 진짜 스팸이면 정밀도는 0.9입니다.

이 수가 없으면 골라낸 결과를 얼마나 믿어도 되는지 말할 길이 없습니다. 알림이 울려서 가 볼 때마다 절반이 헛울림이면 사람들은 곧 알림을 흘려 보기 시작합니다.

  1. 시스템이 골라낸 것을 전부 모읍니다
  2. 그중 정말 맞은 것을 셉니다
  3. 맞은 수를 골라낸 수로 나눕니다

대가는 놓친 것이 안 보인다는 점입니다. 가장 확실한 한 건만 골라도 정밀도는 1이 됩니다. 그래서 정답을 빠짐없이 찾았는지 재는 재현율과 늘 함께 봅니다.

상세

화재경보기가 한 달에 열 번 울렸다고 해 봅시다. 그중 정말 불이 난 것은 두 번뿐입니다. 식구들은 곧 경보가 울려도 뛰어나가지 않고 부엌부터 들여다봅니다. 울릴 때마다 정말 불이었던 경보기라야 사람들이 곧바로 움직입니다.

정밀도는 시스템이 「해당한다」고 골라낸 것 가운데 정말 해당하는 것의 비율입니다. 스팸 필터가 메일 스무 통을 스팸함에 넣었다고 합시다. 그중 열여덟 통이 진짜 스팸이면 정밀도는 18을 20으로 나눈 0.9입니다. 값은 0과 1 사이에 놓입니다.

이 수가 있어야 골라낸 결과를 얼마나 믿어도 되는지 말할 수 있습니다. 결과를 받아 드는 쪽은 사람이거나 다음 단계의 프로그램입니다. 정밀도가 0.5라면 받아 든 두 건 가운데 한 건은 헛걸음입니다.

결과를 가르는 네 칸

정밀도를 계산하려면 결과 하나하나를 두 물음으로 가릅니다. 시스템이 골랐나, 그리고 정말 해당하나입니다. 물음마다 답이 둘이라 칸이 넷 나옵니다.

「해당한다」는 판정을 양성, 「아니다」라는 판정을 음성이라고 부릅니다. 병원 검사에서 온 말입니다. 판정이 맞았으면 앞에 「참」을, 틀렸으면 「거짓」을 붙입니다.

정말 해당한다 정말은 아니다
시스템이 골랐다 참 양성 거짓 양성
시스템이 안 골랐다 거짓 음성 참 음성

이 네 칸짜리 표가 혼동 행렬입니다. 정밀도는 이 가운데 윗줄만 봅니다. 시스템이 고른 것 안에서 맞은 비율이기 때문입니다. 식으로 쓰면 참 양성 수를 「참 양성 수 + 거짓 양성 수」로 나눈 값입니다.

코드로 세어 보겠습니다. 울린 알림 다섯 건마다 사람이 「진짜」와 「헛」을 적어 두었다고 해 봅시다. 변수 이름 tp 는 참 양성(true positive), fp 는 거짓 양성(false positive)을 줄인 것입니다.

Python
alerts = ["진짜", "진짜", "헛", "진짜", "헛"]
tp = alerts.count("진짜")    # 3
fp = alerts.count("헛")      # 2
tp / (tp + fp)               # 0.6

울린 다섯 건 가운데 세 건이 진짜였으니 정밀도는 0.6입니다. 나머지 두 번은 사람을 헛되이 불러낸 알림입니다.

영어 이름은 precision 입니다. 의학 검사에서는 같은 값을 양성 예측도라고 부릅니다. 검사에서 병이 있다고 나온 사람 가운데 정말 병이 있는 사람의 비율이라는 뜻입니다.

놓친 결과를 세는 재현율

정밀도의 분모에는 시스템이 고른 것만 들어갑니다. 정말 해당하지만 시스템이 못 고른 것이 거짓 음성입니다. 거짓 음성은 정밀도 식 어디에도 안 들어갑니다. 그래서 정밀도만으로는 무엇을 놓쳤는지 알 수 없습니다.

극단을 보면 뚜렷합니다. 스팸이 이백 통 들어왔다고 해 봅시다. 필터는 가장 확실한 한 통만 스팸함에 넣었습니다. 그 한 통이 진짜 스팸이면 정밀도는 1입니다. 나머지 백아흔아홉 통은 받은편지함에 쌓여 있습니다.

이 빈틈을 재현율이 채웁니다. 재현율은 정말 해당하는 것 가운데 시스템이 찾아낸 것의 비율입니다. 식으로 쓰면 참 양성 수를 「참 양성 수 + 거짓 음성 수」로 나눈 값입니다. 앞의 필터는 이백 통 중 한 통을 찾았으니 재현율이 0.005입니다.

두 수는 분모가 다릅니다. 정밀도는 고른 것의 수로 나눕니다. 재현율은 정답의 수로 나눕니다. 한쪽만 보고 시스템을 평가하면 다른 쪽에서 무엇이 새는지 모릅니다.

임계값을 옮기면 오가는 두 수

많은 시스템은 항목마다 점수를 매긴 뒤 선을 하나 그어 고릅니다. 이 선이 임계값입니다. 스팸 필터라면 메일마다 스팸일 가능성을 0과 1 사이의 점수로 냅니다. 그리고 점수가 임계값을 넘는 메일을 스팸함에 넣습니다.

임계값을 올리면 점수가 아주 높은 것만 골라집니다. 확실한 것만 남으니 정밀도는 대개 오릅니다. 대신 점수가 애매한 진짜 스팸이 빠지니 재현율은 내려갑니다. 임계값을 내리면 두 수가 반대로 움직입니다.

아래 표는 메일 백 통, 그중 진짜 스팸 스무 통을 두고 임계값만 바꿔 본 예입니다.

임계값 고른 메일 그중 진짜 스팸 정밀도 재현율
0.9 8통 8통 1.0 0.4
0.7 16통 14통 0.875 0.7
0.5 25통 18통 0.72 0.9

표를 위에서 아래로 읽으면 임계값이 내려갈수록 고르는 메일이 늘어납니다. 재현율은 0.4에서 0.9로 오릅니다. 정밀도는 1.0에서 0.72로 내려갑니다. 두 수를 함께 끌어올리려면 임계값이 아니라 점수를 매기는 방법을 고쳐야 합니다.

정밀도를 앞세우는 경우

두 수 가운데 어느 쪽을 더 볼지는 틀렸을 때 치르는 값이 정합니다. 잘못 고른 것 하나가 비싸면 정밀도를 앞세웁니다. 놓친 것 하나가 비싸면 재현율을 앞세웁니다.

상황 비싼 실수 앞세우는 수
스팸 필터 중요한 메일이 스팸함으로 간다 정밀도
새벽에 사람을 깨우는 알림 헛울림에 사람이 일어난다 정밀도
사기 거래를 1차로 걸러 내는 검사 사기를 놓쳐 돈이 나간다 재현율
암 검진의 첫 검사 환자를 놓친다 재현율

운영에서 이 선택이 가장 자주 드러나는 곳은 알림입니다. 알림의 정밀도는 울린 알림 가운데 사람이 손을 써야 했던 것의 비율입니다. 이 값이 낮으면 헛울림에 지친 사람들이 알림을 흘려 보게 됩니다. 그 사이에 진짜 장애 알림도 묻힙니다. 이런 상태를 알림 피로라고 부릅니다.

검색 결과의 정밀도

검색에서는 돌려준 문서 가운데 사용자가 찾던 문서의 비율이 정밀도입니다. 문서가 찾던 것인지 아닌지를 적합성이라고 부릅니다. 검색을 평가할 때는 사람이 문서마다 적합성을 미리 매겨 둡니다.

검색 결과에는 순서가 있습니다. 사람은 대개 위쪽만 봅니다. 그래서 결과 전체 대신 위에서 k건만 잘라 정밀도를 재는 일이 많습니다. 이 값이 상위 k 정밀도입니다.

첫 화면 열 건 가운데 적합한 문서가 여섯 건이면 상위 10건 정밀도는 0.6입니다. 영어로는 precision@k 라고 적습니다.

정확도와 다른 점

이름이 비슷한 정확도는 판정이 맞은 것 전체를 봅니다. 참 양성과 참 음성을 더해 결과 전체의 수로 나눈 값입니다. 고른 것이든 안 고른 것이든 판정이 맞았으면 셉니다.

해당하는 것이 드물면 정확도는 거의 아무것도 알려 주지 않습니다. 거래 천 건 가운데 사기가 한 건이라고 해 봅시다. 모든 거래를 「정상」이라고 판정하는 시스템도 천 건 중 999건을 맞혀 정확도가 0.999입니다.

같은 시스템의 정밀도는 계산조차 되지 않습니다. 아무것도 고르지 않아 분모가 0이기 때문입니다. 재현율은 0입니다. 정확도가 0.999여도 사기는 한 건도 못 잡은 셈입니다.

판정이 가르는 갈래를 클래스라고 합니다. 객체지향의 클래스가 아니라 이 예의 「사기」와 「정상」 같은 갈래입니다. 한 클래스가 다른 클래스보다 훨씬 드문 상태가 클래스 불균형입니다. 이런 문제에서는 정확도 대신 정밀도와 재현율을 봅니다.

두 수를 하나로 묶는 F1 점수

정밀도와 재현율을 수 하나로 합쳐야 할 때가 있습니다. 점수를 매기는 방법 여러 개를 한 줄로 세워 고를 때가 그렇습니다. 흔히 쓰는 것은 F1 점수입니다.

F1 점수는 두 수의 조화평균(Harmonic mean)입니다. 조화평균은 두 수 가운데 작은 쪽으로 크게 끌려 내려가는 평균입니다. 식은 「2 × 정밀도 × 재현율」을 「정밀도 + 재현율」로 나눈 값입니다. 정밀도 0.9, 재현율 0.1인 시스템은 산술평균이 0.5지만 F1 점수는 0.18입니다.

이렇게 묶으면 한쪽을 버리고 다른 쪽만 끌어올린 시스템이 높은 점수를 받지 못합니다. 두 수가 모두 커야 F1 점수도 커집니다.

같은 이름을 쓰는 다른 정밀도

정밀도라는 낱말은 측정, 시계, 수를 담는 자료형에서도 쓰입니다. 세 곳 모두 앞에서 다룬 정밀도와 뜻이 다릅니다.

측정에서 정밀도는 같은 것을 여러 번 쟀을 때 값들이 서로 얼마나 가까이 모이는지를 말합니다. 잴 때마다 70.1킬로그램을 가리키는 체중계는 정밀합니다.

값이 참값에 얼마나 가까운지는 측정에서 정확도라고 합니다. 앞에서 본 정확도(판정이 맞은 비율)와는 다른 뜻입니다. 실제 몸무게가 72킬로그램이면 앞의 체중계는 정밀하지만 정확하지 않습니다.

시계에서 정밀도는 그 시계가 가를 수 있는 가장 작은 시간 폭입니다. 초 단위로만 재는 시계는 같은 초 안에서 일어난 두 일의 앞뒤를 가르지 못합니다.

컴퓨터끼리 시각을 맞추는 NTP(Network Time Protocol, 네트워크 시간 프로토콜)는 주고받는 패킷에 보내는 쪽 시계의 정밀도를 적어 보냅니다. 값은 2의 몇 제곱 초인지를 지수로 적습니다. -20 이면 2의 -20승 초, 곧 백만분의 1초쯤입니다.

수를 담는 자료형에서는 한 값을 몇 자리까지 담을 수 있는지를 정밀도라고 합니다. 부동소수점 수는 담을 수 있는 자릿수가 정해져 있어서 넘치는 자리를 버립니다. 버린 만큼 값이 어긋나는 일이 정밀도 손실입니다. 파이썬에서 0.1 + 0.2 를 계산하면 0.3이 아니라 0.30000000000000004가 나옵니다.

관련 항목

정밀도를 계산하는 판정 칸

혼동 행렬 · 참 양성 · 거짓 양성 · 거짓 음성 · 참 음성 · 오탐 · 미탐

정밀도와 나란히 보는 평가 지표

재현율 · 정밀도와 재현율 · 정확도 · F1 점수 · 조화평균 · 특이도 · 상위 k 정밀도 · 평균 정밀도 · 정밀도-재현율 곡선 · ROC 곡선 · AUC

정밀도를 움직이는 판정 기준

임계값 · 분류 · 이진 분류 · 분류기 · 결정 경계 · 레이블

정밀도로 성능을 재는 시스템

검색 · 검색 엔진 · 알림 · 스팸 필터 · 이상 탐지 · 추천 시스템 · 머신러닝 · 적합성

정밀도를 흐리게 만드는 문제

알림 피로 · 클래스 불균형 · 과적합 · 데이터 누수

정밀도라는 이름을 함께 쓰는 측정·수치 분야

해상도 · 오차 · 유효 숫자 · NTP · 부동소수점 · 정밀도 손실 · 배정밀도

다른 이름: precision · 양성 예측도