사전 혼동 행렬
개념

혼동 행렬

gabury1고친 사람 github-actions[bot]

혼동 행렬은 판정하는 프로그램이 무엇을 무엇으로 착각했는지 세어서 보여 줍니다. 정답과 판정을 짝지어 짝마다 몇 번 나왔는지 표에 적습니다. 맞힌 횟수만 봐서는 가려지는 틀림의 종류가 이 표에서 드러납니다.

쉽고 빠른 이해

혼동 행렬은 판정 결과를 「정답은 무엇이었나」와 「프로그램은 무엇이라고 했나」로 갈라 센 표입니다. 스팸 필터가 스팸 40통 가운데 36통을 잡았습니다. 놓친 스팸은 4통입니다.

정상 메일 60통 가운데 51통은 정상으로 두었습니다. 나머지 9통은 스팸으로 몰았습니다. 36·4·9·51 네 수를 칸 넷에 나눠 적은 것이 혼동 행렬입니다.

이 표가 없으면 틀림이 어느 쪽으로 났는지 모릅니다. 스팸을 놓치는 것과 정상 메일을 버리는 것은 겪는 불편이 다릅니다. 맞힌 비율 하나로는 둘이 똑같은 틀림 하나로 섞입니다.

  1. 판정 하나하나를 정답과 짝짓습니다
  2. 짝마다 해당하는 칸의 수를 하나씩 올립니다
  3. 스팸을 스팸으로, 정상을 정상으로 판정한 두 칸(36·51)이 맞힌 수입니다. 나머지 두 칸(9·4)은 틀린 수입니다

대가는 수 하나가 아니라 표라는 점입니다. 두 필터 가운데 어느 쪽이 나은지 한 줄로 세우기 어렵습니다. 그래서 칸을 묶어 정밀도나 재현율 같은 수 하나로 줄여 씁니다.

상세

선생님이 받아쓰기 시험지를 채점하며 틀린 글자를 따로 적어 둡니다. 「ㅐ」를 「ㅔ」로 쓴 아이가 몇 명이고 「ㅔ」를 「ㅐ」로 쓴 아이가 몇 명인지 셉니다. 어느 글자를 어느 글자로 헷갈렸는지가 이 기록에 남습니다.

혼동 행렬은 판정 결과를 정답과 판정 두 축으로 갈라 센 표입니다. 한 축에는 정답을, 다른 축에는 프로그램의 판정을 늘어놓습니다. 칸 하나에는 「정답이 이것이었는데 이것으로 판정한 횟수」가 들어갑니다.

이름의 「혼동」은 프로그램이 어느 갈래를 어느 갈래로 헷갈렸는지 보여 준다는 뜻입니다. 「행렬」은 이 표가 가로줄과 세로줄로 수를 늘어놓은 모양이라서 붙었습니다. 한국어 교재에서는 「오차 행렬」이라고도 부릅니다.

분류와 클래스

혼동 행렬이 성적을 매기는 일은 분류입니다. 분류는 입력 하나를 정해진 갈래 가운데 하나로 가르는 일입니다. 메일을 「스팸」과 「정상」으로 가르는 일이 분류입니다.

분류가 고르는 갈래 하나하나를 클래스라고 합니다. 객체지향의 클래스가 아니라 「스팸」과 「정상」 같은 갈래를 말합니다. 혼동 행렬의 가로줄과 세로줄은 이 클래스들로 이름이 붙습니다.

판정을 채점하려면 데이터마다 정답이 미리 달려 있어야 합니다. 이 정답 표시가 레이블입니다. 예를 들어 사람이 메일을 한 통씩 읽고 「스팸」이나 「정상」을 달아 둡니다. 혼동 행렬은 프로그램의 판정을 레이블과 하나씩 맞대어 채웁니다.

클래스가 둘일 때의 네 칸

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

첫째 물음의 답에는 이름이 붙습니다. 「해당한다」는 판정을 양성, 「아니다」라는 판정을 음성이라고 합니다. 스팸 필터에서는 「스팸이다」가 양성입니다. 그래서 해당하는 쪽 클래스인 스팸을 양성 클래스라고 부릅니다.

