단원 홈
2단원 · 12차시

정확도 98%짜리 쓸모없는 모델
네 칸으로 다시 채점하기

11차시에서 우리는 훈련 데이터와 테스트 데이터를 갈랐습니다. 어디서 재야 하는지를 정한 것이지요. 그런데 무엇으로 재야 하는지는 아직 정하지 않았습니다. 오늘은 코드를 한 줄도 짜지 않은 프로그램이 정확도 98%를 받는 장면에서 시작합니다.

성취기준 12인기02-04
네 칸(혼동행렬)TP · FP · FN · TN 정밀도재현율 F1기준점 MAE · RMSE
🎯 학습 목표
  • 예측 결과를 네 칸(TP·FP·FN·TN)으로 나누고, 그 네 칸에서 정확도·정밀도·재현율·F1을 계산할 수 있다.
  • 기준점을 옮기며 정밀도와 재현율이 서로 반대로 움직이는 것을 표와 화면으로 확인하고, 문제에 맞는 지표를 고를 수 있다.
  • 수를 맞히는 모델은 MAE·RMSE로 재야 하며, 어떤 지표든 기준선과 나란히 놓아야 뜻이 생긴다는 것을 설명할 수 있다.
🤔

여는 장면 — 한 줄도 짜지 않고 98점 받기

어느 학교 보건실에 검사 기록이 쌓였습니다. 1,000명이 검사를 받았고, 나중에 정밀 진단으로 확인해 보니 그중 20명이 실제로 병을 앓고 있었습니다. 스무 명이면 1,000명의 2.0%입니다.

두 학생이 이 데이터로 진단 프로그램을 만들어 왔습니다.

  1. 가온이의 프로그램 — 검사 점수를 보고 판정합니다. 점수가 높으면 환자, 낮으면 정상. 밤새 기준점을 고쳐 가며 맞췄습니다.
  2. 나린이의 프로그램 — 딱 한 줄입니다. def 진단(점수): return 0  누가 오든 "정상입니다"라고만 답합니다.

두 프로그램을 1,000명 전원에게 돌려 정확도를 쟀습니다. 나린이의 한 줄짜리 프로그램은 980명을 맞히고 20명을 틀렸습니다. 정확도 98.0%입니다. 가온이가 밤새 고친 프로그램은, 기준점을 어떻게 잡느냐에 따라 35.2%가 나오기도 했습니다.

⚠️ 여기서 멈추면 안 되는 이유

정확도만 보면 나린이가 이겼습니다. 98.0% 대 35.2%, 승부가 안 될 정도로요. 그런데 나린이의 프로그램은 환자 20명을 한 명도 잡지 못했습니다. 가온이의 35.2%짜리는 그 20명 중 19명을 잡았습니다.
숫자는 둘 다 참입니다. 거짓말을 한 사람은 없습니다. 다만 정확도라는 자가 이 차이를 재지 못할 뿐입니다.

위층에서 내려다본 공항 보안 검색장 — 줄 선 승객들과 여러 줄의 검색 장비, 통과 문형 탐지기, 유리창 너머 활주로의 비행기
공항 보안 검색장(미국 뉴올리언스 공항). 하루에도 수많은 사람과 가방이 이 줄을 지나가지만, 찾으려는 위험물은 그중 극히 드물다. 검사는 대개 '거의 다 정상'인 무리 속에서 드문 몇을 찾아내는 일이고, 찾으려는 쪽이 드물수록 아무것도 찾지 않는 프로그램의 정확도가 오히려 높아진다. 출처: Tony Webster, Wikimedia Commons (CC BY 2.0)

11차시에서 우리는 훈련 데이터와 테스트 데이터를 갈랐습니다. 모델을 만든 데이터로 점수를 매기면 안 된다는 것, 그래서 처음 보는 데이터에서 재야 한다는 것을 배웠지요. 그것은 '어디서 재는가'의 문제였습니다. 오늘 다룰 것은 그다음 문제, '무엇으로 재는가'입니다. 아무리 깨끗하게 갈라 놓아도, 자가 잘못되어 있으면 결과는 여전히 쓸모가 없습니다.

🎯 오늘의 물음

"정확도 98%"라는 한 줄을 무엇으로 반박할 것인가?
오늘 만드는 네 칸이 그 답입니다. 그리고 그 네 칸은 15차시에서 우리가 만든 신경망을 채점할 때 그대로 다시 쓰입니다.

1

맞고 틀림을 둘로 나누면 넷이 된다

정확도(accuracy)의 정의는 간단합니다.

정확도 = 맞힌 사람 수 ÷ 전체 사람 수 나린이의 프로그램 = 980 ÷ 1000 = 0.980 = 98.0%
틀린 식이 아니다. 다만 이 식은 '어떻게 틀렸는가'를 묻지 않는다.

문제는 '맞혔다'와 '틀렸다' 두 칸으로는 담을 수 없는 정보가 있다는 데 있습니다. 나린이의 프로그램이 틀린 20명과, 만약 어떤 프로그램이 멀쩡한 사람 20명을 환자라고 잘못 부른 경우를 생각해 봅시다. 둘 다 "20명 틀림"입니다. 하지만 앞의 20명은 병을 안고 집으로 돌아간 사람이고, 뒤의 20명은 재검사를 한 번 더 받고 안심하고 돌아간 사람입니다. 같은 무게일 리가 없습니다.

예측 두 가지 × 정답 두 가지 = 네 칸

그래서 우리는 결과를 네 칸으로 나눕니다. 모델이 할 수 있는 말은 두 가지 ("환자다" / "정상이다"), 실제 정답도 두 가지(환자 / 정상)이므로 2 × 2 = 네 가지 경우가 나옵니다. 이 네 칸을 모아 놓은 표를 혼동행렬(confusion matrix)이라 부릅니다. 이 책에서는 짧게 네 칸이라고 부르겠습니다.

모델: "환자입니다"
모델: "정상입니다"
실제
환자
TP · 참 양성 진짜 환자를 환자라고 맞혔다. 제때 치료로 이어진다.
FN · 거짓 음성 환자인데 정상이라고 했다. 놓친 환자 — 병을 안고 집으로 돌아간다.
실제
정상
FP · 거짓 양성 멀쩡한데 환자라고 했다. 억울하게 재검사를 받고 놀란다.
TN · 참 음성 멀쩡한 사람을 정상이라고 맞혔다. 아무 일도 일어나지 않는다.
💡 네 글자를 외우지 말고 읽는 법을 익히세요

TP·FP·FN·TN은 처음 보면 넷이 다 비슷해 보입니다. 하지만 두 글자를 따로 읽으면 헷갈릴 일이 없습니다.

  • 뒷글자 P/N = 모델이 뭐라고 했는가. P(Positive, 양성) = "그렇다", N(Negative, 음성) = "아니다".
  • 앞글자 T/F = 그 말이 맞았는가. T(True) = 맞았다, F(False) = 틀렸다.

그러니 FN은 "아니라고 했는데(N) 그 말이 틀렸다(F)" — 즉 실제로는 환자입니다. FP는 "그렇다고 했는데(P) 그 말이 틀렸다(F)" — 즉 실제로는 멀쩡한 사람입니다.

ℹ️ '양성'은 좋다는 뜻이 아닙니다

