KNN 최근접 이웃 알고리즘

John
4 min readFeb 2, 2020

--

최근 캐글 스터디를 진행하게 되면서 EDA와 Feature Engineering 부분을 제외한 modeling부분을 각자 한 사람씩 맡아서 발표하기로 과제가 주어졌고, 나는 지도 학습 알고리즘 중 KNN 최근접 이웃 알고리즘을 공부해가기로 했다.

지도 학습 알고리즘

  1. 최근접 이웃 (K-Nearest Neighbor)
  • 레이블(정답)이 없는 예시를 분류하기 위한 알고리즘.
  • 가장 고전적이고 직관적이라는 특징이 있음

2. 나이브 베이즈
3. 의사결정나무
4. 분류 규칙 학습자
5. 선형 회귀
6. 회귀 트리
7. 모델 트리
8. 신경망
9. 서포트 벡터 머신

지도 학습에는 크게 9가지 정도 대표적인 알고리즘이 있는데, 그 중에서도 KNN은 가장 고전적이면서 직관적인 방법으로 널리 알려져 있다

분류와 군집화

분류 : 라벨이 있음, 지도 학습

군집화 : 라벨이 없음, 비지도 학습

먼저 KNN에 대해서 알기 전에 분류와 군집화의 차이점을 알아볼 필요가 있다. 분류는 말 그대로 정답이 있는 데이터(라벨)을 지도학습을 통해 분류하는 것을 이야기하고, 군집화는 정답이 없는 데이터를 클러스터링 하는 방법을 이야기한다.

클러스터링 군집화 차이

여기서 KNN 알고리즘은 라벨이 있는 데이터 속에서 라벨이 없는 데이터를 어떻게 분류할 것인지를 찾기 위한 분류에 속한다

KNN 최근접 이웃법

KNN의 기본적인 로직은 다음과 같다.

  • 새로운 샘플 가까운 거리에 있는 몇 가지 라벨을 함께 본다.
  • 그리고 가장 빈도가 높은 것을 통해 분류한다.

그럼 여기서, 가까운 거리와 빈도가 높은 것의 기준을 알아보자.

(1) 가까운 거리 척도의 단위 — 표준화 (유클리드 거리)

ex1 ) A-N간의 유클리드 거리는 루트10 -> 3.1xx
ex2 ) B-N간의 유클리드 거리는 루트8 -> 2.8xx

-> 여기서 N은 B가 더 가까운 것으로 측정이 된다.

(2) 빈도가 높은 것의 기준 — K의 개수

출처: 데이터 캠프
  • 여기서 K=3일 때는 새로운 샘플이 세모로 분류되지만 K=7일 때는 별표로 분류된다. 여기서 주의할 점은 K의 개수가 짝수일 경우에는 동점이 발생할 수 있기에 홀수로 지정해줘야 한다는 것이다.

(3) 장점

  • 단순하다. 성능이 좋다. 모델 훈련 시간이 필요 없다

(4) 사용방법

  • 각 column마다 데이터의 scale이 다를 것이기 때문에 수치형 데이터들의 값을 모두 0~1사이로 변환시켜줘야한다. (데이터 정규화)
normalized = (x-min(x))/(max(x)-min(x))

단, 명목/범주형 데이터의 경우 one hot encoding을 사용해 더미 변수로 만들어줘야 한다.

one hot encoding

샘플 파이썬 코드

# 전체 코드
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
print("테스트 세트 정확도 : {:.3f}".format(knn.score(X_test,y_test)))#1. train_test 분리
#2. 훈련 데이터셋으로 부터 모델을 만들기 위해 knn객체를 만들고 fit 메소드 사용
#3. test 데이터를 통해 모델을 평가할 때는 predict함수를 사용하고, knn 객체의 score 함수로 측정가능

--

--

John
John

Written by John

기술적인 성장을 희망합니다

No responses yet