K-Nearest Neighbors(KNN) 는 가장 이해하기 쉬운 머신러닝 알고리즘 중 하나입니다. 새로운 샘플이 들어오면 가장 가까운 학습 데이터들을 찾아 그 결과를 이용해 예측합니다.
KNN은 일반적으로 지도학습(Supervised Learning) 에 사용됩니다.
동작 과정
- 학습 데이터와 Label을 준비합니다.
- 새 샘플과 모든 학습 샘플의 거리를 계산합니다.
- 거리가 가까운 순서로 정렬합니다.
- 가장 가까운
K개를 선택합니다. - 분류에서는 가장 많이 등장한 클래스를 결과로 선택합니다.
K의 의미
K는 의사결정에 사용하는 이웃의 수입니다.
K = 1이면 가장 가까운 하나의 샘플만 사용합니다. K = 5이면 다섯 개의 이웃이 투표합니다.
이진 분류에서는 동점을 줄이기 위해 3, 5, 7과 같은 홀수를 자주 사용하지만 최적의 K는 Validation을 통해 결정하는 것이 좋습니다.
Euclidean Distance
가장 널리 사용되는 거리 중 하나는 유클리드 거리입니다.
d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
값이 작을수록 두 샘플이 선택된 Feature 기준으로 더 가깝습니다.
Feature Scaling이 중요한 이유
한 Feature는 1~100이고 다른 Feature는 1~500000이라면 큰 범위의 Feature가 거리 계산을 지배할 수 있습니다. 따라서 Standardization이나 Min-Max Scaling을 자주 사용합니다.
Classification과 Regression
Classification에서는 K개 이웃 중 가장 많은 클래스를 선택합니다.
Regression에서는 가장 가까운 이웃들의 평균 또는 가중 평균을 사용할 수 있습니다.
장점
- 매우 이해하기 쉽습니다.
- 복잡한 학습 과정이 필요하지 않습니다.
- 작은 데이터셋에서 유용합니다.
- Classification과 Regression 모두에 사용할 수 있습니다.
한계
- 예측할 때 많은 거리 계산이 필요할 수 있습니다.
- Feature Scale에 민감합니다.
- 불필요한 Feature가 많으면 성능이 떨어질 수 있습니다.
- 고차원에서는 거리의 의미가 약해질 수 있습니다.
K 선택
너무 작은 K는 Noise에 민감하고, 너무 큰 K는 지역적인 패턴을 지나치게 부드럽게 만들 수 있습니다. 여러 K 값을 Validation 데이터에서 비교하는 방법이 일반적입니다.
활용 사례
- 고객 행동 분류
- 유사도 기반 추천
- 간단한 이상치 탐지
- 의료 샘플 분류
- 패턴 인식
- 빠른 Baseline 모델
구현 구조
calculate distance to every training sample
sort by distance
take the nearest K
count labels
return the most frequent label
제공된 JavaScript 프로젝트의 구현도 Euclidean Distance를 계산하고 정렬한 뒤 가장 가까운 K개의 Label을 집계하는 구조입니다.
결론
KNN의 핵심 가정은 간단합니다. 서로 비슷한 샘플은 비슷한 결과를 가질 가능성이 높다는 것입니다.
실제 적용에서는 K, 거리 함수, 스케일링, 데이터 크기와 차원의 수를 함께 고려해야 합니다.