오차율
고친 사람 github-actions[bot]
오차율은 판정하는 프로그램이 얼마나 자주 틀렸는지 알려 줍니다. 사진 백 장을 가려서 열 장을 틀리면 오차율은 0.1입니다. 측정에서 쓰는 오차율은 뜻이 다릅니다. 이 항목은 판정 결과를 재는 오차율을 다룹니다.
쉽고 빠른 이해
오차율은 내린 판정 전체 가운데 틀린 판정의 비율입니다. 스팸 필터가 메일 백 통을 「스팸」과 「정상」으로 갈랐습니다. 그중 다섯 통을 잘못 갈랐으면 오차율은 0.05입니다.
맞힌 비율인 정확도를 1에서 빼면 같은 값이 나옵니다. 그래도 틀린 쪽을 세는 까닭이 있습니다. 이미 잘 맞히는 프로그램끼리 견줄 때 차이가 또렷하게 보입니다.
정확도 0.95와 0.99는 비슷해 보입니다. 틀린 쪽으로 보면 0.05와 0.01이라 틀림이 5분의 1로 줄었습니다.
- 판정을 하나씩 정답과 맞대 봅니다
- 틀린 판정을 셉니다
- 틀린 수를 판정 전체의 수로 나눕니다
대가는 틀림의 종류를 가리지 않는다는 점입니다. 정상 메일을 스팸으로 몬 것과 스팸을 놓친 것을 똑같이 하나로 셉니다.
드문 쪽을 하나도 못 찾아도 오차율은 낮게 나올 수 있습니다. 거래 천 건 가운데 사기가 한 건이라고 해 봅시다. 전부 「정상」이라고 판정하면 사기를 하나도 못 잡았는데도 오차율은 0.001입니다.
상세
받아쓰기 시험지를 채점하는 선생님을 떠올려 봅시다. 스무 문제 가운데 빨간 줄이 그어진 문제가 둘입니다. 이 학생은 열 문제에 하나꼴로 틀렸습니다.
오차율은 판정 전체 가운데 틀린 판정의 비율입니다. 영어로는 error rate 라고 합니다. 틀린 분류의 비율이라 오분류율이라고도 부릅니다. 고양이 사진을 가리는 프로그램이 사진 백 장 가운데 열 장을 잘못 가렸다면 오차율은 10을 100으로 나눈 0.1입니다.
값은 0과 1 사이에 놓입니다. 퍼센트로 적기도 합니다. 0이면 한 번도 안 틀린 것입니다.
오차율은 정확도와 한 쌍입니다. 정확도는 맞힌 판정의 비율입니다. 판정은 맞거나 틀리거나 둘 중 하나이므로 두 값을 더하면 언제나 1입니다. 정확도가 0.9인 프로그램의 오차율은 0.1입니다.
틀린 쪽을 세는 까닭
두 값이 서로를 정하는데도 오차율을 따로 쓰는 것은 개선 폭이 잘 보이기 때문입니다. 정확도 0.95인 프로그램을 고쳐서 0.99가 됐다고 해 봅시다. 맞힌 비율로는 0.04가 늘었을 뿐이라 작은 변화처럼 읽힙니다.
같은 변화를 오차율로 보면 0.05에서 0.01이 됐습니다. 백 번에 다섯 번 틀리던 것이 백 번에 한 번만 틀립니다. 틀림이 5분의 1로 줄었다는 말이 바로 나옵니다. 이미 잘 맞히는 프로그램끼리 견줄수록 이 차이가 커집니다.
머신러닝 논문과 발표가 성적을 「오차율 몇 퍼센트」로 적는 일이 많은 것도 이 때문입니다. 서로 다른 방법을 같은 시험 데이터에 돌려 오차율을 표 하나에 늘어놓으면 어느 방법이 덜 틀리는지 한눈에 보입니다.
분류와 레이블
판정 결과가 정해진 갈래 가운데 하나인 일을 분류라고 합니다. 메일을 「스팸」과 「정상」으로 가르는 일이 분류입니다. 이 갈래를 클래스라고도 부릅니다. 오차율은 분류의 성적을 재는 지표입니다.
틀렸는지 가리려면 데이터마다 정답이 미리 적혀 있어야 합니다. 이 정답 표시가 레이블입니다. 사람이 메일을 한 통씩 읽고 「스팸」이나 「정상」을 달아 두는 식입니다. 오차율은 프로그램의 판정을 레이블과 하나씩 맞대어 셉니다.
집값처럼 숫자를 맞히는 일은 사정이 다릅니다. 이런 일을 회귀라고 합니다. 집값을 3억 1백만 원으로 맞혔는데 정답이 3억 원이면 틀렸다고 하기 어렵습니다. 그래서 회귀에서는 오차율 대신 빗나간 거리를 재는 평균 제곱 오차 같은 지표를 씁니다.
코드로 세는 오차율
메일 다섯 통으로 직접 세어 보겠습니다. 정답을 y 에, 필터의 판정을 p 에 담았습니다. zip 은 두 목록에서 같은 순번의 값을 한 쌍씩 묶어 줍니다.
y = ["스팸", "정상", "정상", "스팸", "정상"]
p = ["스팸", "정상", "스팸", "정상", "정상"]
bad = [a != b for a, b in zip(y, p)]
sum(bad) # 2
sum(bad) / len(bad) # 0.4
bad 에는 쌍마다 틀렸는지가 참과 거짓으로 담깁니다. sum 은 참을 1로, 거짓을 0으로 셉니다. 다섯 통 가운데 셋째와 넷째가 틀렸으니 오차율은 0.4입니다.
판정 하나마다 맞으면 0점, 틀리면 1점을 매기는 방식을 0-1 손실이라고 합니다. 위 코드의 bad 가 그 점수입니다. 오차율은 이 점수를 판정 전체에 걸쳐 평균 낸 값입니다.
혼동 행렬로 보는 오차율
스팸 필터처럼 갈래가 둘인 분류에서는 결과를 두 물음으로 가릅니다. 첫째는 필터가 「스팸이다」라고 판정했나입니다. 둘째는 그 메일이 정말 스팸인가입니다.
찾으려는 쪽, 곧 「스팸이다」라는 판정을 양성이라고 합니다. 「스팸이 아니다」라는 판정은 음성입니다.
판정이 맞았으면 이름 앞에 「참」을, 틀렸으면 「거짓」을 붙입니다. 정상 메일을 스팸으로 몬 것은 틀린 양성 판정이라 거짓 양성입니다. 스팸을 정상으로 흘려보낸 것은 틀린 음성 판정이라 거짓 음성입니다.
| 정말 스팸 | 정말은 정상 | |
|---|---|---|
| 스팸이라고 판정 | 참 양성 | 거짓 양성 |
| 정상이라고 판정 | 거짓 음성 | 참 음성 |
이 네 칸짜리 표가 혼동 행렬입니다. 틀린 판정은 대각선 밖의 두 칸, 거짓 양성과 거짓 음성입니다. 오차율은 이 두 칸의 수를 더해 네 칸 전체의 수로 나눈 값입니다.
앞 코드의 메일로 보면 셋째는 거짓 양성이고 넷째는 거짓 음성입니다. 성격이 다른 두 틀림이 오차율에서는 똑같이 하나씩 더해집니다.
훈련 오차율과 테스트 오차율
머신러닝 프로그램은 레이블이 붙은 데이터를 보고 판정 기준을 배웁니다. 이때 쓰는 데이터가 훈련 데이터입니다. 거기서 잰 오차율이 훈련 오차율입니다. 훈련 데이터는 이미 본 문제라 답을 외워서도 맞힐 수 있습니다. 그래서 훈련 오차율은 실력보다 좋게 나오기 쉽습니다.
실력을 재려면 데이터 일부를 떼어 두고 학습에 쓰지 않습니다. 이렇게 떼어 둔 데이터가 테스트 세트입니다. 거기서 잰 오차율이 테스트 오차율입니다.
처음 보는 데이터에서도 비슷하게 맞히는 성질을 일반화라고 합니다. 테스트 오차율이 그 성질을 재는 수입니다.
두 오차율을 나란히 놓으면 프로그램의 상태가 보입니다. 훈련 데이터를 외웠을 뿐 새 데이터에서 무너지는 상태가 과적합입니다. 훈련 오차율은 낮은데 테스트 오차율이 훨씬 높게 나옵니다.
반대로 훈련 데이터에서조차 덜 배운 상태가 과소적합입니다. 이때는 훈련 오차율부터 높습니다. 아래 그림은 두 오차율로 이 상태를 가리는 순서입니다.
flowchart TD
A["훈련 오차율이 높다"] -->|그렇다| B["과소적합"]
A -->|아니다| C["테스트 오차율이 훨씬 높다"]
C -->|그렇다| D["과적합"]
C -->|아니다| E["일반화가 됐다"]
훈련 오차율이 0.01이고 테스트 오차율이 0.30이면 과적합을 의심합니다. 둘 다 0.30이면 과소적합입니다. 둘 다 0.03 근처면 잘 일반화한 것입니다.
교차 검증으로 재는 오차율
테스트 세트 하나로 잰 오차율은 어떤 데이터가 그 묶음에 들어갔느냐에 따라 흔들립니다. 운 좋게 쉬운 문제만 테스트 세트에 들어가면 오차율이 낮게 나옵니다.
교차 검증은 이 흔들림을 줄입니다. 데이터를 다섯 조각으로 나누고 한 조각을 테스트용으로 떼어 둡니다. 나머지 넷으로 학습시킨 뒤 뗀 조각에서 오차율을 잽니다. 떼는 조각을 바꿔 가며 다섯 번 되풀이합니다.
그러면 오차율이 다섯 개 나옵니다. 0.10, 0.12, 0.08, 0.11, 0.09가 나왔다면 평균인 0.10을 그 방법의 오차율로 씁니다. 다섯 값이 얼마나 퍼졌는지도 함께 보면 이 숫자를 얼마나 믿을지 가늠할 수 있습니다.
낮은 오차율이 가리는 것
한 갈래가 다른 갈래보다 훨씬 드문 상태가 클래스 불균형입니다. 카드 거래 가운데 사기는 아주 드뭅니다. 서버 로그 가운데 장애 징후도 드뭅니다.
이때 오차율은 거의 아무것도 알려 주지 않습니다. 거래 천 건 가운데 사기가 한 건이라고 해 봅시다. 모든 거래를 「정상」이라고 판정하는 프로그램도 오차율이 0.001입니다. 그 프로그램은 사기를 한 건도 못 잡았습니다.
그래서 오차율은 늘 기준선과 견줘 읽습니다. 기준선은 데이터에서 가장 흔한 갈래만 계속 고르는 판정의 성적입니다. 거래 예에서는 그 오차율이 0.001입니다. 오차율 0.001인 사기 탐지 프로그램은 아무것도 안 하는 판정과 성적이 같습니다.
틀림의 종류마다 치르는 대가가 다를 때도 오차율만으로는 모자랍니다. 암 검진에서 건강한 사람을 환자로 판정한 거짓 양성은 다시 검사하는 번거로움으로 끝납니다. 환자를 건강하다고 돌려보낸 거짓 음성은 치료 시기를 놓치게 합니다.
이럴 때는 두 틀림을 따로 세는 지표를 함께 봅니다. 재현율은 정말 환자인 사람 가운데 환자로 찾아낸 비율이라 거짓 음성이 늘면 떨어집니다. 정밀도는 환자로 판정한 사람 가운데 정말 환자인 비율이라 거짓 양성이 늘면 떨어집니다.
갈래가 많을 때의 상위 k 오차율
사진 속 물체를 천 가지 갈래 가운데 하나로 가르는 일을 생각해 봅시다. 갈래가 셋 이상인 분류를 다중 클래스 분류라고 합니다. 갈래가 많으면 고양이 품종 둘처럼 사람이 봐도 헷갈리는 갈래가 섞입니다.
이럴 때는 프로그램이 후보를 몇 개까지 내게 합니다. 그 안에 정답이 있으면 맞힌 것으로 칩니다. 후보 수를 k 라 두면, 후보 k 개 안에 정답이 없을 때만 틀린 것으로 세는 값이 상위 k 오차율입니다.
후보를 다섯 내게 하면 상위 5 오차율입니다. 후보를 하나만 내게 하는 보통의 오차율은 상위 1 오차율인 셈입니다.
측정에서 말하는 오차율
측정에서 오차율은 잰 값이 참값에서 얼마나 벗어났는지를 비율로 나타낸 것입니다. 잰 값과 참값의 차이가 오차입니다. 오차를 참값으로 나눈 값이 오차율입니다. 퍼센트로 적을 때는 여기에 100을 곱합니다.
실제 몸무게가 72킬로그램인 사람을 쟀더니 체중계가 73.44킬로그램을 가리켰습니다. 오차는 1.44킬로그램입니다. 이것을 72로 나눈 0.02가 이 체중계의 오차율입니다. 퍼센트로 적으면 100을 곱해 2가 됩니다.
이 값은 상대 오차라고도 부릅니다. 틀린 판정의 비율을 말하는 앞의 오차율과는 셈법도 뜻도 다릅니다. 측정의 오차율은 한 번 잰 값 하나에 대해 나옵니다. 판정의 오차율은 판정을 여럿 모아야 나옵니다.
서비스 운영에서 말하는 오류율도 이름이 비슷합니다. 받은 요청 가운데 실패한 요청의 비율이라 정답과 맞대 보는 판정이 없습니다. 영어로는 둘 다 error rate 라서 문맥으로 가려 읽습니다.
관련 항목
오차율과 나란히 보는 평가 지표
정확도 · 정밀도 · 재현율 · 정밀도와 재현율 · F1 점수 · 균형 정확도 · 특이도 · 상위 k 정확도 · 로그 손실 · ROC 곡선 · AUC
오차율을 계산하는 판정 칸
혼동 행렬 · 참 양성 · 참 음성 · 거짓 양성 · 거짓 음성 · 0-1 손실 · 손실 함수
오차율로 성적을 재는 판정 작업
분류 · 이진 분류 · 다중 클래스 분류 · 분류기 · 스팸 필터 · 사기 탐지 · 이상 탐지 · 머신러닝
오차율을 재는 평가 절차
레이블 · 훈련 데이터 · 테스트 세트 · 검증 세트 · 교차 검증 · 기준선 · 홀드아웃
두 오차율의 차이로 진단하는 상태
과적합 · 과소적합 · 일반화 · 일반화 오차 · 편향과 분산 · 데이터 누수 · 클래스 불균형
오차율 대신 숫자 맞히기에 쓰는 지표
회귀 · 평균 제곱 오차 · 평균 절대 오차 · 결정 계수
오차율과 이름이 겹치는 이웃 지표
오류율 · 실패율 · 비트 오류율 · 단어 오류율
오차율이라는 이름을 함께 쓰는 측정 분야
오차 · 상대 오차 · 절대 오차 · 참값 · 측정 불확도 · 유효 숫자
다른 이름: misclassification rate · 오분류율 · 분류 오차율