제62회 · LLM과 함께 배우는 생각그림

혼동행렬은 맞음과 틀림을 어떤 오류 종류로 나눌까?

정확도 한 숫자 뒤에 숨은 놓침과 오경보를 분리하고, 분모와 임계값을 따라 운영 결정의 비용까지 읽습니다.

위험 문장 50개와 안전 문장 150개를 교차한다

LLM 출력 200개를 사람이 위험 50개, 안전 150개로 판정하고 자동 분류기가 위험 또는 안전으로 예측했다고 하자. 혼동행렬은 실제 범주를 행, 예측 범주를 열에 놓고 같은 조합의 건수를 센다. 교육용 예시에서 위험을 맞힌 TP는 42, 놓친 FN은 8, 안전을 위험이라 한 FP는 15, 안전을 맞힌 TN은 135다.

scikit-learn 공식 문서는 C[i,j]를 실제 집단 i에 속하면서 예측 집단 j로 분류된 관측 수로 정의한다. 도구마다 행과 열의 방향이 바뀔 수 있으므로 제목만 보고 TP 위치를 외우지 않는다. 축 라벨, 범주 순서, 양성 정의를 먼저 읽고 네 셀의 합 42+8+15+135=200이 평가 행 수와 같은지 확인한다.

생각그림 1 · 위험 탐지의 원시 건수 혼동행렬도표를 좌우로 움직여 전체 내용을 확인하세요.
예측실제위험안전위험안전TP42FN8FP15TN135
대각선은 맞힌 건수, 비대각선은 오류입니다. 실제 위험 50건과 실제 안전 150건의 분모가 서로 다릅니다.

양성은 좋은 결과가 아니라 찾으려는 대상이다

양성은 가치 판단이 아니라 “탐지하려는 범주”다. 위험 탐지에서는 위험이 양성이지만, 정상 문서 승인에서는 승인을 양성으로 둘 수 있다. 같은 자료도 양성 범주를 바꾸면 TP·FN·FP·TN 이름이 바뀐다. 공개 글에는 양성 정의를 문장으로 쓰고 범주 순서를 코드와 그림에 고정한다.

TP는 실제 양성을 양성으로, FN은 실제 양성을 음성으로 예측한 건수다. FP는 실제 음성을 양성으로, TN은 실제 음성을 음성으로 예측한 건수다. “false positive”를 단순히 틀린 긍정 문장으로 번역하면 대상이 불분명하다. 이 예에서는 FN이 놓친 위험 출력이고 FP가 불필요하게 차단한 안전 출력이다.

생각그림 2 · 네 셀을 운영 문장으로 번역하기
셀조건위험 탐지에서의 뜻
TP실제 위험·예측 위험위험을 차단
FN실제 위험·예측 안전위험을 놓침
FP실제 안전·예측 위험안전을 오경보
TN실제 안전·예측 안전안전을 통과
셀 이름 옆에 실제 업무 결과를 쓰면 어떤 오류가 더 중요한지 논의하기 쉬워집니다.

정확도는 네 셀을 합치지만 오류의 방향을 숨긴다

정확도는 (TP+TN)/전체이므로 (42+135)/200=88.5%다. 숫자는 높아 보이지만 위험 8건을 놓쳤다는 사실을 직접 말하지 않는다. 실제 안전이 99%인 자료에서 모두 안전이라고 예측해도 정확도는 99%가 된다. 기준 분포와 비교하고 양성 비율을 공개해야 한다.

재현율은 TP/(TP+FN)=42/50=84.0%로 실제 위험 가운데 잡은 비율이다. 특이도는 TN/(TN+FP)=135/150=90.0%로 실제 안전 가운데 통과시킨 비율이다. 정밀도는 TP/(TP+FP)=42/57≈73.7%로 위험 경보 가운데 실제 위험인 비율이다. 각 지표의 분모가 다르므로 이름과 식을 함께 쓴다.

생각그림 3 · 같은 네 셀에서 계산한 서로 다른 지표
지표계산교육용 결과주요 질문
정확도(TP+TN)/N88.5%전체에서 맞힌 비율?
재현율TP/(TP+FN)84.0%위험을 얼마나 잡았나?
특이도TN/(TN+FP)90.0%안전을 얼마나 통과했나?
정밀도TP/(TP+FP)73.7%경보가 얼마나 맞았나?
지표 이름보다 분모를 읽으면 수치가 답하는 운영 질문이 분명해집니다.

행 정규화와 열 정규화는 서로 다른 질문에 답한다

원시 건수는 업무량과 오류 수를 보여 준다. 실제 행마다 100%가 되도록 정규화하면 각 실제 범주 안에서 어디로 예측됐는지 보이므로 재현율과 특이도를 읽기 쉽다. 반대로 예측 열마다 100%가 되도록 정규화하면 경보 가운데 실제 범주 비율, 즉 정밀도와 음성 예측값을 읽기 쉽다.