검사에서 양성(positive)은 "찾으려던 것이 발견되었다"는 뜻입니다. 환자를 찾는 검사에서 양성은 나쁜 소식이고, 합격자를 찾는 시험에서 양성은 좋은 소식입니다. 양성은 좋고 나쁨이 아니라 '어느 쪽을 찾고 있는가'를 가리키는 말입니다.
그래서 네 칸을 쓰기 전에 반드시 정해야 할 것이 하나 있습니다 — 이 문제에서 무엇을 양성(1)으로 볼 것인가? 오늘은 환자 = 1, 정상 = 0으로 두고 시작합니다. 이것을 뒤집으면 네 칸의 숫자가 통째로 자리를 바꿉니다.

열 명으로 손으로 세어 보기

1,000명은 손으로 셀 수 없으니, 먼저 열 명짜리 작은 예로 감을 잡읍시다. 실제 환자가 4명, 멀쩡한 사람이 6명입니다. 모델은 다섯 명을 "환자"라고 했습니다.

사람①②③④⑤⑥⑦⑧⑨⑩
실제환자환자환자환자정상정상정상정상정상정상
모델의 말환자환자환자정상환자환자정상정상정상정상
어느 칸TPTPTPFNFPFPTNTNTNTN
열 명을 한 명씩 네 칸 중 하나에 넣은 결과 — TP 3 · FP 2 · FN 1 · TN 4. 네 칸의 합은 언제나 전체 사람 수(10명)와 같아야 한다. 이것이 첫 번째 검산이다.

정확도를 계산해 봅시다. 맞힌 사람은 TP와 TN을 합친 3 + 4 = 7명, 전체는 10명이므로 정확도는 70.0%입니다. 그런데 이 열 명의 이야기는 "70점"이라는 한 마디로는 도무지 전달되지 않습니다. 환자 4명 중 1명을 놓쳤고, 멀쩡한 사람 2명을 놀라게 했습니다. 이 두 문장을 숫자로 만드는 것이 다음 절의 일입니다.

같은 2×2 표 네 개에 각각 정확도(네 칸 전부), 정밀도(예측 True 세로 줄), 재현율(실제 True 가로 줄), 특이도(실제 False 가로 줄)를 타원으로 묶어 식과 함께 표시한 영어 도해
같은 네 칸에서 여러 지표가 갈라져 나온다. 네 칸 전부를 묶으면 정확도, 모델이 True라고 한 세로 줄을 묶으면 정밀도, 실제로 True인 가로 줄을 묶으면 재현율이다 (넷째 그림의 특이도는 실제 False 줄에서 나온다). 이 그림은 칸 순서가 본문 표와 달라 TN이 왼쪽 위에 있으니, 글자를 보고 읽을 것. 출처: Hssiqueira, Wikimedia Commons (CC0)
2

정확도가 뭉개 버린 것 — 정밀도와 재현율

정확도는 네 칸을 두 덩어리로 뭉갭니다. 맞힌 것(TP + TN)을 위로, 틀린 것(FP + FN)을 아래로 몰아 버리지요. 뭉개는 순간 "어느 쪽으로 틀렸는가"가 사라집니다. 그래서 우리는 뭉개지 않고 세는 자를 둘 더 만듭니다.

🟡 정밀도 (precision)

TP ÷ (TP + FP)

"환자라고 부른 사람들 중 진짜는 몇 %인가"
분모가 모델이 그렇다고 한 사람 전부입니다. 이 값이 낮으면 헛다리를 많이 짚는 모델입니다.

🟢 재현율 (recall)

TP ÷ (TP + FN)

"진짜 환자들 중 몇 %를 잡아냈는가"
분모가 실제로 그런 사람 전부입니다. 이 값이 낮으면 많이 놓치는 모델입니다.

두 식은 분자가 똑같이 TP입니다. 다른 것은 분모뿐이지요. 정밀도는 모델이 그은 선 안쪽을 분모로 삼고, 재현율은 세상에 실제로 있는 환자 전체를 분모로 삼습니다. 그래서 두 값은 전혀 다른 것을 재고, 둘 다 적어야 모델을 제대로 소개한 것이 됩니다.

앞 절의 열 명(TP 3 · FP 2 · FN 1 · TN 4)으로 계산해 봅시다.

지표식계산값읽는 법
정확도(TP+TN) / 전체(3 + 4) / 1070.0%열 명 중 일곱 명의 판정이 맞았다
정밀도TP / (TP+FP)3 / (3 + 2)60.0%환자라고 부른 5명 중 3명이 진짜였다
재현율TP / (TP+FN)3 / (3 + 1)75.0%진짜 환자 4명 중 3명을 잡았다
F12PR / (P+R)2×0.6×0.75 / 1.3566.7%정밀도와 재현율을 한 숫자로 묶은 값
네 숫자가 다 다릅니다. 70.0 / 60.0 / 75.0 / 66.7 — 이 중 하나만 보고서에 적으면 나머지 셋을 숨기는 것이 됩니다.
정밀도와 재현율을 집합 그림으로 나타낸 영어 도해 — 왼쪽 짙은 칸이 실제 정답(relevant elements), 가운데 타원이 모델이 고른 것(retrieved elements)이고, 둘이 겹친 초록 부분이 true positives, 타원의 빨간 부분이 false positives다. 아래에 두 지표의 분수 그림이 있다
왼쪽 짙은 칸이 실제 정답, 가운데 타원이 모델이 고른 것이다. 같은 TP(초록, 겹친 부분)를 놓고, 모델이 고른 범위로 나누면 정밀도, 실제 정답 범위로 나누면 재현율이 된다. 분자는 같고 분모만 다르다. 출처: Walber, Wikimedia Commons (CC BY-SA 4.0)

나린이의 프로그램을 다시 채점한다

이제 여는 장면으로 돌아갑시다. "모두 정상"이라고만 답하는 프로그램의 네 칸은 이렇습니다.

네 칸TPFPFNTN정확도정밀도재현율F1
"모두 정상"0020980 98.0%0.0%0.0%0.0%
정확도 하나만 98.0%로 빛나고, 나머지 셋이 전부 바닥이다. 재현율 0.0%는 "환자 20명 중 한 명도 못 잡았다"는 말을 그대로 옮긴 숫자다.

재현율 0.0%. 이것이 우리가 찾던 반박입니다. "정확도 98%입니다"라는 보고에 대해 "재현율은 0%입니다"라고 답하면, 더 이상 할 말이 없습니다. 두 숫자 다 참이고, 두 숫자 다 같은 네 칸에서 나왔습니다.

⚠️ 정밀도 0.0%는 사실 '계산할 수 없음'입니다

이 모델은 아무도 환자라고 부르지 않았습니다. 그러니 정밀도의 분모 TP + FP가 0이 되어 나눗셈 자체가 성립하지 않습니다. 실습 코드는 이럴 때 오류를 내지 않으려고 0으로 두기로 정해 놓았을 뿐입니다.
"정밀도가 0%다"라고 그냥 쓰면 틀린 설명이 됩니다. 정확히는 "환자라고 부른 사람이 0명이라 정밀도를 정의할 수 없다"입니다. 재현율 0.0%는 반대로 진짜 계산된 값입니다(0 ÷ 20 = 0).

왜 하필 98%였을까 — 드문 것을 찾을수록 정확도는 쓸모없어진다

나린이의 98.0%는 특별한 재주가 아닙니다. 1,000명 중 980명이 애초에 정상이었기 때문에, "전부 정상"이라고만 해도 980명이 맞아떨어진 것입니다. 즉 '모두 음성' 모델의 정확도 = 1 − 양성 비율입니다. 찾으려는 것이 드물수록 이 숫자는 올라갑니다.

