Definition, pros and cons
어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용하는 알고리즘이다.
이 알고리즘을 사용하기 위해서는 가장 가까운 직선거리에 어떠한 데이터가 있는지 살펴주면 되기에 간단하다.
다만 직선 거리를 비교하기 위해서 데이터를 모두 다 가지고 있어야 하는데, 데이터가 아주 많은 경우에는 공간복잡도나 시간복잡도가 많이 커진다는 단점이 존재한다. 추가적으로 새로운 샘플이 훈련 세트의 범위를 벗어나면 엉뚱한 값을 예측할 수 있다. (특히 회귀의 경우)
Standardize
정의에서 살펴볼 수 있는 것처럼, 데이터 사이의 거리를 기준으로 판단하는 알고리즘이기에 스케일이 다르면 문제가 발생할 수 있다.
따라서 KNN을 사용하기 위해서는 반드시 Standardize 작업이 수반되어야 한다.
Classification
KNN은 Classification, Regression 2가지 방법 모두에서 활용가능한 알고리즘이다.
Classification 형태이므로 가장 가까운 이웃들을 찾아서 이를 바탕으로 어느 분류에 속하는지를 산출해준다.
이 중 먼저 Classification에서 사용하는 방법에 대해 알아보도록 하겠다.
사용방법은 다음과 같다.
from sklearn.neighbors import KNeighborsClassifier
# Fitting
kn = KNeighborsClassifier(n_neighbors = number_of_neighbors)
kn.fit(train_scaled, train_target)
# Model evaluation
target_score = kn.score(train_scaled, train_target)
test_score = kn.score(test_scaled, test_target)
위에서 볼 수 있는 것처럼 사용하는 method는 fit
, score
이 대표적이다.
fit
은 해당 데이터 값에 맞춰서 훈련하는 method라고 이해하면 되고, score
은 훈련한 것을 바탕으로 점수를 산출해준다고 생각해주면 된다.
이때, score에서 나오는 숫자는 Classification의 경우 정답의 비율
이고, n_neighbors
는 Classification을 할 때 비교할 이웃의 숫자를 지정하는 것이다. 만약 지정하지 않는 경우에는 5이다.
추가적으로 kneighbors
method도 존재하는데 입력한 데이터에 가장 가까운 이웃을 찾아 거리와 이웃 샘플의 인덱스를 튜플 형태로 반환한다.
Regression
위에서 살펴본 Classification과 달리 KNN은 Regression을 할 때에도 활용할 수 있다.
Regression 형태이므로 가장 가까운 이웃들을 찾고 해당 수치들의 평균을 구해 회귀 작업을 수행하게 된다.
기본적으로 Classification에서의 사용방법과 유사하다.
from sklearn.neighbors import KNeighborsRegressor
# Fitting
knr = KNeighborsRegressor(n_neighbors = number_of_neighbors)
kn.fit(train_scaled, train_target)
# Model evaluation
target_score = knr.score(train_scaled, train_target)
test_score = knr.score(test_scaled, test_target)
기본적으로 제공되는 method는 사용방법이 동일하다.
다만, score
을 통해 나오는 값의 의미는 Classification일 때와 상이하다.
앞에서 언급한 것처럼 Classification의 경우는 정답을 맞힌 개수의 비율을 산출하지만, Regression의 경우는 해당 방법으로 평가할 수 없다. 따라서 $R^2$(Coefficient of determination)라는 다른 방법을 활용해서 모델을 평가하게 된다.
이때, $R^2$의 의미를 알아보면 다음과 같다.
$$R^2 = 1 - \frac {Sum(target - prediction) ^ 2} {Sum(target - average) ^ 2}$$
식에서 볼 수 있는 것처럼, target값이 prediction에 근사하게 되면 1에 가까워지고 average에 근사하게 되면 0에 가까워진다.
따라서 해당 값이 1에 가까워질수록 더 정확한 모델이라고 판단할 수 있다.
Overfitting/Underfitting
데이터를 학습함에 있어서 고려해야하는 사항은 Overfitting 및 Underfitting의 여부이다.
Overfitting
모델이 훈련 세트에 과하게 fitting되어 있는 상황을 의미한다. 훈련 세트를 평가했을 때의 점수는 굉장히 좋으나, 테스트 세트의 경우는 굉장히 나쁜 상황이 발생할 때가 대표적이다.
Underfitting
모델이 너무 단순하여 훈련 세트를 적절하게 훈련하지 못한 상황을 의미한다. 훈련 세트보다 테스트 세트의 점수가 높거나, 두 점수가 모두 너무 낮은 경우가 대표적이다. (기본적으로 훈련 세트를 가지고 훈련을 시키므로 훈련 세트의 점수가 더 높아야 한다.)
위에서 볼 수 있는 것처럼 훈련 세트를 훈련시키는 과정에서 모델이 너무 복잡하면 overfitting이 나오게 되고, 그 반대는 underfitting이 발생하게 된다. (단, 앞에서 언급한 점수의 경우 score method를 통해 나온 점수를 의미한다.)
KNN에서 모델을 조금 더 복잡하게 만드는 방법은 고려되는 이웃의 수를 늘려주면 된다.
고려되는 이웃의 수가 커질수록 모델이 더 단순해지므로 Train set에 fitting되는 정도가 작아지게 된다.
이때, 이웃의 수는 (기본적으로 훈련 세트를 가지고 훈련을 시키므로 훈련 세트의 점수가 더 높아야 한다.)n_neighbors
parameter로 수정할 수 있다.