이제 화면이 대신 해 주던 계산을 직접 짭니다. 채울 곳은 두 곳이에요.
💡 빈칸 ① — 무엇을 기준으로 줄을 세울까
sorted(train, key=lambda item: ?????)
item은 ([6.15, 2.95], "A")처럼 생겼습니다.
좌표는 item[0]이고 품종은 item[1]이에요.
우리가 줄 세우고 싶은 기준은 새 점과 이 항목 사이의 거리입니다.
주의 —
dist(point, item)이라고 쓰면 리스트와 문자열을 빼려다 TypeError로 죽습니다.
그건 바로 들키니 오히려 안전한 오류예요.
💡 빈칸 ② — 표를 가장 많이 받은 품종 꺼내기
votes는 {'A': 1, 'B': 2}처럼 생겼습니다.
여기서 값이 가장 큰 키를 꺼내야 해요. max()는 key=로
'무엇을 기준으로 비교할지'를 정할 수 있습니다.
함정 —
key=를 빠뜨리고 max(votes)라고만 쓰면 표를 세지 않고
가나다순으로 고릅니다. 그런데 【1】의 열 알짜리 장면에서는 A·B·B·B로
정답과 똑같이 나와서 절대 안 들킵니다.
뒤 칸에서 k를 키웠는데 답이 전부 한 품종으로 굳으면 이 자리를 의심하세요.
돌린 뒤에 할 것
- 【1】의 거리 목록에서 1위와 2위의 거리를 공책에 적으세요.
그리고 "K = 1만 A인 이유"를 그 두 줄만 근거로 두 문장으로 쓰세요.
- 【2】의 마지막에 찍히는 경계 폭 세 개를 시뮬레이터에서 손으로 채운 표와 견주세요.
같습니까? 다르다면 어느 설정이 달랐을까요?
- 씨앗
([6.15, 2.95], "A") 줄을 지우고 다시 돌려 보세요.
K = 1의 답이 무엇으로 바뀝니까? K = 3·5·9는요?
- 새 씨앗 좌표
new를 바꿔 가며, K = 1과 K = 3의 답이 갈리는 자리를
두 곳 더 찾아 적으세요.
💻
손으로 ③ — 마흔 알로 k를 갈아 끼우고 채점한다
열 알로는 정확도를 잴 수 없습니다. 그래서 씨앗을 마흔 알로 늘리고,
학습에 한 번도 쓰지 않는 테스트용 열다섯 알을 따로 두었습니다.
앞 열 줄은 방금 손으로 따진 그 열 알이에요 — 같은 데이터가 이어집니다.
이 칸에서 채울 곳은 한 곳입니다. 5차시의 규칙을 다시 묻는 자리예요.
⚠️ 빈칸 ③ — 정규화 기준을 무엇으로 잡는가
LO, HI = minmax_fit(?????)
0~1로 누를 기준(최솟값·최댓값)을 어디서 뽑아야 할까요.
훈련 데이터만입니까, 훈련 + 테스트입니까? 5차시에서 정한 규칙을 떠올리세요.
여기가 오늘 가장 고약한 자리입니다.
이 데이터에서는 훈련 + 테스트를 다 넣어도 결과가 한 자리도 안 바뀝니다.
테스트 씨앗 15개가 전부 훈련 씨앗의 범위 안에 들어 있어서 최솟값·최댓값이 그대로거든요.
실행으로는 이 실수를 절대 잡을 수 없습니다.
그런데도 규칙을 지켜야 하는 까닭이 【6】에 나옵니다.
돌린 뒤에 할 것
- 【3】의 표에서 테스트 정확도가 가장 높은 k와 그 값을 적으세요.
그리고 "무조건 B"의 점수 66.7%보다 낮은 k가 있는지 찾아 적으세요.
- 【4】에서 홀수 k의 동점 개수를 확인하세요. 전부 몇 개입니까? 왜 그렇습니까?
- 【5】에서 mg 줄과 무게만 줄이 같은지 여섯 칸을 하나씩 대조하세요.
같다면 그것이 무엇을 뜻합니까?
- 【6】의 마지막 씨앗
[9.1, 2.0]이 0~1로 눌렸을 때 1.101이 나옵니다.
이것이 왜 버그가 아닌지 두 문장으로 쓰세요.
- 부수어 보기.
k = 0으로 두면 어떻게 됩니까?
k = 41(훈련 40개보다 크게)로 두면요?
하나는 죽고 하나는 조용히 도는데, 어느 쪽이 더 위험한 오류일까요?
ℹ️ 여기서 만든 세 함수는 11차시로 간다
nearest() · knn() · accuracy() 셋은
11차시가 글자 그대로 다시 싣습니다. 거기서는 이 셋이
과적합을 재는 자로 쓰여요 — 데이터 수를 20 → 160으로 늘려 가며
훈련 정확도와 테스트 정확도가 벌어지는 폭을 잽니다.
오늘 k = 1에서 본 100.0% 대 60.0%가 바로 그 벌어짐의 첫 사례입니다.