1,000명 중 환자가1명20명100명500명
환자 비율0.1%2.0%10.0%50.0%
"모두 정상"의 정확도99.9%98.0%90.0%50.0%
"모두 정상"의 재현율0.0%0.0%0.0%0.0%
실습 코드의 환자 수만 바꿔 실제로 돌려 본 값이다. 정확도는 99.9%까지 올라가는데 재현율은 네 경우 모두 0.0%로 꼼짝하지 않는다. 희귀병 진단·기계 고장 예측·지진 예보처럼 찾으려는 것이 드문 문제일수록 정확도는 아무 말도 하지 않는 숫자가 된다.
ℹ️ '재현율'이라는 이름은 어디서 왔나

recall은 원래 도서관 검색에서 온 말입니다. 서가에 관련 책이 100권 있는데 검색이 60권을 불러왔다면 재현율 60%입니다 — 있는 것을 얼마나 '다시 불러왔는가(recall)'이지요. 정밀도는 반대로, 불러온 목록이 얼마나 군더더기 없이 정확한가를 봅니다. 검색창에 낱말을 하나만 넣으면 재현율이 오르고 정밀도가 떨어지며, 낱말을 여러 개 겹쳐 넣으면 정밀도가 오르고 재현율이 떨어집니다. 여러분이 자료를 찾을 때 이미 매일 하고 있는 저울질입니다.

💡 정밀도와 재현율을 바꿔 쓰지 않는 검산법

두 식은 분자가 같고 분모만 달라서, 시험지에서도 코드에서도 자주 뒤바뀝니다. 게다가 값이 비슷하면 뒤바뀐 것을 눈치채지 못합니다. 뒤에 나올 표에서 기준점 70일 때 정밀도는 30.4%, 재현율은 35.0%인데, 이 둘을 바꿔 적어도 대충 그럴듯해 보이지요.

검산 한 줄: 재현율의 분모(TP + FN)가 실제 양성인 사람 수와 같은가? 오늘 데이터에서 환자는 20명입니다. 기준점 70에서 TP 7 + FN 13 = 20 ✔. 만약 여기서 20이 안 나오면 두 식을 바꿔 쓴 것입니다.
계산 연습을 할 때는 값이 확 벌어지는 기준점 80(정밀도 75.0% · 재현율 15.0%)으로 하는 편이 안전합니다.

3

기준점을 옮기면 — 정밀도와 재현율의 줄다리기

여기까지는 이미 나와 버린 판정을 채점하는 이야기였습니다. 그런데 실제 진단 프로그램은 "환자/정상"을 곧바로 뱉지 않습니다. 먼저 검사 점수라는 수 하나를 내놓고, 그다음 "몇 점부터 환자로 볼 것인가"를 사람이 정합니다. 이 갈림값을 기준점(임계값, threshold)이라 합니다.

오늘 쓸 데이터에서 두 무리의 점수는 이렇습니다.

무리사람 수가장 낮은 점수가장 높은 점수평균
실제 환자20명31.698.166.3
실제 정상980명1.480.544.8
환자의 평균이 21.5점 높지만, 31.6 ~ 80.5 구간에서 두 무리가 겹칩니다. 겹치는 한, 어떤 기준점을 잡아도 누군가는 반드시 틀립니다. 이것은 알고리즘을 더 잘 짜서 해결할 문제가 아니라, 데이터 자체가 가진 성질입니다.
02040 6080100 검사 점수 기준점 70 실제 정상 980명 실제 환자 20명 겹치는 구간 ← FN 놓친 환자 FP 억울한 사람 →
기준점 세로선의 왼쪽에 남은 분홍(환자)이 FN, 오른쪽으로 넘어간 회색(정상)이 FP다. 선을 왼쪽으로 밀면 FN이 줄고 FP가 늘며, 오른쪽으로 밀면 그 반대가 된다. 둘을 동시에 0으로 만드는 자리는 없다.
※ 두 무리의 높이는 각자의 최고점을 같게 맞춰 그린 것이다. 실제 사람 수는 980명 대 20명이라 같은 자로 그리면 분홍 쪽이 보이지 않는다.

기준점을 여덟 자리에 놓고 재 본 표

기준점을 40부터 999까지 옮기며 네 칸을 세어 보면 이렇게 나옵니다. (기준점 999는 아무도 넘지 못하는 값이라, 나린이의 "모두 정상"과 완전히 같은 모델입니다.)

기준점TP
잡은 환자
FP
억울한 사람
FN
놓친 환자
TN
맞게 넘김
정확도정밀도재현율F1
40196471333 35.2%2.9%95.0%5.5%
50193291651 67.0%5.5%95.0%10.3%
55181892791 80.9%8.7%90.0%15.9%
60151065874 88.9%12.4%75.0%21.3%
65104910931 94.1%16.9%50.0%25.3%
7071613964 97.1%30.4%35.0%32.6%
803117979 98.2%75.0%15.0%25.0%
9990020980 98.0%0.0%0.0%0.0%
실습 코드 【4】를 그대로 돌린 값이다. 한 줄씩 왼쪽에서 오른쪽으로 읽지 말고, 한 칸씩 위에서 아래로 읽어 보라 — FP는 647에서 0까지 줄고, FN은 1에서 20까지 는다. 같은 데이터, 같은 모델인데 기준점 하나만 옮겼을 뿐이다.

이 표에서 세 가지를 읽어 낼 수 있습니다.

  1. FP와 FN은 언제나 반대로 움직인다. 기준점을 올리면 환자라고 부르는 사람이 줄어드니 억울한 사람(FP)도 줄지만, 그만큼 놓치는 환자(FN)가 늡니다. 따라서 정밀도가 오르면 재현율이 내려갑니다. 이것이 줄다리기입니다. 40에서 80까지 가는 동안 정밀도는 2.9% → 75.0%로 26배 오르고, 재현율은 95.0% → 15.0%로 떨어집니다.
  2. 정확도는 거의 오른쪽 끝에서만 높다. 기준점 40일 때 정확도는 겨우 35.2%인데, 이 모델은 환자 20명 중 19명을 잡았습니다. 정확도로 줄을 세우면 꼴찌인데, 놓친 환자 수로 줄을 세우면 1등입니다.
  3. 정확도가 가장 높은 기준점은 78이다. 표에 있는 80이 아니라 78이고, 그때 정확도는 98.2%(TP 3 · FP 1 · FN 17 · TN 979)입니다. "모두 정상"의 98.0%보다 겨우 0.2%p 높습니다. 그 0.2%p를 위해 환자 17명을 놓칩니다.
⚠️ 정확도를 최대로 만드는 일이 목표가 되면

기준점 78은 정확도 최적화의 정답입니다. 컴퓨터에게 "정확도가 가장 높아지도록 기준점을 골라라"라고 시키면 정확히 78을 골라 옵니다. 그리고 그 78은 병원 문을 사실상 닫아 버립니다 — 검사를 받은 1,000명 안에 있던 환자 20명 중 3명만 부르니까요.
기계가 잘못한 것이 아닙니다. 우리가 잘못된 자를 쥐여 준 것입니다.

둘을 한 숫자로 묶고 싶다면 — F1

정밀도와 재현율을 둘 다 적는 것이 원칙이지만, 여러 모델을 줄 세워 비교할 때는 숫자 하나가 필요할 때가 있습니다. 그때 쓰는 것이 F1 점수입니다. F1은 두 값의 조화평균입니다.

F1 = 2 × 정밀도 × 재현율 ÷ (정밀도 + 재현율) 기준점 70: 2 × 0.304 × 0.350 ÷ (0.304 + 0.350) = 0.326 = 32.6%

왜 그냥 평균(산술평균)을 쓰지 않을까요? 직접 견줘 봅시다.

