💻
손으로 ② — 빈칸 다섯을 채우고 진짜로 돌린다
12분 · 오늘의 본 실습
아래 코드가 오늘의 본 실습입니다. 길어 보이지만 여러분이 손댈 곳은 다섯 군데뿐입니다.
위쪽 대부분은 6차시에서 이미 완성한 것 —
데이터 160줄, load·clean·split·minmax_fit 같은 함수들 — 을
다시 실어 둔 것입니다. 손대지 마세요.
⚠️ 채우기 전에는 실행이 안 된다
????? 는 파이썬 문법이 아니라서,
다섯 곳을 다 채우기 전에 실행하면 SyntaxError 로 멈춥니다.
그것이 정상입니다. 오류가 가리키는 줄로 찾아가면 됩니다.
빈칸 다섯은 모두 코드의 아래쪽, nearest · knn ·
accuracy · baseline 네 함수 안에 모여 있습니다.
| 빈칸 | 어느 함수 | 물음 | 힌트 |
| ① | nearest |
무엇을 기준으로 줄을 세워야 ‘가까운 순’ 이 되나? |
item 은 (특성, 이름표) 짝이다. 특성은 item[0] |
| ② | knn |
표를 다 셌다. 다수결의 답은? |
votes 는 이름표 → 표 수 딕셔너리. 값이 가장 큰 열쇠를 돌려준다 |
| ③ | accuracy |
몇 개를 맞혔나? |
예측 knn(train, feat, k) 과 정답 label 을 견준다 |
| ④ | baseline |
훈련에서 가장 흔한 이름표는? |
②와 같은 꼴이다. counts 에서 고른다 |
| ⑤ | baseline |
늘 common 만 말하면 테스트에서 몇 개를 맞히나? |
정답이 common 과 같은 것만 센다 |
💡 다 채웠으면 이 넷을 확인한다
- 【0】 줄에 원본 160행 → 다듬은 뒤 158행, 훈련 110 · 테스트 48 이 찍혔는가.
여기가 6차시와 같아야 오늘 표가 6차시와 이어집니다.
- 【6】 표의 k=1 훈련 정확도가 100.0% 인가. 아니면 ①이나 ③이 틀렸습니다.
- 【7】의 기준선이 60.4% 인가. 39.6% 가 나왔다면 ④가
min 입니다.
- 맨 끝 【8】의 도전 셋이 다 찍히는가. 전부 도는 데 브라우저에서 2초쯤 걸립니다.
정답 다섯 줄은 이렇습니다. 먼저 스스로 채워 본 뒤에 펼쳐 보세요.
빈칸 다섯의 답 펼치기
① dist(point, item[0]) · ② max(votes, key=votes.get) ·
③ knn(train, feat, k) == label · ④ max(counts, key=counts.get) ·
⑤ label == common
②와 ④가 같은 꼴인 것에 눈길을 두세요. 다수결은 k-NN 안에도 있고 기준선 안에도 있습니다.
차이는 무엇에 대고 다수결을 하느냐뿐입니다 —
k-NN 은 가까운 이웃 k 개에게, 기준선은 훈련 데이터 전체에게 묻습니다.
그래서 k 를 훈련 크기까지 키우면 둘이 같아집니다.
잘못 채우면 무슨 일이 나는가
다섯 자리에 흔한 오답을 실제로 넣고 돌려 본 결과입니다.
①·③ 은 요란하게 죽지만, ②·④·⑤ 는 조용히 틀립니다.
| 빈칸 | 흔한 오답 | 실제로 일어나는 일 |
| ① | dist(point, item[1]) |
TypeError — 이름표(글자)에서 뺄셈을 하려 든다. 바로 멈춘다 |
| ③ | ... != label |
k=7 정확도가 14.6%. 85.4% 를 정확히 뒤집은 값이다 |
| ② | min(votes, key=votes.get) |
k=3 58.3% · k=5 33.3% · k=7 33.3% — 기준선 60.4% 아래로 떨어진다.
다만 k=1 은 70.8% 로 같다(표가 하나뿐이면 min 과 max 가 같으니까) |
| ④ | min(counts, key=counts.get) |
기준선이 ‘불가’ 39.6% 가 되어 우리 모델이 +45.8%p 로 부풀려진다.
오류가 나지 않고 표는 더 예뻐진다 |
| ⑤ | label != common |
같은 방향의 착시. 기준선 39.6% |
⚠️ 오늘 가장 무서운 자리는 ④ 다
④를 틀리면 오류도 안 나고, 결과는 더 좋아 보입니다.
발표까지 그대로 갈 수 있는 잘못입니다.
그래서 규칙 하나를 외워 둡시다 — 기준선이 유난히 낮게 나오면 먼저 기준선을 의심한다.
두 이름표의 개수를 직접 세어(가능 56 · 불가 54) 큰 쪽이 골라졌는지 확인하면 30초면 끝납니다.
코드 안에 이미 들어 있는 도전 셋
【8】 아래는 실행하면 저절로 찍히는 도전입니다. 표를 보고 물음에 답해 보세요.
①
정규화를 빼면?
훈련에서 밝기 하나가 거리 제곱의 87.14% 를 가져갑니다(폭 251).
그런데 k=7 정확도는 85.4% → 83.3%, 2.1%p밖에 안 떨어지고
k=9 에서는 뺀 쪽이 더 높습니다(83.3% vs 79.2%).
②
k 를 훈련 수만큼 키우면?
k=110 에서 테스트 60.4% — 기준선과 정확히 같습니다.
훈련 정확도는 50.9% 인데, 훈련 110 중 ‘가능’ 이 56개(50.9%)라서 그렇습니다.
두 숫자가 딱 맞아떨어지는지 확인해 보세요.
③
씨앗을 바꾸면?
씨앗 여덟 개로 재면 기준선이 41.7%~60.4%, 최고 정확도가 75.0%~85.4% 로 흔들립니다.
여덟 중 k=7 이 1등인 것은 씨앗 42 하나뿐입니다.
ℹ️ 정규화는 정확도를 올리려고 하는 것이 아니다
도전①의 결과를 보고 “그럼 정규화는 안 해도 되네” 라고 쓰면 틀립니다.
정규화의 목적은 단위를 고르는 사람의 손을 떼는 것입니다.
누군가 밝기를 0~1 눈금으로 적어 왔다면 정규화 없는 표는 통째로 달라집니다.
2단원 8차시에서 g · mg · kg 로 단위를 바꿔 가며 본 그 결론과 같습니다 —
단위를 누가 정하느냐에 답이 흔들리면, 그건 모델이 아니라 우연입니다.