라떼군 이야기


8 / 10강

가까운 예시로 분류하기

k-NN은 새 데이터와 가까운 학습 자료 k개를 찾아 그 답을 참고합니다. 분류에서는 보통 이웃 가운데 가장 많은 레이블을 선택합니다. 복잡한 규칙을 미리 만들지 않아 직관적이지만, 어떤 거리를 사용하느냐가 중요합니다.

세 이웃에게 물어보기

예제는 한 가지 숫자 특성만 사용합니다. 새 값 2.5 주변에서 가장 가까운 자료 3개를 찾습니다.

from collections import Counter

training = [(1, "small"), (2, "small"), (8, "large"), (9, "large")]
query, k = 2.5, 3
neighbors = sorted(training, key=lambda row: abs(row[0] - query))[:k]
votes = Counter(label for _, label in neighbors)
prediction = min(votes, key=lambda label: (-votes[label], label))
print(prediction)

결과는 small입니다. 가까운 2, 1, 8 중 small이 둘입니다. 이 예제는 동률이면 이름의 사전순으로 고릅니다. 실제 문제에서는 동률 처리와 거리 가중 투표 여부를 미리 정해야 합니다.

k가 바뀌면 판단도 달라집니다

단순히 모든 학습 자료와 거리를 비교하면, 자료 n개와 특성 d개에 대해 거리 계산에 O(nd)가 듭니다. 이웃을 고르는 비용은 선택 방법에 따라 추가됩니다. 예제는 정렬을 사용합니다.

확인 문제

시험 자료의 정답을 보면서 k를 바꾸면 왜 문제가 될까요?

해설 보기

시험 자료에 맞는 설정을 고르게 되어 새로운 자료에 대한 성능을 과대평가할 수 있습니다. k는 검증 자료나 교차 검증으로 고르고, 마지막 시험 자료는 최종 평가에 사용합니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.