정밀도재현율산술평균조화평균 = F1어떤 모델인가
90.0%10.0%50.0%18.0% 거의 다 놓치는데, 부른 사람은 정확한 모델
50.0%50.0%50.0%50.0% 양쪽이 똑같이 중간
75.0%60.0%67.5%66.7% 양쪽이 고르게 좋은 모델
산술평균으로 재면 첫 줄과 둘째 줄이 똑같이 50.0%다. 첫 줄은 환자 열 명 중 아홉을 놓치는 모델인데도 "보통은 하는 모델"처럼 보인다. 조화평균은 18.0%로 답한다 — 한쪽이 바닥이면 봐주지 않는다. 두 값이 같을 때만 두 평균이 일치한다(둘째 줄).

그래서 F1로 다시 줄을 세우면 가장 좋은 기준점이 71(F1 36.8%)로 나옵니다. 정확도로 세우면 78이었지요. 같은 데이터, 같은 모델인데 지표를 바꾸었더니 답이 달라졌습니다. 이것이 오늘 차시의 핵심입니다 — 지표는 결과를 보고하는 도구가 아니라, 결정을 바꾸는 도구입니다.

🎛 네 칸 판 — 기준점을 밀어 보기 INTERACTIVE

위 표를 만든 바로 그 1,000명이 이 안에 들어 있습니다 (앞 20명이 실제 환자, 검사 점수는 실습 코드가 만든 값과 소수 넷째 자리까지 같습니다). 기준점 슬라이더를 밀면 점 1,000개가 그 자리에서 네 칸으로 다시 나뉘고, 네 칸의 숫자와 네 지표가 함께 갱신됩니다. 아래 곡선은 기준점을 0에서 100까지 다 훑어 본 결과이고, 세로 막대가 지금 여러분이 서 있는 자리입니다.

TP 잡아낸 환자 FN 놓친 환자 FP 억울한 사람 TN 맞게 넘긴 사람
70
모델: "환자입니다"
모델: "정상입니다"
실제 환자
20명
TP 잡아낸 환자 7명
FN 놓친 환자 13명 — 병을 안고 돌아간다
실제 정상
980명
FP 억울한 사람 16명 — 재검사를 받는다
TN 맞게 넘긴 사람 964명
정확도97.1% (7+964)/1000
정밀도30.4% 7/(7+16)
재현율35.0% 7/(7+13)
F132.6% 조화평균
한눈에 가 보기 →
오류의 대가를 점수로 매기면: 놓친 환자 점 : 억울한 사람 점 지금 손해 1,316점
— 표 채우기 과제를 할 때 쓰세요
[안내] 기준점을 밀어 보세요. 지금은 70입니다.
화면 읽는 법 — 위 그림에서 세로 점선이 기준점입니다. 점선 오른쪽에 있는 사람은 전부 "환자"라고 판정된 사람이고, 그중 위 띠에 있으면 TP(초록), 아래 띠에 있으면 FP(노랑)입니다. 점선 왼쪽은 "정상"이라고 판정된 사람이고, 위 띠에 남아 있으면 FN(빨강)입니다. 빨간 점 하나가 병을 안고 집으로 돌아간 사람 한 명입니다.
아래 곡선에서 정밀도(노랑)가 오른쪽 끝에서 0으로 떨어지는 것은 성능이 나빠져서가 아닙니다. 기준점을 아주 높이 올리면 아무도 환자라고 부르지 않게 되어 정밀도의 분모가 0이 되고, 계산할 수 없는 값을 코드가 0으로 둔 것입니다.
✍️ 활동 — 시뮬레이터로 세 가지를 확인한다

㉮ 표 채우기. 기준점을 아래 세 자리에 놓고 네 칸과 두 지표를 공책에 옮겨 적으세요. 📋 지금 값을 아래에 적어 두기 버튼을 누르면 기록 칸에 한 줄씩 쌓입니다.

기준점TPFPFNTN정확도재현율이 병원에 쓸 만한가?
55
65
78

㉯ 문턱 찾기. 기준점을 100에서부터 1씩 내리면서, 놓친 환자(FN)가 처음으로 3명 이하가 되는 기준점을 찾으세요. 그 자리에서 억울한 사람(FP)은 몇 명입니까? 정확도는 얼마로 떨어집니까? 확인 문제 3번이 이 값을 묻습니다.

㉰ 반례 만들기. 정확도가 가장 높은 자리와 F1이 가장 높은 자리 버튼을 차례로 눌러 두 기준점을 확인하세요. 그리고 "정확도는 더 높은데 환자는 더 많이 놓치는" 기준점 짝을 하나 만들어 조원에게 보여 주세요. 이런 짝이 존재한다는 것이, 정확도 하나로 모델을 고르면 안 되는 증거입니다.

4

어느 지표를 볼지는 문제가 정한다

지표가 넷이나 되고 서로 다른 답을 준다면, 무엇을 봐야 할까요? "F1을 보면 된다"는 답은 없습니다. 답은 언제나 문제 쪽에 있습니다. 물어야 할 것은 하나입니다 — 두 종류의 오류 중 어느 쪽이 더 아픈가?

대가를 숫자로 매겨 보면

"더 아프다"는 말은 애매하니, 숫자로 매겨 봅시다. 놓친 환자 한 명의 대가를 a점, 억울한 사람 한 명의 대가를 b점이라 하면 총 손해는 이렇습니다.

총 손해 = FN × a + FP × b TP와 TN은 이 식에 없다 — 맞힌 것에는 대가가 없기 때문이다.

이 식으로 기준점 30부터 100까지를 전부 훑어 손해가 가장 적은 자리를 골라 보면, 상황마다 완전히 다른 답이 나옵니다.

상황놓친 환자 : 억울한 사람고른 기준점 TPFPFN정확도
① 암 조기 검진
놓치면 사람이 죽는다
100 : 153 19247175.2%
② 곧바로 위험한 치료
잘못 시작하면 몸이 상한다
1 : 10081 201898.2%
③ 둘이 똑같다고 치면 1 : 178 311798.2%
실습 코드 【6】을 그대로 돌린 값이다. 세 줄 모두 같은 모델·같은 데이터이고, 바뀐 것은 오류의 대가를 어떻게 매겼는가뿐이다.

①번을 보세요. 암 검진은 기준점을 53까지 끌어내려 정확도를 75.2%로 떨어뜨립니다. 정확도 최고점(98.2%)에서 23%p를 스스로 버린 것입니다. 그 대가로 얻은 것은 놓친 환자가 17명에서 1명으로 줄었다는 사실입니다. 대신 멀쩡한 사람 247명이 재검사 통지를 받습니다. 의료진은 그 247통의 통지를 16명의 목숨값으로 여기고 감수하기로 한 것입니다.

🎯 오늘 가장 놀라운 한 줄

③번, 두 오류를 똑같은 1점씩으로 매겼을 때 고른 기준점은 78이었습니다. 그런데 78은 3절에서 나온 '정확도가 가장 높은 기준점'과 정확히 같은 값입니다.
우연이 아닙니다. 정확도란, 놓친 환자와 억울한 사람의 대가를 똑같다고 쳐 놓은 지표입니다. 정확도를 쓰는 순간 우리는 이미 "두 오류는 같은 무게다"라는 판단을 내린 것이고, 대부분의 문제에서 그 판단은 틀립니다.

시뮬레이터의 대가 칸에 다른 값을 넣어 보면 흐름이 더 잘 보입니다. 10 : 1로 매기면 고르는 기준점이 71이 되는데, 이 값은 F1이 가장 높았던 자리와 같습니다(이 데이터에서 그렇다는 것이지, 언제나 같지는 않습니다). 50 : 1이면 57, 100 : 1이면 53으로 더 내려갑니다. 반대로 억울한 사람 쪽 대가를 올리면 기준점은 81에서 더 움직이지 않습니다 — 이미 FP가 0명이라 더 줄일 것이 없기 때문입니다.

