정확도
고친 사람 github-actions[bot]
정확도는 판정하는 프로그램이 얼마나 자주 맞혔는지 알려 줍니다. 사진 백 장을 가려서 아흔 장을 맞히면 정확도는 0.9입니다. 측정에서 쓰는 정확도는 뜻이 다릅니다. 이 항목은 판정 결과를 재는 정확도를 다룹니다.
쉽고 빠른 이해
정확도는 내린 판정 전체 가운데 맞은 판정의 비율입니다. 스팸 필터가 메일 백 통을 「스팸」과 「정상」으로 갈랐습니다. 그중 아흔다섯 통을 맞게 갈랐으면 정확도는 0.95입니다.
이 수가 있으면 판정 프로그램 여럿을 한 줄로 세워 견줄 수 있습니다. 계산이 쉽습니다. 뜻도 바로 와닿습니다. 그래서 가장 먼저 보는 성적표입니다.
- 판정을 하나씩 정답과 맞대 봅니다
- 맞은 판정을 셉니다
- 맞은 수를 판정 전체의 수로 나눕니다
대가는 드문 쪽을 놓쳐도 수가 높게 나온다는 점입니다. 거래 천 건 가운데 사기가 한 건이면 전부 「정상」이라고만 해도 정확도가 0.999입니다. 그래서 드문 것을 찾는 일에는 골라낸 것과 놓친 것을 따로 세는 지표를 함께 봅니다.
상세
사막 마을의 일기예보관이 일 년 내내 「내일은 맑음」이라고만 말합니다. 그 마을에 비가 오는 날은 일 년에 닷새뿐입니다. 예보가 맞은 날을 세어 보면 이 예보관은 거의 틀린 적이 없습니다. 그래도 우산이 필요한 날은 한 번도 알려 주지 않았습니다.
정확도는 판정 전체 가운데 맞은 판정의 비율입니다. 고양이 사진을 가리는 프로그램이 사진 백 장 가운데 아흔 장을 맞게 가렸다면 정확도는 90을 100으로 나눈 0.9입니다. 값은 0과 1 사이에 놓입니다. 1이면 한 번도 안 틀린 것입니다.
이 수가 있으면 판정 프로그램의 성적을 수 하나로 말할 수 있습니다. 같은 사진 묶음을 두 프로그램에 넣고 정확도를 견주면 어느 쪽이 더 자주 맞히는지 바로 보입니다. 머신러닝으로 새로 학습시킨 프로그램을 평가할 때 가장 먼저 보는 수도 대개 정확도입니다.
분류와 클래스
판정 결과가 정해진 갈래 가운데 하나인 일을 분류라고 합니다. 메일을 「스팸」과 「정상」으로 가르는 일이 분류입니다. 사진 속 동물이 고양이인지 개인지 가르는 일도 분류입니다. 정확도는 분류의 성적을 재는 지표입니다.
분류가 고르는 갈래 하나하나를 클래스라고 합니다. 객체지향의 클래스가 아니라 이 예의 「스팸」과 「정상」 같은 갈래입니다. 갈래가 둘이면 이진 분류, 셋 이상이면 다중 클래스 분류입니다. 정확도는 클래스가 몇 개든 같은 방식으로 셉니다.
맞았는지 가리려면 데이터마다 정답이 미리 적혀 있어야 합니다. 이 정답 표시가 레이블입니다. 사람이 메일을 한 통씩 읽고 「스팸」이나 「정상」을 달아 두는 식입니다. 정확도는 프로그램의 판정을 레이블과 하나씩 맞대어 셉니다.
네 칸으로 보는 정확도
클래스가 둘인 이진 분류에서는 결과를 두 물음으로 가릅니다. 첫째는 프로그램이 「해당한다」고 판정했나입니다. 둘째는 정말 해당하나입니다.
「해당한다」는 판정을 양성, 「아니다」라는 판정을 음성이라고 합니다. 판정이 맞았으면 앞에 「참」을, 틀렸으면 「거짓」을 붙입니다.
| 정말 해당한다 | 정말은 아니다 | |
|---|---|---|
| 해당한다고 판정 | 참 양성 | 거짓 양성 |
| 아니라고 판정 | 거짓 음성 | 참 음성 |
이 네 칸짜리 표가 혼동 행렬입니다. 판정이 맞은 칸은 대각선의 참 양성과 참 음성 둘입니다. 정확도는 이 두 칸의 수를 더해 네 칸 전체의 수로 나눈 값입니다.
코드로 세어 보겠습니다. 메일 다섯 통의 정답을 y 에, 필터의 판정을 pred 에 담았습니다. pred 는 예측(prediction)을 줄인 이름입니다. zip 은 두 목록에서 같은 순번의 값을 한 쌍씩 묶어 줍니다.
y = ["스팸", "정상", "정상", "스팸", "정상"]
pred = ["스팸", "정상", "스팸", "정상", "정상"]
ok = [a == b for a, b in zip(y, pred)]
sum(ok) # 3
sum(ok) / len(ok) # 0.6
ok 에는 쌍마다 맞았는지가 참과 거짓으로 담깁니다. sum 은 참을 1로, 거짓을 0으로 셉니다. 다섯 통 가운데 첫째·둘째·다섯째를 맞혔으니 정확도는 0.6입니다.
틀린 두 통은 성격이 다릅니다. 셋째는 정상 메일을 스팸으로 몬 거짓 양성입니다. 넷째는 스팸을 놓친 거짓 음성입니다. 정확도는 두 틀림을 가리지 않고 똑같이 하나로 셉니다.
1에서 정확도를 뺀 값은 틀린 판정의 비율입니다. 이 값이 오차율입니다. 위 예의 오차율은 0.4입니다.
드문 클래스 앞에서 무너지는 정확도
한 클래스가 다른 클래스보다 훨씬 드문 상태가 클래스 불균형입니다. 카드 거래 가운데 사기는 아주 드뭅니다. 서버 로그 가운데 장애 징후도 드뭅니다.
이때 정확도는 거의 아무것도 알려 주지 않습니다. 거래 천 건 가운데 사기가 한 건이라고 해 봅시다. 모든 거래를 「정상」이라고 판정하는 프로그램도 999건을 맞혀 정확도가 0.999입니다. 그 프로그램은 사기를 한 건도 못 잡았습니다.
첫머리의 예보관이 이 경우입니다. 맑은 날이 360일인 마을에서 「맑음」만 말하면 정확도는 360을 365로 나눈 0.986쯤입니다. 정작 알려야 할 비 오는 닷새는 전부 놓쳤습니다.
그래서 정확도는 늘 기준선과 견줘 읽습니다. 기준선은 데이터에서 가장 흔한 클래스만 계속 고르는 판정의 정확도입니다. 거래 예의 기준선은 0.999입니다. 정확도가 0.999인 사기 탐지 프로그램은 아무것도 안 하는 판정과 성적이 같습니다.
정밀도·재현율과 나눠 보기
정확도가 놓치는 것을 두 지표가 따로 셉니다. 둘 다 찾으려는 클래스 하나, 곧 양성 쪽에 눈을 둡니다.
정밀도는 프로그램이 「해당한다」고 고른 것 가운데 정말 해당하는 것의 비율입니다. 사기라고 고른 거래 열 건 가운데 여덟 건이 진짜 사기면 정밀도는 0.8입니다.
재현율은 정말 해당하는 것 가운데 프로그램이 찾아낸 것의 비율입니다. 진짜 사기 스무 건 가운데 다섯 건을 찾았으면 재현율은 0.25입니다. 앞의 「전부 정상」 프로그램은 재현율이 0입니다.
세 지표는 분모가 다릅니다. 무엇으로 나누느냐가 곧 무엇을 묻느냐입니다.
| 지표 | 분자 | 분모 | 묻는 것 |
|---|---|---|---|
| 정확도 | 참 양성 + 참 음성 | 판정 전체 | 얼마나 자주 맞혔나 |
| 정밀도 | 참 양성 | 참 양성 + 거짓 양성 | 고른 것을 믿어도 되나 |
| 재현율 | 참 양성 | 참 양성 + 거짓 음성 | 찾을 것을 빠짐없이 찾았나 |
표에서 분자에 참 음성이 들어가는 지표는 정확도뿐입니다. 참 음성은 「아니다」라고 맞힌 것입니다. 드문 것을 찾는 문제에서는 이 칸이 가장 커서 정확도를 끌어올립니다.
정확도로 견줘도 되는 경우
정확도를 믿으려면 두 조건이 맞아야 합니다. 첫째, 클래스마다 데이터 수가 크게 차이 나지 않아야 합니다. 둘째, 거짓 양성으로 틀렸을 때와 거짓 음성으로 틀렸을 때 치르는 대가가 비슷해야 합니다.
둘째 조건은 틀림마다 치르는 대가가 다를 수 있어서 생깁니다. 암 검진에서 건강한 사람을 다시 검사하게 하는 것은 번거로운 일로 끝납니다. 환자를 건강하다고 돌려보내면 치료 시기를 놓칩니다. 정확도는 이 둘을 똑같이 틀림 하나로 셉니다.
두 조건 가운데 하나라도 어긋나면 정밀도와 재현율을 함께 봅니다. 두 수를 하나로 묶어야 할 때는 F1 점수를 씁니다. F1 점수는 두 수의 조화평균(Harmonic mean)입니다. 조화평균은 두 수 가운데 작은 쪽으로 크게 끌려 내려가는 평균입니다. 그래서 두 수가 모두 커야 F1 점수도 커집니다.
클래스마다 맞힌 비율을 따로 구해 평균 내는 균형 정확도도 이럴 때 씁니다.
학습에 안 쓴 데이터로 재는 정확도
머신러닝 프로그램은 레이블이 붙은 데이터를 보고 판정 기준을 배웁니다. 이 과정을 학습이라고 합니다. 학습에 쓴 데이터로 정확도를 재면 값이 부풀기 쉽습니다. 이미 본 문제의 답을 외워서 맞힐 수 있기 때문입니다.
그래서 데이터 일부를 떼어 두고 학습에 쓰지 않습니다. 이렇게 떼어 둔 데이터가 테스트 세트입니다. 프로그램의 성적으로 내놓는 정확도는 이 테스트 세트에서 잰 값입니다.
학습 데이터에서 잰 정확도와 테스트 세트에서 잰 정확도가 크게 벌어지면 과적합을 의심합니다. 학습 데이터에서는 0.99, 테스트 세트에서는 0.7이 나오는 경우입니다. 프로그램이 판정 기준을 배운 것이 아니라 학습 데이터를 외운 것입니다.
측정에서 말하는 정확도
측정에서 정확도는 잰 값이 참값에 얼마나 가까운지를 말합니다. 참값과 잰 값의 차이가 오차입니다. 오차가 작을수록 정확합니다.
실제 몸무게가 72킬로그램인 사람을 쟀을 때 72.0 근처를 가리키는 체중계는 정확합니다. 판정이 맞은 비율을 말하는 앞의 정확도와는 다른 뜻입니다.
측정에서는 정확도와 정밀도를 짝으로 씁니다. 측정의 정밀도는 같은 것을 여러 번 쟀을 때 값들이 서로 얼마나 가까이 모이는지입니다. 앞에서 본 분류의 정밀도와도 뜻이 다릅니다. 잴 때마다 70.1킬로그램을 가리키는 체중계는 정밀하지만 정확하지 않습니다.
관련 항목
정확도를 계산하는 판정 칸
혼동 행렬 · 참 양성 · 참 음성 · 거짓 양성 · 거짓 음성
정확도와 나란히 보는 평가 지표
정밀도 · 재현율 · 정밀도와 재현율 · F1 점수 · 조화평균 · 균형 정확도 · 오차율 · 특이도 · 상위 k 정확도 · ROC 곡선 · AUC · 로그 손실
정확도로 성적을 재는 판정 작업
분류 · 이진 분류 · 다중 클래스 분류 · 분류기 · 스팸 필터 · 이상 탐지 · 사기 탐지 · 머신러닝
정확도를 재는 평가 절차
레이블 · 테스트 세트 · 검증 세트 · 교차 검증 · 기준선 · 임계값
정확도를 흐리게 만드는 문제
정확도라는 이름을 함께 쓰는 측정 분야
오차 · 참값 · 유효 숫자 · 해상도 · 측정 불확도
다른 이름: accuracy · 분류 정확도