Code › codeit-ai-sprint

혼동 행렬과 분류 평가 지표

정확도와 재현율, 정밀도, F1 점수로 분류 모델의 오류를 나눠 보는 방법

지난번에는 로지스틱 회귀의 결정 경계를 정리하면서, 모델이 입력 데이터를 보고 “이 제품이 불량일 확률은 80%”처럼 결과를 0과 1 사이의 확률로 내놓는 과정을 살펴봤다. 딥러닝까지 정리할 글이 몇 개 더 남아 있지만, 이번 내용은 강의를 들으면서 특히 관심이 갔다. 테일빌런을 개발할 때 LLM을 붙인 멀티턴 챗봇 면접관과 코치가 얼마나 좋은 답변을 하는지 확인하려고 인터뷰 평가 시스템을 만들었기 때문이다. 관리자용 평가 페이지에서도 정밀도(precision), 재현율(recall), F1 점수(F1 score) 같은 지표를 봤는데, 이번 강의를 들으며 각각 어떤 기준으로 계산하는지 이해할 수 있었다.


정확도만으로는 부족한 이유

학습이 끝난 뒤 모델이 내놓은 최종 분류 결과를 어떤 기준으로 평가해야 할까. 가장 먼저 떠오르는 지표는 정확도(accuracy)다. 전체 예측 중 정답을 맞힌 비율이라 계산도 직관적인 편이다.

Accuracy=맞힌 예측 수전체 예측 수\text{Accuracy} = \frac{\text{맞힌 예측 수}}{\text{전체 예측 수}}

그런데 신용카드 부정 결제 탐지, 스팸 분류, 질병 검사, 불량품 검출처럼 한쪽 데이터가 압도적으로 많은 문제에서는 정확도만으로 모델의 성능을 판단하기 어렵다. 불량품이 1%인 데이터에서 모든 제품을 정상이라고 예측해도 정확도는 99%지만, 정작 찾아야 하는 불량품은 하나도 잡지 못한다.

분류 결과를 맞았다와 틀렸다로만 나누면 어떤 종류의 실수를 했는지가 잘 보이지 않는다. 실제값과 예측값을 함께 놓고 네 가지 경우로 나눠보면 정확도 안에 숨어 있던 오류를 볼 수 있다.


혼동 행렬의 네 가지 경우

혼동 행렬(confusion matrix)은 실제 정답과 모델의 예측을 교차해 다음 네 칸으로 나눈 표다.

실제값Positive로 예측Negative로 예측
PositiveTrue Positive, TPFalse Negative, FN
NegativeFalse Positive, FPTrue Negative, TN

여기서 양성(positive)은 좋은 결과라는 뜻이 아니라, 현재 문제에서 찾으려는 목표 사건을 뜻하고 반대쪽은 음성(negative)이라고 부른다. 질병 검사에서는 질병이 있는 경우, 불량품 검사에서는 불량인 경우, 스팸 필터에서는 스팸인 경우를 양성으로 정할 수 있다.

True와 False는 예측이 실제값과 일치했는지를 나타내고, Positive와 Negative는 모델이 어느 클래스로 판단했는지를 나타낸다. 표와 공식에서는 TP, FN, FP, TN이라는 표준 약어를 그대로 사용한다.

True Positive는 실제 양성을 양성으로 맞힌 경우이고, True Negative는 실제 음성을 음성으로 맞힌 경우다. 두 경우 모두 모델의 예측이 정답과 일치한다.

False Positive는 실제 음성을 양성으로 잘못 판단한 경우다. 정상 제품을 불량이라고 판정했다면 여기에 해당한다. 반대로 False Negative는 실제 양성을 음성으로 놓친 경우라서, 불량 제품을 정상으로 통과시켰다면 False Negative가 된다.

처음에는 네 용어를 따로 보니 헷갈렸는데, Positive와 Negative는 모델의 판단이고 True와 False는 그 판단이 맞았는지를 나타낸다고 놓고 보니 구분하기 쉬웠다.


하나의 예시로 지표 연결하기

제품 1,000개 중 실제 불량품이 10개인 상황을 생각해보자. 모델은 15개를 불량이라고 예측했고, 그중 8개가 실제 불량품이었다.

실제값불량으로 예측정상으로 예측합계
불량TP = 8FN = 210
정상FP = 7TN = 983990
합계159851,000

모델이 맞힌 결과는 TP 8건과 TN 983건이므로 정확도는 99.1%다.

Accuracy=TP+TNTP+TN+FP+FN=8+9831000=0.991\text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} = \frac{8+983}{1000} = 0.991

99.1%라는 숫자만 보면 거의 완벽한 모델처럼 보이지만, 실제로는 불량품 2개를 놓쳤고 정상 제품 7개를 불량으로 잘못 분류했다. 재현율과 정밀도는 이 두 종류의 오류를 서로 다른 방향에서 확인한다.


재현율은 실제 불량을 얼마나 찾아냈는가

재현율은 실제 양성 데이터 중 모델이 양성으로 찾아낸 비율이다.

