KNN (K-최근접 이웃) 알고리즘

조은별·2025년 5월 10일
post-thumbnail

이 문서는 머신러닝 실습에서 배우게 된 KNN(K-Nearest Neighbors) 알고리즘에 대한 이론과 실습 이해를 바탕으로 정리한 내용입니다.
단순 개념뿐만 아니라 수학적 원리, 하이퍼파라미터 튜닝, 실무 적용 시 고려할 점까지 포함했습니다.

KNN (K-최근접 이웃) 알고리즘 정리


1. KNN이란?

KNN(K-Nearest Neighbors)은 가장 직관적이고 단순한 머신러닝 알고리즘 중 하나입니다.
새로운 데이터가 주어졌을 때, 기존 데이터 중에서 가장 가까운 K개의 이웃을 찾아
그 이웃들의 라벨(또는 값)을 기준으로 분류(Classification)하거나 회귀(Regression)를 수행합니다.


2. 작동 원리 요약

  1. K값을 설정한다 (ex. 3, 5 등 홀수 권장)
  2. 예측하고 싶은 데이터와 훈련 데이터 각각의 거리를 계산한다
  3. 가장 가까운 K개의 데이터를 찾는다
  4. 그 K개의 클래스(또는 값) 중 다수결로 분류하거나 평균값으로 회귀 결과를 낸다

3. 거리 계산 방식 - 왜 피타고라스?

KNN은 데이터 간의 거리를 비교하기 위해 보통 유클리드 거리를 사용합니다.
이 유클리드 거리는 피타고라스 정리를 기반으로 계산됩니다.

2차원 예시:

두 점 (x1, y1), (x2, y2) 간의 거리:

d = sqrt((x1 - x2)^2 + (y1 - y2)^2)

일반화 (n차원):

d = sqrt(sum((xi - yi)^2))

기타 거리 계산 방식도 존재함:

  • 맨해튼 거리 (L1 거리)
  • 민코프스키 거리
  • 코사인 유사도 (문서 유사도에서 자주 사용)

4. K 값 설정 - 왜 홀수?

  • K가 너무 작으면 과적합(overfitting) 위험
    → 소수의 이상치에 민감해짐

  • K가 너무 크면 과소적합(underfitting) 위험
    → 국지적인 패턴을 놓칠 수 있음

  • 보통 홀수를 쓰는 이유는:

    • 이진 분류(binary classification) 문제에서 동점 방지를 위해
    • K가 짝수면 다수결 결과가 50:50으로 나뉘는 경우가 발생 가능

5. 분류 vs 회귀에서 KNN

  • 분류(Classification):
    → 가장 가까운 K개의 클래스가장 많은 것으로 예측

  • 회귀(Regression):
    → 가장 가까운 K개의 평균 or 가중 평균으로 예측


6. sklearn 실습 예시

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 데이터 불러오기
X, y = load_iris(return_X_y=True)

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# KNN 모델 생성
knn = KNeighborsClassifier(n_neighbors=3)

# 학습
knn.fit(X_train, y_train)

# 예측
y_pred = knn.predict(X_test)

# 정확도 확인
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))

7. 실무 팁 및 고려사항

  • 데이터 스케일링은 필수!

    • KNN은 거리 기반이기 때문에 Feature 간 단위 차이가 크면 제대로 작동하지 않음
    • StandardScaler, MinMaxScaler 등을 사용하여 정규화 필요
  • 고차원에서는 성능 저하

    • 차원이 높아질수록 모든 포인트가 서로 비슷한 거리로 떨어지는 차원의 저주 발생
    • → PCA 등으로 차원 축소 후 사용
  • K 선택은 교차검증으로

    • 여러 K 값을 시험하며 GridSearchCV, cross_val_score 등을 통해 최적 K 탐색

8. 시각적 예시

import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier

# 샘플 데이터 생성
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_redundant=0, random_state=0)
model = KNeighborsClassifier(n_neighbors=5).fit(X, y)

# 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
plt.title("2차원 데이터에서 KNN 분류 결과")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

9. 한 줄 요약

KNN은 가장 간단하지만 강력한 비모수(non-parametric) 학습 알고리즘이다.
거리 기반이므로 정규화 필수, K값과 차원의 수에 민감하다.

profile
기록과 회고를 통해 성장하는 데이터, AI 엔지니어 지망생입니다.

0개의 댓글