yuns

3. 머신러닝의 주요 알고리즘 - k-최근접 이웃(KNN) 본문

머신러닝

3. 머신러닝의 주요 알고리즘 - k-최근접 이웃(KNN)

yuuuun 2025. 3. 15. 02:37
반응형

1. KNN이란?

K-최근접 이웃(K-Nearest Neighbors, KNN)은 지도 학습(Supervised Learning) 알고리즘 중 하나로, 분류(Classification)와 회귀(Regression) 문제를 해결하는 데 사용됩니다. KNN은 새로운 데이터 포인트가 주어졌을 때, 가장 가까운 K개의 이웃을 참고하여 클래스를 결정하는 방식으로 작동합니다.

2. KNN의 작동 원리

KNN은 훈련 데이터로부터 명시적인 모델을 학습하지 않고, 단순히 거리 기반 비교(distance-based comparison) 를 수행하여 예측하는 비모수(non-parametric) 알고리즘입니다.

  1. 새로운 데이터 포인트가 주어지면,
  2. 기존 데이터와의 거리를 계산합니다.
  3. 가장 가까운 K개의 이웃을 선택합니다.
  4. 이웃들의 클래스를 확인하고, 다수결 투표(분류) 또는 평균(회귀)으로 결과를 결정합니다.

거리 측정 방법

  • 유클리드 거리(Euclidean Distance): 가장 일반적인 거리 측정 방식
  • 맨해튼 거리(Manhattan Distance): 직각 거리 측정 방식
  • 코사인 유사도(Cosine Similarity): 벡터 간 각도를 이용한 유사도 측정

3. K 값 선택 방법

  • K 값이 너무 작으면(예: K=1) → 모델이 노이즈에 민감하여 과적합(Overfitting) 발생 가능
  • K 값이 너무 크면(예: K=n) → 모델이 일반화되지만, 성능이 떨어질 수 있음
  • 일반적으로 홀수(K=3,5,7...) 로 설정하여 동점 방지
  • 최적의 K 값은 교차 검증(Cross Validation) 을 통해 결정 가능

4. 파이썬을 이용한 KNN 구현

파이썬의 scikit-learn 라이브러리를 사용하여 간단한 KNN 모델을 구현해보겠습니다.

(1) 데이터 준비 및 시각화

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 로드 (Iris 데이터셋 사용)
iris = datasets.load_iris()
X = iris.data[:, :2]  # 꽃받침 길이와 너비만 사용
y = iris.target

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

# 데이터 표준화 (KNN은 거리 기반 알고리즘이므로 스케일링이 중요함)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 데이터 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.title('Iris Dataset Visualization')
plt.show()

(2) KNN 모델 학습 및 평가

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# KNN 모델 생성 및 학습
knn = KNeighborsClassifier(n_neighbors=5)  # K=5로 설정
knn.fit(X_train, y_train)

# 예측 및 정확도 평가
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'KNN 모델 정확도: {accuracy:.2f}')

- 모델 정확도: 80%로, SVM보다는 낮음을 확인할 수 있음

(3) 결정 경계 시각화

def plot_decision_boundary(model, X, y):
    h = .02  # 격자 간격
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
    plt.xlabel('Sepal Length')
    plt.ylabel('Sepal Width')
    plt.title('KNN Decision Boundary')
    plt.show()

plot_decision_boundary(knn, X, y)

5. KNN의 장점과 단점

✅ 장점

  • 구현이 간단하고 직관적
  • 선형, 비선형 데이터 모두 적용 가능
  • 학습 시간이 거의 필요 없음 (Lazy Learning)

❌ 단점

  • 데이터가 많아지면 계산 비용 증가 (예측 시 모든 데이터를 비교해야 함)
  • 고차원 데이터에서는 거리 계산의 정확도가 떨어지는 차원의 저주(Curse of Dimensionality) 문제 발생 가능
  • 이상치(Outlier)에 취약

6. 결론

K-최근접 이웃(KNN)은 간단하면서도 강력한 지도 학습 알고리즘으로, 특히 분류 문제에서 많이 사용됩니다. 다만, 데이터가 많아질수록 계산 비용이 증가하고, 차원의 저주 문제에 취약할 수 있으므로 PCA(주성분 분석) 등 차원 축소 기법 을 적용하는 것도 고려할 수 있습니다.

최적의 K 값을 찾기 위해 교차 검증을 활용하고, 표준화를 통해 거리 기반 알고리즘의 성능을 향상시키는 것이 중요합니다.

반응형
Comments