yuns
3. 머신러닝의 주요 알고리즘 - k-최근접 이웃(KNN) 본문
반응형
1. KNN이란?
K-최근접 이웃(K-Nearest Neighbors, KNN)은 지도 학습(Supervised Learning) 알고리즘 중 하나로, 분류(Classification)와 회귀(Regression) 문제를 해결하는 데 사용됩니다. KNN은 새로운 데이터 포인트가 주어졌을 때, 가장 가까운 K개의 이웃을 참고하여 클래스를 결정하는 방식으로 작동합니다.
2. KNN의 작동 원리
KNN은 훈련 데이터로부터 명시적인 모델을 학습하지 않고, 단순히 거리 기반 비교(distance-based comparison) 를 수행하여 예측하는 비모수(non-parametric) 알고리즘입니다.
- 새로운 데이터 포인트가 주어지면,
- 기존 데이터와의 거리를 계산합니다.
- 가장 가까운 K개의 이웃을 선택합니다.
- 이웃들의 클래스를 확인하고, 다수결 투표(분류) 또는 평균(회귀)으로 결과를 결정합니다.
거리 측정 방법
- 유클리드 거리(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 값을 찾기 위해 교차 검증을 활용하고, 표준화를 통해 거리 기반 알고리즘의 성능을 향상시키는 것이 중요합니다.
반응형
'머신러닝' 카테고리의 다른 글
4. 머신러닝 모델 개발 과정 - Feature Selection (0) | 2025.03.16 |
---|---|
4. 머신러닝 모델 개발 과정 - 데이터 수집 및 전처리 (0) | 2025.03.15 |
3. 머신러닝의 주요 알고리즘(4) - Support Vector Machine (0) | 2025.03.14 |
3. 머신러닝의 주요 알고리즘(3) - 랜덤 포레스트 (Random Forest) (0) | 2025.03.14 |
3. 머신러닝의 주요 알고리즘(2) - 의사결정나무 (Decision Tree) (0) | 2025.03.13 |