판정이 정답과 맞았는지는 그 이름 앞에 붙습니다. 맞았으면 「참」을, 틀렸으면 「거짓」을 붙입니다. 칸 이름 하나에 「맞았나」와 「무엇이라고 판정했나」가 차례로 들어갑니다.

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

스팸 필터에 대 보면 네 칸은 이렇습니다.

  • 참 양성은 스팸을 스팸이라고 잡은 것입니다
  • 거짓 양성은 아닌 것을 해당한다고 잘못 고른 것입니다. 정상 메일을 스팸으로 모는 경우입니다
  • 거짓 음성은 해당하는 것을 놓친 것입니다. 스팸이 받은편지함에 들어오는 경우입니다
  • 참 음성은 정상 메일을 정상으로 둔 것입니다

스팸 필터가 스팸 40통 가운데 36통을 잡았습니다. 나머지 4통은 놓쳤습니다. 정상 메일 60통 가운데 9통은 스팸으로 몰았습니다. 51통은 정상으로 두었습니다.

정말 스팸 정말 정상
스팸이라고 판정 36 9
정상이라고 판정 4 51

왼쪽 위에서 오른쪽 아래로 내려가는 대각선 두 칸이 맞힌 판정입니다. 나머지 두 칸이 틀린 판정입니다. 네 칸을 모두 더하면 판정한 메일 전체인 100통이 나옵니다.

코드로 세어 보기

혼동 행렬을 채우는 일은 짝의 개수를 세는 일입니다. 아래는 메일 다섯 통의 정답을 y 에, 필터의 판정을 pred 에 담은 예입니다. pred 는 예측(prediction)을 줄인 이름입니다.

zip 은 두 목록에서 같은 순번의 값을 한 쌍씩 묶습니다. Counter 는 같은 값이 몇 번 나왔는지 세어 두는 사전입니다. 둘을 이으면 「(정답, 판정)」 짝마다 개수가 나옵니다.

Python
from collections import Counter

y    = ["스팸", "정상", "정상", "스팸", "정상"]
pred = ["스팸", "정상", "스팸", "정상", "정상"]
cm = Counter(zip(y, pred))
cm[("스팸", "스팸")]  # 1  참 양성
cm[("정상", "스팸")]  # 1  거짓 양성
cm[("스팸", "정상")]  # 1  거짓 음성
cm[("정상", "정상")]  # 2  참 음성

cm 의 키는 앞이 정답이고 뒤가 판정입니다. 다섯 통 가운데 셋째는 정상 메일을 스팸으로 몰아 거짓 양성 칸에 들어갔습니다. 넷째는 스팸을 놓쳐 거짓 음성 칸에 들어갔습니다.

칸을 묶어 계산하는 지표

혼동 행렬의 네 칸을 어떻게 묶느냐에 따라 여러 성적이 나옵니다. 성적 하나하나를 지표라고 합니다. 자주 쓰는 지표 넷의 뜻부터 봅니다. 계산은 뒤의 표에 모읍니다.

정확도는 전체 판정 가운데 맞힌 비율입니다. 「얼마나 자주 맞히나」에 답합니다.

정밀도는 스팸이라고 고른 메일 가운데 진짜 스팸의 비율입니다. 「스팸함에 든 메일을 믿어도 되나」에 답합니다.

재현율은 진짜 스팸 가운데 잡아낸 비율입니다. 「스팸을 얼마나 빠뜨리지 않았나」에 답합니다.

특이도는 정상 메일 가운데 정상으로 둔 비율입니다. 「정상 메일을 얼마나 지켜 냈나」에 답합니다.

지표 계산 스팸 필터의 값
정확도 (참 양성 + 참 음성) ÷ 전체 87 ÷ 100 = 0.87
정밀도 참 양성 ÷ (참 양성 + 거짓 양성) 36 ÷ 45 = 0.8
재현율 참 양성 ÷ (참 양성 + 거짓 음성) 36 ÷ 40 = 0.9
특이도 참 음성 ÷ (참 음성 + 거짓 양성) 51 ÷ 60 = 0.85

표를 보면 네 지표의 분모가 모두 다릅니다. 정밀도는 스팸이라고 고른 45통으로 나눕니다. 재현율은 진짜 스팸 40통으로 나눕니다.

