'전원 정상!'만 외치는 게으른 AI도 희귀병 검사에서 정확도 90%가 나와요. 정확도만 믿으면 안 되는 이유를 직접 확인해 봅시다.
가로축은 검사 수치(0~10). 파란 막대는 정상인 180명, 빨간 막대는 환자 20명의 분포예요 (환자는 수가 적어 빨강은 자기 최대 높이 기준으로 따로 키워 그렸고, 위쪽 빨간 점이 환자 한 명 한 명의 실제 수치예요). 보라 세로선이 판정 임계값 t — 이 선의 오른쪽(옅은 보라 구역)에 있으면 "환자다!"라고 판정합니다. 두 색이 겹치는 구간에서는 어디에 선을 그어도 실수가 생길 수밖에 없어요.
| 판정: 환자 🚨 | 판정: 정상 ✅ | |
|---|---|---|
| 실제 환자 🔴 | 0 잡아낸 환자 (TP) | 0 놓친 환자! (FN) |
| 실제 정상 🔵 | 0 억울한 정상인 (FP) | 0 제대로 통과 (TN) |
행은 실제, 열은 AI의 판정이에요. 칸이 진할수록 사람이 많아요. 대각선(TP·TN)은 맞힌 것, 나머지 두 칸이 실수 — FN은 놓친 환자, FP는 억울한 정상인입니다. 임계값을 움직이면 실수가 한쪽 칸에서 다른 칸으로 옮겨 가는 걸 보세요.
임계값을 최대로 올려 보세요 — 정확도는 90%인데 재현율은 0%! 정밀도가 —로 나오면 환자 판정을 한 명도 안 해서 계산 자체가 불가능하다는 뜻이에요.
from sklearn.metrics import confusion_matrix, classification_report
t = 5.0 # 판정 임계값
y_true = [1] * 20 + [0] * 180 # 실제: 환자 20명 + 정상 180명
y_pred = [int(x > t) for x in scores] # 수치가 t보다 크면 환자(1) 판정
# 혼동 행렬 — sklearn은 [[TN, FP], [FN, TP]] 순서로 줘요
print(confusion_matrix(y_true, y_pred))
# 정밀도(precision)·재현율(recall)·F1을 표로 한 번에
print(classification_report(
y_true, y_pred, target_names=["정상", "환자"]))