정규화 비율만 게시하면 84%가 42/50인지 8400/10000인지 알 수 없다. 건수 행렬과 정규화 행렬을 함께 두고 n을 표시한다. 행·열 정규화를 한 그림에서 섞지 않고 캡션에 분모를 쓴다. 색 범위는 0–100%로 고정하며 실제 범주 비율이 다른 데이터셋 사이에서는 원시 건수도 따로 비교한다.

생각그림 4 · 실제 행을 100%로 정규화한 혼동행렬도표를 좌우로 움직여 전체 내용을 확인하세요.
예측실제위험안전위험안전TP84%FN16%FP10%TN90%
첫 행은 위험 50건 가운데 84% 탐지·16% 놓침, 둘째 행은 안전 150건 가운데 10% 오경보·90% 통과를 뜻합니다.

임계값을 낮추면 놓침과 오경보가 서로 바뀐다

위험 확률이 0.5 이상일 때 차단한다면 예측 확률을 범주로 바꾸는 임계값이 0.5다. 이를 0.3으로 낮추면 더 많은 출력을 위험으로 보아 TP가 47로 늘고 FN이 3으로 줄지만 FP는 36으로 늘어난다. 0.7로 높이면 FP는 6으로 줄지만 TP도 34로 감소하고 FN은 16으로 늘어난다.

어느 임계값이 옳은지는 모델 점수만으로 정해지지 않는다. 놓친 위험의 피해, 잘못 차단한 안전의 검토 비용, 사람 검토 용량, 법적 요구를 함께 본다. 임계값을 시험 세트 결과에 맞춰 반복 선택하면 낙관 편향이 생긴다. 검증 세트에서 운영점을 고정하고 별도 시험 세트로 최종 성능을 보고한다.

생각그림 5 · 임계값별 네 셀과 교환관계
임계값TPFNFPTNTPR/재현율FPR정밀도
0.34733611494%24%56.6%
0.54281513584%10%73.7%
0.73416614468%4%85.0%
낮은 임계값은 위험을 더 많이 잡지만 오경보도 늘립니다. 같은 200건에서 네 셀의 합은 항상 200입니다.

클래스 불균형과 하위집단은 전체 행렬을 흔든다

실제 위험 비율이 25%에서 1%로 바뀌면 재현율과 특이도가 같아도 정밀도는 크게 달라질 수 있다. 배포 환경의 유병률 또는 기저율을 평가 세트와 함께 공개한다. 전체 정확도가 같아도 언어·주제·길이별 FN이 한 집단에 몰릴 수 있으므로 중요한 하위집단별 혼동행렬을 확인한다.

다중분류에서는 K×K 행렬의 각 대각 셀이 맞힌 범주이고 비대각 셀이 어떤 범주끼리 헷갈렸는지 보여 준다. 범주 수가 많으면 희소 행렬을 정렬하되 업무 계층을 보존한다. macro 평균은 범주를 같은 가중치로, weighted 평균은 표본 수로 가중하므로 작은 중요 범주가 사라지지 않는지 본다.

생각그림 6 · 전체 지표가 숨길 수 있는 비교 층
기저율실제 양성 비율
하위집단언어·주제·길이
다중분류K×K 오류 방향
macro 평균범주 동일 가중
전체 정확도집중 오류 은폐
한 행렬을 여러 조건으로 나누면 전체 평균이 가린 오류 집중 위치가 드러납니다.

LLM에는 원시 레이블 쌍과 양성 정의를 준다

관측ID, 실제 레이블, 예측 레이블, 예측 점수, 임계값을 제공하고 양성 범주를 명시한다. 먼저 실제×예측 조합을 그룹별로 세어 네 셀 표를 만들고 합이 전체 행 수와 같은지 검산하게 한다. 다음으로 정확도·재현율·특이도·정밀도 식에 숫자를 대입하게 하며 분모가 0인 경우 처리도 적게 한다.

“성능을 분석해 줘”만 요청하면 LLM이 축 방향이나 수치를 추측할 수 있다. 행·열 순서, 정규화 방식, 표본 기간, 제외 규칙을 출력 사양에 넣는다. 결과 문장은 셀 건수와 계산식으로 되돌릴 수 있게 하고, 비용·공정성 판단은 사용자가 제공한 기준 안에서만 제안하게 한다. 실제 자료가 없으면 숫자를 만들지 않는다.

생각그림 7 · 레이블 쌍에서 혼동행렬까지의 검산 흐름
실제·예측 쌍 확인
양성·축 정의
네 셀 집계
지표 재계산
비용·한계 기록
모든 지표는 관측별 두 레이블과 하나의 임계값에서 다시 만들어져야 합니다.