네 지표는 모두 같은 네 수에서 나옵니다. 그래서 혼동 행렬을 적어 두면 어느 지표든 나중에 다시 계산할 수 있습니다. 거꾸로 지표 하나만 적어 두면 네 수를 되살릴 수 없습니다.

정밀도와 재현율을 수 하나로 묶을 때는 F1 점수를 흔히 씁니다. F1 점수는 두 수의 조화평균(Harmonic mean)입니다. 스팸 필터라면 2 × 0.8 × 0.9 ÷ (0.8 + 0.9)로 약 0.85가 나옵니다.

조화평균은 두 수 가운데 작은 쪽으로 끌려 내려가는 평균입니다. 정밀도가 1이고 재현율이 0.1이면 보통의 평균은 0.55입니다. 조화평균은 약 0.18에 그칩니다. 그래서 두 수 가운데 한쪽만 높은 프로그램은 F1 점수가 낮게 나옵니다.

정확도가 가리는 틀림

한 클래스가 다른 클래스보다 훨씬 드문 상태를 클래스 불균형이라고 합니다. 카드 거래 가운데 사기는 아주 드뭅니다. 예를 들어 거래 1000건 가운데 사기가 1건뿐인 데이터가 있습니다.

이 데이터를 모든 거래를 「정상」이라고만 판정하는 프로그램에 넣습니다. 1000건 가운데 999건을 맞혔으니 정확도는 0.999입니다. 수만 보면 거의 틀리지 않는 프로그램입니다.

정말 사기 정말 정상
사기라고 판정 0 0
정상이라고 판정 1 999

혼동 행렬을 펴면 사정이 바로 보입니다. 참 양성 칸이 0입니다. 이 프로그램은 사기를 한 건도 잡지 못했습니다. 재현율은 0입니다. 정확도 하나로는 안 보이던 틀림이 칸을 나누자 드러났습니다.

클래스가 셋 이상일 때

클래스가 셋 이상인 분류를 다중 클래스 분류라고 합니다. 이때 혼동 행렬은 클래스 수만큼 가로줄과 세로줄을 가집니다. 클래스가 셋이면 칸이 아홉입니다.

사진 속 동물을 고양이·개·여우 셋으로 가르는 프로그램이 있습니다. 아래 표는 동물마다 사진 30장씩을 판정한 결과입니다. 가로줄은 판정입니다. 세로줄은 정답입니다.

정말 고양이 정말 개 정말 여우
고양이라고 판정 27 1 2
개라고 판정 2 28 10
여우라고 판정 1 1 18

대각선 칸이 맞힌 사진입니다. 대각선 밖의 칸은 무엇을 무엇으로 착각했는지 알려 줍니다. 이 표에서 가장 큰 틀림은 여우 사진 10장을 개로 판정한 칸입니다.

표를 보면 이 프로그램이 여우와 개를 헷갈린다는 것까지 압니다. 그래서 다음에 고칠 곳이 정해집니다. 예를 들어 여우 사진을 더 모아 다시 학습시킬 수 있습니다.

클래스마다 정밀도와 재현율을 따로 셀 수도 있습니다. 여우의 재현율은 「정말 여우」 세로줄에서 맞힌 18을 30으로 나눈 0.6입니다. 여우의 정밀도는 「여우라고 판정」 가로줄에서 맞힌 18을 20으로 나눈 0.9입니다.

가로줄과 세로줄을 놓는 방향

이 항목은 가로줄에 판정을, 세로줄에 정답을 놓았습니다. 가로줄에 정답을, 세로줄에 판정을 놓는 표도 흔합니다. 교재와 라이브러리마다 이 방향이 갈립니다. 양성 클래스를 첫째 줄에 두는지 마지막 줄에 두는지도 갈립니다.

방향이 바뀌면 같은 수가 다른 칸에 들어갑니다. 거짓 양성과 거짓 음성을 뒤바꿔 읽기 쉽습니다. 남이 만든 혼동 행렬을 읽을 때는 축 이름부터 확인합니다.

임계값에 따라 달라지는 표

많은 분류 프로그램은 입력마다 점수를 매긴 뒤 선 하나를 넘는 것만 양성으로 판정합니다. 이 선이 임계값입니다. 예를 들어 스팸 점수가 0.7을 넘는 메일만 스팸함으로 보냅니다.