현실의 문제 넷

문제양성(1)으로 볼 것 FN(놓침)이 뜻하는 것FP(오인)가 뜻하는 것더 봐야 할 지표
암 조기 검진환자 치료 시기를 놓친다재검사 한 번을 더 받는다재현율
스팸 메일 거르기스팸 스팸 한 통이 받은편지함에 남는다합격 통지가 스팸함으로 사라진다정밀도
지진 조기 경보큰 지진 경보 없이 지진이 온다헛경보로 사람들이 대피한다재현율
얼굴로 문 열어 주기본인 주인이 문 앞에서 다시 시도한다남이 문을 열고 들어온다정밀도
같은 넷을 놓고도 무엇을 양성으로 두느냐에 따라 답이 뒤집힌다. 스팸 거르기에서 양성을 '스팸'이 아니라 '정상 메일'로 두면, 봐야 할 지표는 재현율로 바뀐다. 지표를 고르기 전에 양성이 무엇인지부터 적어 두는 습관이 필요한 이유다.
ℹ️ 왜 스팸 필터는 정밀도 쪽인가

스팸 한 통을 놓치면(FN) 여러분은 그 메일을 지우면 그만입니다. 3초짜리 손해지요. 그런데 대학 합격 통지나 면접 안내가 스팸함으로 들어가면(FP), 여러분은 그 메일이 왔다는 사실조차 모릅니다. 두 오류의 대가가 3초와 인생으로 갈립니다. 그래서 메일 서비스는 스팸을 조금 놓치더라도 정상 메일은 절대 버리지 않는 쪽으로 기준점을 잡습니다. 여러분의 스팸함에 진짜 스팸이 다 들어와 있지 않은 이유가 그것입니다.

수를 맞히는 모델은 정확도로 잴 수 없다

여기까지는 전부 '그렇다 / 아니다'를 맞히는 문제(분류)였습니다. 9차시에서 우리는 공부 시간으로 시험 점수를 맞히는 모델을 만들었지요. 그런 모델은 수를 맞히는 문제(회귀)라서, 네 칸을 만들 수가 없습니다. 예측이 83.4점이고 실제가 83점이면, 이것은 맞힌 걸까요 틀린 걸까요? 정확도로는 물을 수 없는 질문입니다.

회귀에서는 얼마나 빗나갔는가를 잽니다. 자가 둘 있습니다.

📏 MAE (평균 절대 오차)

|실제 − 예측| 의 평균

틀린 만큼을 그대로 더해 평균냅니다. "평균 몇 점쯤 빗나가는가"라는 뜻이라 읽기 쉽습니다.

📏 RMSE (제곱 평균 제곱근 오차)

√( (실제 − 예측)² 의 평균 )

틀린 만큼을 제곱해서 더합니다. 그래서 크게 틀린 하나에 무거운 벌을 줍니다.

기말고사 여덟 명의 점수를 예측한 모델로 두 자를 다 써 봅시다.

사람①②③④⑤⑥⑦⑧
실제 점수5261707483889560
모델의 예측5558727680909275
빗나간 정도332232315
⑧번 한 명에서만 15점이 빗나갔다. 나머지 일곱은 2~3점씩이다.
MAERMSE
이 모델4.125.84
기준선 — 누구에게나 평균 72.88점이라고 답하기12.1214.02
RMSE(5.84)가 MAE(4.12)보다 큰 까닭은 ⑧번의 15점 때문이다. 두 자의 차이가 벌어져 있다는 것 자체가 "어딘가 크게 빗나간 사람이 있다"는 신호다. MAE만 보면 "평균 4점쯤 틀린다"로 읽혀 그 한 명이 보이지 않는다.

그리고 언제나 — 기준선 옆에 놓아라

"MAE가 4.12입니다"라는 한 줄만으로는 좋은지 나쁜지 알 수 없습니다. 기준선(baseline)과 나란히 놓아야 뜻이 생깁니다. 아무 생각 없이 "다들 평균 점수쯤 되겠지"라고 답하는 기준선의 MAE는 12.12였습니다. 모델은 그것을 4.12로 줄였으니 약 3분의 1로 줄인 것입니다. 이제야 4.12라는 숫자에 뜻이 생깁니다.

분류도 똑같습니다. 여는 장면의 98%가 왜 아무 성과가 아니었는지 기억하십시오 — 기준선이 이미 98.0%였기 때문입니다. 2차시에서 우리는 "한 줄도 짜지 않은 프로그램이 받을 수 있는 점수"를 기준선이라 불렀습니다. 오늘의 결론은 이렇게 한 줄로 줄어듭니다.

💡 성능을 보고하는 세 줄 규칙
  1. 네 칸을 먼저 적는다. TP·FP·FN·TN 네 숫자를 그대로. 여기서 모든 지표가 나온다.
  2. 지표는 둘 이상 적는다. 분류면 정밀도와 재현율(또는 F1), 회귀면 MAE와 RMSE.
  3. 기준선을 옆에 붙인다. 기준선 없는 성능 수치는 읽는 사람을 속인다.
⚠️ 오늘 만든 것은 모델이 아니라 '자'입니다

오늘 우리는 검사 점수를 더 잘 내는 방법을 배우지 않았습니다. 두 무리가 겹쳐 있다는 데이터의 성질은 하나도 바뀌지 않았습니다. 기준점을 아무리 잘 골라도 이 데이터에서 놓친 환자와 억울한 사람을 동시에 0으로 만들 수는 없습니다.
오늘 만든 것은 채점표입니다. 그리고 이 채점표는 15차시에서 우리가 직접 학습시킨 신경망을 재는 데 함수 두 개(confusion·scores) 그대로 쓰입니다. 그때 기준점 자리에는 신경망이 뱉는 0~1 사이의 값이 들어옵니다.

💻

손으로 — 채점표를 직접 짜고 기준점을 훑는다

이제 여러분이 채점표를 짭니다. 오늘 짤 것은 함수 두 개입니다.

  1. confusion(pairs) — (실제, 예측) 짝의 목록을 받아 (TP, FP, FN, TN) 네 수를 돌려준다. 이 함수는 이미 채워져 있습니다. 인자 순서와 돌려주는 순서를 눈으로 확인해 두세요.
  2. scores(TP, FP, FN, TN) — 네 칸을 받아 정확도·정밀도·재현율·F1을 돌려준다. 여기 빈칸 세 곳이 있습니다.
⚠️ 빈칸은 여섯 곳입니다

채우지 않고 실행하면 SyntaxError가 납니다 — 정상입니다. ?????를 전부 지우고 채우세요.

  • ① 정밀도 — 분모가 '환자라고 부른 사람 전부'입니다. TP와 FP를 합친 수지요.
  • ② 재현율 — 분모가 '진짜 환자 전부'입니다. 잡은 사람(TP)과 놓친 사람(FN)의 합입니다.
  • ③ F1 — 두 수 a, b의 조화평균은 2*a*b / (a+b)입니다.
  • ④ 기준점 판정 — 점수가 기준점 이상이면 1, 아니면 0. >= 를 > 로 쓰면 경계에 딱 걸린 사람에서 답이 갈립니다.
  • ⑤ 0~1로 눌러 넣기 — 5차시의 min-max입니다. 최저값을 빼고, 최고와 최저의 차로 나눕니다.
  • ⑥ 총 손해 — 놓친 사람 수 × 그 대가 + 억울한 사람 수 × 그 대가. TP와 TN이 식에 등장하지 않는 이유를 한 번 생각해 보세요.