잘못된 행렬은 축과 분모를 숨겨 오류를 바꿔 보인다

수정 전 그림은 “위험/안전” 라벨만 있고 실제와 예측 축이 없었다. 행 정규화와 원시 건수를 같은 표에 섞고, 빈도가 큰 TN에 맞춘 색 범위 때문에 작은 FN·FP가 거의 흰색으로 사라졌다. 정확도 88.5%만 제목에 쓰고 위험 8건을 놓쳤다는 설명과 평가 기간을 생략했다.

수정 후 축에 실제·예측을 쓰고 양성=위험을 명시했다. 원시 건수와 행 비율을 분리하고 셀 안에 값과 업무 뜻을 적었다. FN·FP는 별도 강조선을 사용하되 색 범례를 고정했다. 네 셀 합, 지표 식, 기저율, 표본 기간과 임계값을 캡션에 남겼다.

생각그림 8 · 축 없는 정확도 그림의 수정 전후
수정 전실제·예측 축 누락
수정 전건수·비율 혼합
수정 후양성·축·분모 공개
수정 후FN·FP 비용 별도 검토
행렬 방향과 분모를 복구하면 정확도 뒤에 숨은 두 오류를 직접 비교할 수 있습니다.

실습은 임계값마다 네 셀과 지표를 다시 계산한다

아래 실습은 같은 200개 교육용 예측에 세 임계값을 적용한 준비된 결과다. 임계값을 바꾸어 TP+FN=50, FP+TN=150, 네 셀 합=200이 유지되는지 확인한다. 재현율·정밀도·특이도 가운데 어떤 지표가 좋아지고 나빠지는지 읽고 업무 비용을 한 문장으로 적는다.

실제 서비스 수치가 아니므로 이 결과로 제품의 안전성을 주장할 수 없다. 공개 전에는 원 레이블 표에서 독립 집계를 반복하고 360·390·430px에서 셀 숫자, 축 이름, 선택 결과가 잘리지 않는지 확인한다. 키보드로 선택·실행할 수 있고 결과 영역의 변경이 보조기술에 전달되어야 한다.

생각그림 9 · 세 임계값의 지표 계산 실습
임계값TPFNFPTNTPR/재현율FPR정밀도
0.34733611494%24%56.6%
0.54281513584%10%73.7%
0.73416614468%4%85.0%
0.3은 재현율, 0.7은 정밀도와 특이도를 높입니다. 운영 목적에 맞는 비용 없이 한 숫자를 최선이라 부를 수 없습니다.

복사해서 쓸 수 있는 LLM 요청문

아래 요청문은 교육용 예시다. 원문을 함께 제공하고, 모델이 빈칸을 추측하지 않도록 금지 조건을 넣었다. 결과를 받으면 원문 문장과 노드·선의 대응을 사람이 다시 확인한다.

다음 분류 결과로 혼동행렬과 지표를 검산해 줘.
1. 양성 범주와 실제 행·예측 열의 순서를 문장으로 선언한다.
2. 관측ID별 실제 레이블·예측 레이블·점수·임계값을 확인한다.
3. TP·FN·FP·TN을 세고 합이 전체 행 수와 같은지 계산한다.
4. 정확도·재현율·특이도·정밀도에 분자와 분모를 대입한다.
5. 원시 건수와 행 또는 열 정규화 표를 분리한다.
6. 세 임계값의 놓침·오경보 교환을 비교한다.
7. 기저율과 하위집단, 오류 비용을 기록한다.
8. 실제 레이블이 없으면 수치를 만들지 말고 빈 사양만 준다.

[관측별 레이블 표] …
생각그림 10 · 요청문에서 결과와 검토까지
원문 붙이기
도표 목적 명시
추정 금지
문장별 대조
요청문은 도표를 자동으로 진실로 만들지 않습니다. 원문과 결과를 왕복해 확인하는 절차가 핵심입니다.

직접 실습하고 결과를 읽기

이 실습은 브라우저 안에 준비한 교육용 자료만 사용한다. 외부 LLM을 호출하거나 실제 기관 자료를 조회하지 않는다. 입력을 바꾸어 결과가 어떻게 달라지는지 보고, 설명과 맞지 않는 결과가 나오면 어떤 정보가 빠졌는지 적어 본다.

임계값을 바꾸어 놓침과 오경보를 비교하세요.

자료와 출처

아래 자료는 이번 글의 정의와 표기법을 확인하는 데 사용했다. 생각그림과 사례 문장은 원자료를 복제하지 않고 이 글의 교육 목적에 맞게 새로 구성했다.