혼동 행렬 하나는 임계값 하나에서 나온 결과입니다. 임계값을 0.7에서 0.5로 내리면 스팸으로 고르는 메일이 늘어납니다. 참 양성과 거짓 양성이 함께 늘어납니다. 거짓 음성은 줄어듭니다.

임계값을 여러 개로 바꿔 가며 혼동 행렬을 매번 만들 수 있습니다. 행렬마다 비율 두 개를 뽑아 점 하나로 찍습니다. 점들을 이으면 곡선이 하나 나옵니다. 어느 비율 둘을 뽑느냐에 따라 곡선이 갈립니다.

거짓 양성률은 정말 정상인 메일 가운데 스팸으로 잘못 고른 비율입니다. 앞의 스팸 필터라면 9 ÷ 60 = 0.15입니다. 특이도와 더하면 1이 됩니다.

ROC 곡선은 가로축에 거짓 양성률을, 세로축에 재현율을 놓고 그립니다. ROC 는 Receiver Operating Characteristic 의 줄임말로 「수신기 작동 특성」이라는 뜻입니다. 레이더 수신기가 신호를 얼마나 잘 가려내는지 재던 데서 이름이 왔습니다.

정밀도-재현율 곡선은 가로축에 재현율을, 세로축에 정밀도를 놓고 그립니다. 두 곡선 모두 임계값 하나를 고르기 전에 여러 임계값의 성적을 한 번에 비교하게 해 줍니다.

칸을 가리키는 다른 이름

같은 칸을 분야마다 다른 이름으로 부릅니다. 뜻은 모두 같습니다.

칸 운영에서 부르는 이름 통계에서 부르는 이름
거짓 양성 오탐 제1종 오류
거짓 음성 미탐 제2종 오류

운영에서는 알림을 평가할 때 이 이름들을 씁니다. 장애가 아닌데 울린 알림이 오탐입니다. 장애가 났는데 울리지 않은 알림이 미탐입니다.

혼동 행렬을 쓰는 경우

혼동 행렬은 판정 결과가 정해진 갈래 가운데 하나일 때 씁니다. 스팸 필터나 사기 거래 탐지, 사진 분류가 그렇습니다. 장애가 났나와 알림이 울렸나를 짝지으면 알림 규칙도 이 표로 평가할 수 있습니다.

판정 결과가 연속된 수이면 혼동 행렬을 만들 수 없습니다. 집값이나 내일의 요청 수를 맞히는 일이 그렇습니다. 이런 일을 회귀 분석이라고 합니다.

회귀 분석의 결과는 맞았다와 틀렸다로 가를 수 없습니다. 그래서 칸을 나눌 기준이 없습니다. 이때는 정답과 예측이 얼마나 떨어졌는지를 잽니다.

관련 항목

혼동 행렬을 이루는 판정 칸

참 양성 · 거짓 양성 · 거짓 음성 · 참 음성 · 오탐 · 미탐 · 제1종 오류 · 제2종 오류

혼동 행렬의 칸을 묶어 계산하는 평가 지표

정확도 · 오차율 · 정밀도 · 재현율 · 특이도 · 정밀도와 재현율 · F1 점수 · 조화평균 · 거짓 양성률 · 균형 정확도 · 매튜스 상관 계수

혼동 행렬을 임계값마다 모아 그리는 곡선

임계값 · ROC 곡선 · AUC · 정밀도-재현율 곡선

혼동 행렬로 성적을 매기는 분류 문제

분류 · 이진 분류 · 다중 클래스 분류 · 다중 레이블 분류 · 분류기 · 스팸 필터 · 이상 탐지 · 알림

혼동 행렬을 채우는 데 쓰는 평가 자료

레이블 · 테스트 세트 · 검증 세트 · 교차 검증

혼동 행렬 읽기를 흐리는 문제

클래스 불균형 · 데이터 누수 · 과적합 · 표본 편향

혼동 행렬 대신 연속값 예측을 재는 오차 지표

회귀 분석 · 평균 제곱 오차 · 평균 절대 오차 · 결정 계수

혼동 행렬이 속하는 상위 분류

머신러닝 · 지도 학습 · 모델 평가 · 통계학

다른 이름: confusion matrix · 오차 행렬 · 오류 행렬 · error matrix