본문 바로가기
Archive/데이터 분석 관련

[Data] kNN 이해하기 및 활용

by 다람이도토리 2021. 8. 28.

kNN 알고리즘 원리

kNN(k-Nearest Neighbor)은 분류 또는 회귀 모두에서 사용 가능한 모델이다. 일반적으로는 분류에서 사용하는 모델이나, 회귀에서도 kNN을 적용할 수 있다.

kNN의 개념

kNN은 주어진 데이터셋에서 새로운 점이 들어왔을 때, 해당 점을 어떻게 분류할지에 대해 고려하는 것이 문제이다.

예를 들어, 다음과 같은 데이터 셋이 주어졌을 때 붉은색과 녹색으로 분류하는 문제를 고려하자.

여기서, 검은색 데이터가 새로 들어 왔을대를 고려할 때, k = 3이라면 검은색에서 가장 가까운 데이터 3개를 확인한다.

여기서는 빨강 1개, 초록 2개이니 검은색을 초록색으로 분류하게 된다.

 

모델 설계시 고려해야 할 사항

정규화

변수의 값이 적당히 퍼진 정도가 아니라, 매우 넓게 퍼진다면 편차가 너무 커서 결론이 올바르게 나지 않을 수 있다. 이를 위해서는 특성을 모두 고르게 반영하기 위해, 정규화를 고려해야 할 것이다.

k값 선택

k값이 너무 작다면 : 오버피팅이 발생한다.
k값이 너무 크다면 : 언더피팅이 발생한다.

k값이 너무 크다는 것은, 모든 점이 동일한 방식으로 분류되므로 점 사이의 거리가 의미가 없어져 언더피팅이 발생하게 된다. 단, k값이 너무 작다면 근처의 점을 민감하게 영향받기에 오버피팅이 발생하게 된다.

 

응용 - kNN 회귀에 적용하기

scikit-learn의 kNeighhborsRegresor을 통해 kNN을 회귀에도 적용이 가능하다.

이것의 경우는 근처의 점들로 분류를 하는 것 대신 근처 k개의 점들의 평균을 통해 예측할 수 있다.

from sklearn.datasets import load_boston
from sklearn import neighbors
from sklearn.model_selection import train_test_split

boston = load_boston()
K = 5

X_train, X_test, y_train, y_test = train_test_split(boston.data, 
                                                boston.target,
                                                test_size = 0.2)
                                                
model = neighbors.KNeighborsRegressor(n_neighbors = K)
model.fit(X_train, y_train)
pred = model.predict(X_test)

 

응용 - kNN을 통한 결측치 채우기

결측치를 채울 때에도 범주형 결측치의 경우는 최빈값, 연속형일 경우 데이터의 중앙값 및 대체값으로 대체한다.