소소하지만 소소하지 않은 개발 공부/머신 러닝 교과서

Chapter3.7 k-최근접 이웃: 게으른 학습 알고리즘, 머신러닝교과서, python

still..epochs 2022. 11. 29. 16:46

* 본 포스팅은 머신러닝교과서를 참고하여 작성되었습니다.

 

3.7 k-최근접 이웃: 게으른 학습 알고리즘

이번 장에서 언급할 마지막 지도 학습 알고리즘은 k-최근접 이웃(K-Nearest Neighbor, KNN)이다. KNN은 전형적인 게으른 학습기(lazy learner)이다. 단순하기에 게으르다고 말하는 것이 아니라 알고리즘은 훈련 데이터에서 판별 함수(discriminative functioin)를 학습하는 대신 훈련 데이터셋을 메모리에 저장하기 때문이다.

 

KNN 알고리즘은 매우 간단해서 다음 단계로 요악할 수 있다.

  1. 숫자 k와 거리 측정 기준을 선택한다.
  2. 분류하려는 샘플에서 k개의 최근접 이웃을 찾는다.
  3. 다수결 투표를 통해 클래스 레이블을 할당한다.
  4.  

k-최근접 이웃의 다수결 투표

- 선택한 거리 측정 기준에 따라 KNN 알고리즘이 훈련 데이터셋에서 분류하려는 포린트와 가장 가까운(가장 비슷한) 샘플 k개를 찾는다. 새로운 데이터 포인트의 클래스 레이블은 이 k개의 최근접 이웃에서 다수결 투표를 하여 결정한다.

 

- 이런 메모리 기반 방식의 분류기는 수집된 새로운 훈련 데이터에 즉시 적응할 수 있는 것이 주요 장점이지만 새로운 샘플    을 분류하는 계산 복잡도는 단점이다.

 

 

다음 코드를 실행하면 유클리디안(euclidean)거리 측정 방식을 사용한 사이킷런의 KNN 모델을 만든다.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=knn, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

  • 적절한 k를 선택하는 것은 과대적합과 과소적합 사이에서 올바른 균형을 잡기 위해 중요하다. 데이터셋의 특성에 알맞은 거리 측정 지표를 선택해야 한다.
  • 붓꽃 데이터셋의 센티미터 단위를 가진 특성처럼 실수 값을 가진 특성에는 보통 간단한 유클리디안 거리를 사용한다. 유클리디안 거리를 사용하려면 각 특성이 동일하게 취급되도록 표준화를 하는 것이 중요하다.