사전 정확도
개념

정확도

gabury1고친 사람 github-actions[bot]

정확도는 판정하는 프로그램이 얼마나 자주 맞혔는지 알려 줍니다. 사진 백 장을 가려서 아흔 장을 맞히면 정확도는 0.9입니다. 측정에서 쓰는 정확도는 뜻이 다릅니다. 이 항목은 판정 결과를 재는 정확도를 다룹니다.

쉽고 빠른 이해

정확도는 내린 판정 전체 가운데 맞은 판정의 비율입니다. 스팸 필터가 메일 백 통을 「스팸」과 「정상」으로 갈랐습니다. 그중 아흔다섯 통을 맞게 갈랐으면 정확도는 0.95입니다.

이 수가 있으면 판정 프로그램 여럿을 한 줄로 세워 견줄 수 있습니다. 계산이 쉽습니다. 뜻도 바로 와닿습니다. 그래서 가장 먼저 보는 성적표입니다.

  1. 판정을 하나씩 정답과 맞대 봅니다
  2. 맞은 판정을 셉니다
  3. 맞은 수를 판정 전체의 수로 나눕니다

대가는 드문 쪽을 놓쳐도 수가 높게 나온다는 점입니다. 거래 천 건 가운데 사기가 한 건이면 전부 「정상」이라고만 해도 정확도가 0.999입니다. 그래서 드문 것을 찾는 일에는 골라낸 것과 놓친 것을 따로 세는 지표를 함께 봅니다.

상세

사막 마을의 일기예보관이 일 년 내내 「내일은 맑음」이라고만 말합니다. 그 마을에 비가 오는 날은 일 년에 닷새뿐입니다. 예보가 맞은 날을 세어 보면 이 예보관은 거의 틀린 적이 없습니다. 그래도 우산이 필요한 날은 한 번도 알려 주지 않았습니다.

정확도는 판정 전체 가운데 맞은 판정의 비율입니다. 고양이 사진을 가리는 프로그램이 사진 백 장 가운데 아흔 장을 맞게 가렸다면 정확도는 90을 100으로 나눈 0.9입니다. 값은 0과 1 사이에 놓입니다. 1이면 한 번도 안 틀린 것입니다.

이 수가 있으면 판정 프로그램의 성적을 수 하나로 말할 수 있습니다. 같은 사진 묶음을 두 프로그램에 넣고 정확도를 견주면 어느 쪽이 더 자주 맞히는지 바로 보입니다. 머신러닝으로 새로 학습시킨 프로그램을 평가할 때 가장 먼저 보는 수도 대개 정확도입니다.

분류와 클래스

판정 결과가 정해진 갈래 가운데 하나인 일을 분류라고 합니다. 메일을 「스팸」과 「정상」으로 가르는 일이 분류입니다. 사진 속 동물이 고양이인지 개인지 가르는 일도 분류입니다. 정확도는 분류의 성적을 재는 지표입니다.

분류가 고르는 갈래 하나하나를 클래스라고 합니다. 객체지향의 클래스가 아니라 이 예의 「스팸」과 「정상」 같은 갈래입니다. 갈래가 둘이면 이진 분류, 셋 이상이면 다중 클래스 분류입니다. 정확도는 클래스가 몇 개든 같은 방식으로 셉니다.

맞았는지 가리려면 데이터마다 정답이 미리 적혀 있어야 합니다. 이 정답 표시가 레이블입니다. 사람이 메일을 한 통씩 읽고 「스팸」이나 「정상」을 달아 두는 식입니다. 정확도는 프로그램의 판정을 레이블과 하나씩 맞대어 셉니다.

네 칸으로 보는 정확도

클래스가 둘인 이진 분류에서는 결과를 두 물음으로 가릅니다. 첫째는 프로그램이 「해당한다」고 판정했나입니다. 둘째는 정말 해당하나입니다.

「해당한다」는 판정을 양성, 「아니다」라는 판정을 음성이라고 합니다. 판정이 맞았으면 앞에 「참」을, 틀렸으면 「거짓」을 붙입니다.

정말 해당한다 정말은 아니다
해당한다고 판정 참 양성 거짓 양성
아니라고 판정 거짓 음성 참 음성

이 네 칸짜리 표가 혼동 행렬입니다. 판정이 맞은 칸은 대각선의 참 양성과 참 음성 둘입니다. 정확도는 이 두 칸의 수를 더해 네 칸 전체의 수로 나눈 값입니다.

코드로 세어 보겠습니다. 메일 다섯 통의 정답을 y 에, 필터의 판정을 pred 에 담았습니다. pred 는 예측(prediction)을 줄인 이름입니다. zip 은 두 목록에서 같은 순번의 값을 한 쌍씩 묶어 줍니다.

Python
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 · 분류 정확도