ℹ️ 이 두 함수는 15차시가 그대로 가져갑니다

Ⅱ단원에는 차시를 건너 이어지는 코드가 몇 개 있습니다. 오늘 짜는 confusion과 scores가 그중 하나입니다. 15차시에서 우리는 급식 잔반을 예측하는 신경망을 학습시키고, 그 신경망의 성적을 오늘 만든 이 두 함수로 잽니다. 그래서 이름·인자 순서·돌려주는 순서를 바꾸면 안 됩니다.
특히 confusion(pairs)의 pairs는 (실제, 예측) 순서입니다. 뒤집어 넣어도 오류 없이 조용히 돌아가는데, FP와 FN만 자리가 바뀌어 정밀도와 재현율이 서로 뒤바뀝니다. 정확도와 F1은 한 자리도 안 바뀌므로 눈치채기 어렵습니다. 앞에서 익힌 검산법(재현율의 분모가 실제 환자 수 20과 같은가)을 이럴 때 씁니다.

✍️ 도전 — 실행 결과에서 세 가지를 찾는다

도전 ① 【3】의 숫자를 읽으세요. 기준점 999는 '모두 정상'이라고만 답하는 모델입니다. 정확도가 몇 %입니까? 재현율은 몇 %입니까? 두 숫자를 나란히 적고, 보건 선생님께 어느 쪽을 보고해야 하는지 쓰세요.

도전 ② 【4】의 마지막 두 줄을 보세요. '정확도가 가장 높은 기준점'은 몇입니까? 그 기준점에서 놓친 환자는 몇 명입니까? 병원에서 실제로 써야 할 기준점과 같습니까? 다르다면 왜 다른지 한 문장으로 쓰세요.

도전 ③ 놓친 환자를 줄여 보세요. FN을 3명 이하로 만드는 가장 높은 기준점은 몇이며, 그때 억울한 사람(FP)은 몇 명입니까? 한 명도 놓치지 않으려면(FN = 0) 기준점을 얼마까지 내려야 하고, 그때 FP는 몇 명입니까? 두 경우의 FP를 조원들과 견주어 보고, 우리 학교 보건실이라면 어느 쪽을 고를지 이야기해 보세요.

더 해 볼 것. 【2】의 if i < 20에서 20을 100이나 500으로 바꿔 다시 돌려 보세요. '모두 정상' 모델의 정확도가 어떻게 변합니까? 재현율은요? (원래대로 되돌리는 것을 잊지 마세요 — 뒤의 표가 전부 달라집니다.)

💡 실행 결과 【5】는 15차시로 가는 다리입니다

【5】는 같은 표를 0~1 위험도로 다시 만듭니다. 검사 점수를 5차시의 min-max로 0~1 구간에 눌러 넣은 뒤, 임계값을 0.1부터 0.9까지 올리는 것이지요. 결과는 이렇습니다 — 재현율은 100.0% → 5.0%로 내려가고, 정밀도는 2.0% → 100.0%로 올라갑니다. 정확히 반대로 움직입니다. F1은 그 사이 임계값 0.7에서 28.0%로 가장 높습니다.
14차시에서 만들 신경망의 출력도 0~1 사이의 수입니다. 그래서 15차시에서 이 표를 그대로 다시 만들게 됩니다. 그때 임계값 0.5가 당연한 값이 아니라는 것을 오늘 미리 봐 두는 셈입니다.

📖

정리

오늘 배운 것한 줄 정의오늘 데이터에서 본 장면
네 칸(혼동행렬)예측 두 갈래 × 정답 두 갈래 = TP·FP·FN·TN 네 칸의 합은 언제나 전체 사람 수와 같다
정확도(TP+TN) ÷ 전체 '모두 정상' 모델이 98.0%를 받았다
정밀도TP ÷ (TP+FP) — 부른 사람 중 진짜 비율 기준점 80에서 75.0%
재현율TP ÷ (TP+FN) — 진짜 중 잡아낸 비율 '모두 정상' 모델은 0.0%였다
F1정밀도와 재현율의 조화평균 90%·10%의 F1은 18.0% (산술평균은 50.0%)
기준점몇 점부터 양성으로 볼 것인가 정확도 최고는 78, F1 최고는 71로 서로 달랐다
오류의 대가FN × a + FP × b 100:1이면 53, 1:1이면 78 — 1:1이 곧 정확도다
MAE · RMSE회귀에서 얼마나 빗나갔는가 모델 4.12 / 5.84, 기준선 12.12 / 14.02

오늘의 한 문장. 지표는 성적을 보고하는 도구가 아니라 어떤 모델을 고를지 정하는 도구입니다. 그래서 지표를 고르는 일은 기술이 아니라 결정이고, 그 결정은 두 종류의 오류 중 어느 쪽이 더 아픈가를 묻는 데서 시작합니다. 그 물음에 답할 수 있는 사람은 알고리즘이 아니라 사람입니다.

📖 다음 시간에는

지금까지 우리가 다룬 모델은 이웃에게 물어보거나(8차시) 점수에 선을 긋는(오늘) 수준이었습니다. 13차시부터는 기계가 스스로 선을 찾는 장치인 퍼셉트론을 만듭니다. 9차시에서 익힌 '예측 → 오차 → 고치기'라는 고리가 거기서 다시 나타나는데, 같은 코드가 아니라 같은 모양의 다른 알고리즘입니다. 그리고 그 퍼셉트론이 결코 풀지 못하는 문제도 만나게 됩니다. 그리고 15차시에 이르면, 오늘 만든 confusion과 scores를 꺼내 우리가 학습시킨 신경망을 채점하게 됩니다.

✅

확인 문제

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. 혼동행렬 네 칸의 이름(영문 약자)을 쓰고, 질병 검사에서 각 칸에 들어가는 사람이 현실에서 어떤 처지가 되는지 한 문장씩 설명하시오. 또 네 칸의 합이 무엇과 같아야 하는지도 쓰시오.
📖 모범 답안

TP(참 양성) — 진짜 환자를 환자라고 맞힌 사람. 제때 치료로 이어진다.
FP(거짓 양성) — 멀쩡한데 환자라고 불린 사람. 놀라서 재검사를 받고, 시간과 돈을 쓴다.
FN(거짓 음성) — 환자인데 정상이라는 말을 듣고 돌아간 사람. 병을 안고 집에 간다.
TN(참 음성) — 멀쩡한 사람을 정상이라고 맞힌 사람. 아무 일도 일어나지 않는다.

읽는 법은 뒷글자가 모델의 말(P="그렇다" / N="아니다"), 앞글자가 그 말의 참·거짓이다. 그래서 FN은 "아니라고 했는데 그 말이 틀렸다" = 실제로는 환자다.

네 칸의 합 = 채점한 사람 전체 수. 오늘 데이터에서는 1,000이다. 합이 안 맞으면 어딘가에서 사람을 두 번 세었거나 빠뜨린 것이므로, 지표를 계산하기 전에 이것부터 검산한다.

2. 정밀도와 재현율의 식을 각각 쓰고, 오늘 실행한 실습 결과 【4】의 표에서 기준점 70과 기준점 80의 네 칸을 찾아 두 지표를 각각 계산해 확인하시오. 그리고 왜 기준점 70이 아니라 80으로 연습하는 것이 안전한지 설명하시오.
📖 모범 답안

정밀도 = TP ÷ (TP + FP), 재현율 = TP ÷ (TP + FN). 분자는 둘 다 TP이고 분모만 다르다.