Recall=TPTP+FN\text{Recall} = \frac{TP}{TP+FN}

실제 불량품 10개 중 모델이 찾아낸 것은 8개이므로 재현율은 80%다.

Recall=88+2=0.8\text{Recall} = \frac{8}{8+2} = 0.8

재현율은 실제 양성을 음성으로 잘못 판단하는 False Negative의 비용이 클 때 중요하다. 질병이 있는 환자를 정상으로 판단하거나, 출하 전에 잡았어야 할 불량품을 정상으로 통과시키는 경우처럼 놓치는 것의 피해가 큰 문제에서 재현율을 확인해야 한다.


정밀도는 불량 예측을 얼마나 믿을 수 있는가

재현율이 80%라는 사실만으로는 모델이 불량 판정을 얼마나 신중하게 내렸는지 알 수 없다. 불량품 8개를 찾는 동안 정상 제품을 얼마나 함께 골라냈는지 확인하려면 정밀도를 봐야 한다.

정밀도는 모델이 양성이라고 예측한 데이터 중 실제로 양성인 비율이다.

Precision=TPTP+FP\text{Precision} = \frac{TP}{TP+FP}

앞의 예시에서 모델은 15개를 불량이라고 예측했지만, 실제 불량은 8개였다. 정밀도는 약 53.3%다.

Precision=88+70.533\text{Precision} = \frac{8}{8+7} \approx 0.533

정밀도는 실제 음성을 양성으로 잘못 판단하는 False Positive의 비용이 클 때 중요하다. 정상 메일을 스팸으로 보내거나, 정상 제품을 불량으로 판단해 폐기하는 문제처럼 양성 판정을 함부로 내리면 안 되는 경우가 이에 해당한다.

재현율과 정밀도는 분자에 모두 TP를 사용하지만 분모가 다르다. 재현율의 분모는 실제 양성 전체이고, 정밀도의 분모는 모델이 양성이라고 예측한 전체다. 어떤 집합을 기준으로 비율을 구하는지 확인하면 두 공식을 따로 외우지 않아도 된다.


기준값이 재현율과 정밀도를 바꾼다

로지스틱 회귀는 0과 1 사이의 확률을 출력하고, 기준값(threshold)에 따라 최종 클래스를 정한다. 기준값을 낮추면 양성일 확률이 낮은 데이터도 양성으로 분류하므로 실제 양성을 더 많이 찾을 수 있다. 그만큼 False Negative가 줄어 재현율은 올라갈 수 있지만, False Positive도 늘어나 정밀도는 낮아질 수 있다.

반대로 기준값을 높이면 확실한 경우만 양성으로 분류한다. False Positive가 줄어 정밀도는 올라갈 수 있지만, 양성을 놓치는 False Negative가 늘어 재현율은 낮아질 수 있다.

기준값을 낮춤
  → 양성 예측 증가
  → FN 감소, FP 증가 가능
  → 재현율 상승, 정밀도 하락 가능

기준값을 높임
  → 양성 예측 감소
  → FP 감소, FN 증가 가능
  → 정밀도 상승, 재현율 하락 가능

재현율과 정밀도가 언제나 같은 폭으로 반대로 움직이는 것은 아니지만, 같은 모델에서 기준값을 조절할 때는 이런 상충 관계가 자주 나타난다. 어느 값을 선택할지는 모델만 보고 정할 수 없으며, False Positive와 False Negative 중 어떤 실수가 더 큰 비용을 만드는지 함께 봐야 한다.


F1 점수로 두 지표를 함께 보기

F1 점수는 정밀도와 재현율의 조화평균이다.

F1=2PrecisionRecallPrecision+RecallF1 = 2\cdot \frac{\text{Precision}\cdot\text{Recall}} {\text{Precision}+\text{Recall}}

앞의 예시에서는 정밀도가 약 0.533이고 재현율이 0.8이므로 F1 점수는 약 0.64다.

F120.5330.80.533+0.80.64F1 \approx 2\cdot \frac{0.533\cdot0.8} {0.533+0.8} \approx 0.64

산술평균 대신 조화평균을 사용하기 때문에 둘 중 하나가 매우 낮으면 F1 점수도 크게 낮아진다. 정밀도와 재현율이 한쪽으로 치우치지 않고 함께 높을 때 높은 값을 얻는다.

다만 F1 점수 하나로 모든 판단을 대신할 수는 없다. 같은 F1 점수를 가진 모델이라도 정밀도와 재현율의 조합은 다를 수 있고, True Negative도 공식에 직접 포함하지 않는다. F1 점수로 모델을 비교하더라도 정밀도와 재현율을 함께 확인해야 실제로 어떤 실수가 많은지 알 수 있다.


이번 정리를 통해 테일빌런의 관리자 평가 페이지에서 보던 지표가 각각 어떤 오류를 세는지 조금 더 분명해졌다. 지표를 붙이는 것만으로 평가가 완성되는 것은 아니지만, 모델이나 프롬프트를 바꾸기 전과 후를 같은 기준으로 비교할 때는 충분히 도움이 될 것 같다.