기준점 70 — TP 7 · FP 16 · FN 13 · TN 964.
정밀도 = 7 ÷ (7 + 16) = 7 ÷ 23 = 30.4%
재현율 = 7 ÷ (7 + 13) = 7 ÷ 20 = 35.0%

기준점 80 — TP 3 · FP 1 · FN 17 · TN 979.
정밀도 = 3 ÷ (3 + 1) = 75.0%
재현율 = 3 ÷ (3 + 17) = 3 ÷ 20 = 15.0%

왜 80으로 연습하는가 — 기준점 70에서는 두 값이 30.4%와 35.0%로 가까워서, 두 식을 서로 바꿔 써도 그럴듯해 보인다. 실수를 해도 발견되지 않는 문제는 연습에 나쁘다. 기준점 80에서는 75.0%와 15.0%로 다섯 배 차이가 나므로 바꿔 쓰면 곧바로 이상하다.
검산법: 재현율의 분모(TP + FN)가 실제 환자 수와 같은지 본다. 두 경우 모두 7+13 = 20, 3+17 = 20으로 실제 환자 20명과 일치한다 ✔

3. 오늘 시뮬레이터(또는 실습 코드)에서 직접 찾은 값으로 답하시오. 놓친 환자(FN)를 3명 이하로 만드는 가장 높은 기준점은 얼마이며, 그때 억울한 사람(FP)은 몇 명입니까? 정확도는 얼마로 바뀝니까? 또 한 명도 놓치지 않으려면(FN = 0) 기준점을 얼마까지 내려야 하며 그때 FP는 몇 명입니까?
📖 모범 답안

FN ≤ 3 — 기준점 59. 그때 FP = 117명, 정확도 88.0%, 정밀도 12.7%, 재현율 85.0%.

FN = 0 — 기준점 31까지 내려야 한다. 그때 FP = 861명, 정확도는 13.9%까지 떨어진다(재현율 100.0%).

읽어 낼 것 — 놓친 환자를 3명에서 0명으로, 딱 세 명 더 줄이는 데 억울한 사람이 117명에서 861명으로 744명이나 늘었다. 마지막 몇 명을 잡는 값이 가장 비싸다. 두 무리의 점수가 겹쳐 있기 때문이고, 이것은 기준점을 아무리 잘 골라도 없앨 수 없는 대가다. 그래서 '재현율 100%를 목표로 하자'는 말은 대개 현실적인 목표가 아니다.

4. 기준점 999일 때 정확도는 98.0%, 기준점 80일 때는 98.2%다. 정확도만 보면 둘 다 아주 좋은 모델처럼 보인다. 그런데 병원에서는 둘 다 쓸 수 없다. 그 이유를 네 칸의 숫자를 들어 설명하고, '정확도가 가장 높은 기준점'과 '병원이 실제로 써야 할 기준점'이 다른 까닭을 쓰시오.
📖 모범 답안

기준점 999 — TP 0 · FN 20. 환자 20명을 한 명도 잡지 못한다. 재현율 0.0%, F1 0.0%. 진단 프로그램이라 부를 수 없다.

기준점 80 — TP 3 · FN 17. 환자 20명 중 3명만 잡고 17명을 놓친다. 재현율 15.0%다. 정확도는 999보다 0.2%p 높지만, 그 0.2%p는 멀쩡한 사람을 정상이라고 맞힌 덕분이지 환자를 잘 잡아서가 아니다.

왜 다른가 — 정확도는 TP와 TN을 한 덩어리로 더한다. 정상인 980명이 전체의 98%를 차지하므로, 정확도를 올리는 가장 쉬운 길은 그 980명을 지키는 것이다. 즉 기준점을 높여 아무도 환자라고 부르지 않는 쪽이 이긴다. 반면 병원의 목적은 환자를 찾아내는 것이므로 재현율 쪽을 봐야 한다.
더 정확히 말하면, 정확도는 놓친 환자와 억울한 사람의 대가를 1:1로 친 지표다(4절 ③). 병원에서 그 둘의 대가는 1:1이 아니다. 그래서 정확도가 고른 78과 병원이 골라야 할 (예: 100:1로 매겼을 때의) 53이 달라진다.

5. 정밀도가 더 중요한 문제와 재현율이 더 중요한 문제를 하나씩 들고, 각각에서 ① 무엇을 양성(1)으로 보는지 ② FN과 FP가 각각 현실에서 무슨 일인지 ③ 왜 그 지표를 골랐는지를 쓰시오. (수업에서 든 예 말고 새로 드는 편이 좋다.)
📖 모범 답안

재현율이 중요한 예 — 지진 조기 경보. 양성 = '큰 지진이 온다'. FN은 경보 없이 지진이 오는 것(사람이 다친다), FP는 헛경보로 잠깐 대피하는 것(불편하다). 두 대가가 비교가 안 되므로 헛경보를 감수하고라도 놓치지 않는 쪽, 즉 재현율을 본다. 같은 이치로 화재 감지기·기계 고장 예측·감염병 선별검사가 여기 속한다.

정밀도가 중요한 예 — 학교 도서관의 '연체 위험 학생' 자동 통보. 양성 = '연체할 것 같은 학생'. FN은 통보를 못 받은 학생이 하루 늦게 반납하는 것, FP는 성실한 학생이 "너 연체할 것 같다"는 통보를 받는 것이다. 뒤쪽이 훨씬 억울하고 신뢰를 깎아먹으므로 정밀도를 본다. 얼굴로 문을 열어 주는 장치, 부정행위 자동 적발, 추천 알고리즘이 같은 쪽이다.

핵심 — 지표를 고르기 전에 양성이 무엇인지부터 적는다. 같은 문제라도 양성을 뒤집으면 봐야 할 지표가 반대가 된다. 그리고 판단의 근거는 "FN과 FP 중 어느 쪽이 더 아픈가" 하나다.

6. 다음 두 물음에 답하시오.
(가) F1이 산술평균이 아니라 조화평균인 까닭은 무엇인가? 정밀도 90% · 재현율 10%인 모델의 산술평균과 F1을 각각 계산해 확인하시오.
(나) 9차시의 회귀 모델은 정확도로 잴 수 없다. 무엇으로 재야 하며, 그 값을 무엇과 나란히 놓아야 뜻이 생기는가?
📖 모범 답안

(가) 산술평균 = (0.9 + 0.1) ÷ 2 = 0.500 = 50.0%.
F1 = 2 × 0.9 × 0.1 ÷ (0.9 + 0.1) = 0.18 ÷ 1.0 = 0.180 = 18.0%.

산술평균으로 재면 이 모델이 "정밀도 50% · 재현율 50%인 모델"과 똑같은 50.0%를 받는다. 그런데 이 모델은 환자 열 명 중 아홉을 놓친다. 조화평균은 작은 쪽에 끌려가는 평균이라, 한쪽이 바닥이면 전체를 바닥으로 끌어내린다. "둘 다 어느 정도는 되어야 한다"는 요구를 숫자 하나로 표현하는 것이 F1의 목적이다. (두 값이 같을 때만 두 평균이 일치한다 — 50%·50%에서 둘 다 50.0%가 나온 것이 그 경우다.)

(나) 회귀는 MAE(평균 절대 오차)와 RMSE(제곱 평균 제곱근 오차)로 잰다. RMSE는 오차를 제곱하므로 크게 빗나간 한 건에 무거운 벌을 준다. 그래서 RMSE가 MAE보다 눈에 띄게 크면 "어딘가 크게 틀린 자료가 있다"는 신호로 읽는다 (오늘 예에서는 MAE 4.12 · RMSE 5.84, 원인은 ⑧번의 15점 차이).

그리고 어떤 값이든 기준선과 나란히 놓아야 한다. "누구에게나 평균 72.88점"이라고만 답하는 기준선의 MAE는 12.12, RMSE는 14.02였다. 모델의 4.12는 그 옆에 놓았을 때 비로소 약 3분의 1로 줄였다는 뜻이 된다. 분류의 정확도 98.0%가 아무 성과도 아니었던 것과 정확히 같은 이치다.

🔁 되돌아보기

오늘 우리는 정확도 하나를 네 칸으로 쪼개어 '어떻게 틀렸는가'를 볼 수 있게 만들었고, 기준점을 밀어 가며 놓친 환자와 억울한 사람이 실제로 맞바뀌는 것을 표와 화면에서 확인했습니다. 그리고 지표를 고르는 일이 계산이 아니라 결정이라는 것도요.
공책에 한 줄만 적어 두세요 — "내가 오늘 찾은, 놓친 환자를 3명 이하로 만드는 기준점과 그때의 FP". 다음 시간에는 기계가 스스로 선을 찾는 퍼셉트론을 만들고, 15차시에서 오늘의 네 칸으로 그 결과를 채점합니다.

🔎

더 알아보기

기준점을 옮기는 곡선, 드문 것을 놓치는 사람의 눈, 그리고 환자 비율이 바꾸는 정밀도

대각선 = 무작위로 찍기 기준점 70 FP 16명 → 가로 0.016 기준점 60 기준점 40 0 0.5 1 0.5 1 억울한 사람 비율 = FP ÷ 실제 정상 980명 재현율 = TP ÷ 20
역사

레이더 화면에서 태어난 곡선 — ROC

제2차 세계 대전 때 레이더 요원은 화면의 작은 점이 적기인지 잡음인지를 순간순간 판정해야 했습니다. 조금만 수상해도 "적기다"라고 외치면 헛경보가 쏟아지고, 확실할 때만 외치면 진짜 적기를 놓칩니다. 오늘 우리가 기준점을 밀며 본 줄다리기와 똑같지요. 이 판정 성능을 그린 곡선이 ROC 곡선(Receiver Operating Characteristic, 수신기 작동 특성)이고, 이름에 레이더 수신기의 흔적이 남아 있습니다. 1950년대에 심리학이 사람의 감각 판단을 설명하는 데 가져다 썼고, 지금은 의료 검사와 기계학습에서 널리 씁니다.

그림은 오늘 데이터로 직접 그린 ROC 곡선입니다. 3절 표의 기준점마다 세로로는 재현율, 가로로는 실제 정상인 사람 중 환자로 잘못 불린 비율(FP ÷ 980)을 찍어 이었습니다. 기준점을 내릴수록 점이 오른쪽 위로 갑니다. 곡선이 왼쪽 위 모서리에 붙을수록 좋은 검사이고, 곡선 아래 넓이(AUC)가 1이면 완벽, 0.5면 대각선 — 동전 던지기와 다를 바 없습니다.

그런데 분홍 점을 보세요. 기준점 70에서 억울한 사람은 16명인데, 가로축에서는 980으로 나누어 0.016, 거의 0에 붙어 있습니다. 같은 자리의 정밀도는 30.4%였지요. ROC 곡선은 TN이 엄청나게 많은 문제에서 실제보다 훨씬 좋아 보일 수 있습니다. 그래서 찾는 것이 드문 문제에서는 ROC와 함께 정밀도·재현율 쌍을 꼭 나란히 봅니다 — 오늘 배운 그 두 지표입니다.

공항 수하물 X선 검색대의 판독 화면 두 대 — 가방 속 전자 기판과 전선이 컬러와 흑백 X선 영상으로 보이고, 앞에 조작 패널과 기록지가 놓여 있다
현장

드물면 사람도 놓친다 — 보안 검색대의 재현율

사진은 공항 수하물 X선 검색대의 판독 화면입니다. 검색 요원은 가방 속 물건이 겹겹이 비친 영상을 보고 위험물이 있다 / 없다를 판정합니다. 오늘의 네 칸이 그대로 적용되는 일이지요. 놓치면(FN) 위험물이 비행기에 오르고, 잘못 부르면(FP) 가방을 열어 한 번 더 확인합니다. 그리고 여기서도 찾는 것이 극히 드뭅니다.

2005년 과학 학술지 『네이처』에 실린 제러미 울프(Jeremy Wolfe) 연구팀의 실험은 이 드묾이 사람의 눈까지 흔든다는 것을 보여 주었습니다. 가방 영상과 비슷한 화면에서 도구를 찾게 했더니, 목표가 자주 섞여 있을 때보다 아주 드물게 섞여 있을 때 놓치는 비율이 여러 배로 뛰었습니다. "어차피 없겠지" 하고 빨리 넘기게 되는 것 — 사람이 스스로 기준점을 올려 버리는 셈입니다.

그래서 보안 검색에서는 판독 화면에 가짜 위협 영상을 몰래 섞어 넣는 방법을 씁니다. 정답을 아는 양성을 끼워 넣어야 요원이 그중 몇 개를 잡았는지, 곧 재현율을 셀 수 있기 때문입니다. 실제 위험물은 너무 드물어서 그것만으로는 FN을 셀 수조차 없거든요. 드문 것을 찾는 일에서는 사람이든 기계든, 재현율을 일부러 재는 장치가 필요합니다.

사진: 수완나품 국제공항(태국)의 수하물 X선 판독 화면 · 출처: User:Mattes, Wikimedia Commons (Public domain)

환자 2% — 1,000명 중 20명 (오늘 데이터) 15 106 양성 121명 중 진짜 환자 15명 정밀도 12.4% 환자 50% — 1,000명 중 500명 (가정) 375 54 양성 429명 중 진짜 환자 375명 정밀도 87.4% 진짜 환자(TP) 억울한 사람(FP) 같은 검사 · 기준점 60 — 재현율 75.0% · 특이도 89.2%
오해 바로잡기

"양성이 나왔으니 거의 환자다"? — 정밀도는 환자 비율을 따라 움직인다

의학에서는 오늘의 지표를 다른 이름으로 부릅니다. 재현율은 민감도(sensitivity), 실제 정상인 사람을 정상이라 맞힌 비율 TN ÷ (TN + FP)는 특이도(specificity), 정밀도는 양성 예측도입니다. 본문 1절의 영어 도해 넷째 칸이 바로 특이도였지요.

오늘 데이터의 기준점 60은 민감도 75.0%(15 ÷ 20), 특이도 89.2%(874 ÷ 980)입니다. 둘 다 꽤 좋아 보이는 숫자지요. 그런데 이 검사에서 양성이 나온 121명 중 진짜 환자는 15명, 12.4%뿐입니다. 양성 판정을 받은 사람 열 명 중 아홉 가까이가 억울한 사람이라는 뜻입니다.

똑같은 검사를 환자가 절반인 집단에 쓴다고 계산해 보면(아래 줄) 정밀도는 87.4%로 뛰어오릅니다. 민감도와 특이도는 각각 환자끼리, 정상인끼리 나눈 비율이라 환자가 몇 %인지와 상관없이 그대로인데, 정밀도는 분모에 두 무리가 섞여 있어서 환자가 드물수록 억울한 사람에게 묻혀 버립니다. 그래서 드문 병의 선별 검사에서 양성이 나오면 곧바로 확진하지 않고 정밀 검사를 한 번 더 합니다. 여는 장면에서 "정밀 진단으로 확인해 보니"라는 말이 들어간 까닭도 여기에 있습니다.