머신러닝/지도학습

K-최근접 이웃(K-NN) 알고리즘

데이터_박과장 2023. 3. 20. 11:41

KNN(K-Nearest Neighbors, 최근접 이웃)은 지도학습(supervised learning)에서 사용되는 분류(classification) 및 회귀(regression) 알고리즘 중 하나입니다.

 

여기서 말하는 분류(Classification) 알고리즘은 지도학습(Supervised Learning)의 일종으로, 입력 데이터(input)를 미리 정의된 카테고리 또는 클래스(class) 중 하나로 분류하는 모델을 학습하는 알고리즘입니다. 분류 알고리즘은 다양한 분야에서 활용되며, 예를 들어 스팸 메일 필터링, 질병 진단, 이미지 분류 등 다양한 분야에서 사용됩니다.

KNN 알고리즘은 새로운 데이터가 주어졌을 때, 이 데이터와 가장 가까운 K개의 이웃 데이터들을 찾아서 이 데이터의 클래스 또는 값을 예측하는 방식으로 동작합니다. 여기서 이웃 데이터들은 거리(distance)를 기반으로 판단됩니다. 즉, 가장 가까운 거리에 있는 K개의 데이터들을 선택하여 그들이 속한 클래스나 값으로 예측하는 것입니다.

아래 그림으로 설명하자면, 새로운 데이터 포인트는 어느 그룹에 속하는 게 맞는지를 분류하는 것이 되겠습니다.

 

출처: MEDIUM.COM

 

K 값 정하는 방법

K-NN (K-Nearest Neighbors) 알고리즘에서 K값은 분류하는 데이터 포인트와 가장 가까운 K개의 이웃 데이터 포인트를 선택하는 데 사용됩니다.

K값을 선택하는 것은 알고리즘이 어떻게 작동할지에 영향을 미칩니다. 작은 K값은 데이터 포인트와 가까운 이웃들의 특징을 보다 잘 반영하지만, 잡음과 이상치 등 노이즈를 포함하기 쉽습니다. 반대로 큰 K값은 더 많은 이웃을 포함하기 때문에 잡음과 이상치 등 노이즈의 영향을 줄이지만, 데이터 포인트 주변의 세부적인 특성을 파악하기 어렵습니다.

따라서 적절한 K값을 선택하는 것은 분류 정확도를 높이는 데 중요합니다. K값을 선택하는 방법에는 교차 검증 등의 방법을 사용하여 최적의 K값을 찾는 것이 일반적입니다.

K값을 선택할 때는 데이터셋의 특성과 분류 문제의 성격에 따라 적절한 K값을 선택해야 합니다. 데이터셋이 노이즈가 많은 경우 작은 K값을 선택하고, 데이터셋이 복잡한 패턴을 가지고 있거나 클래스 간 경계가 모호한 경우 큰 K값을 선택하는 것이 적합할 수 있습니다.

 

출처: MEDIUM.COM

 

 

K-NN (K-Nearest Neighbors) 알고리즘 사용예시

 

예를 들어, KNN 알고리즘을 사용하여 붓꽃(iris)의 품종을 분류하는 문제를 해결할 수 있습니다. 이 경우, 각 붓꽃의 꽃잎(petal)과 꽃받침(sepal)의 길이와 너비를 측정하여 데이터로 사용합니다. 그리고 새로운 붓꽃의 꽃잎과 꽃받침의 길이와 너비를 측정하면, KNN 알고리즘을 사용하여 가장 가까운 이웃 데이터들을 찾아서 그들이 속한 품종으로 분류할 수 있습니다.

 

비즈니스 관련 예를 들자면, KNN 알고리즘을 사용하여 소비자가 온라인에서 구매한 제품들을 기반으로 다음에 구매할 제품을 예측하는 추천 시스템을 만들 수 있습니다. 이 경우, 과거 구매 이력 데이터를 사용하여 KNN 알고리즘을 적용하고, 새로운 소비자가 구매한 제품들을 기반으로 가장 가까운 이웃 데이터들을 찾아서 그들이 구매한 제품들을 추천하는 것입니다.

 

붓꽃예시는 머신러닝책인 introduction to machine learning with python에 수록되어 있으니 필요하신 분들은 책을 구매하셔서 학습하시기 추천합니다. KNN 알고리즘을 사용하여 제품 추천 시스템을 구현하는 방법은 다음과 같습니다.

먼저, 사용자가 이전에 구매한 제품 정보와 해당 제품의 특징 정보를 데이터로 수집합니다. 이 데이터를 학습 데이터로 사용하여 KNN 모델을 학습시킵니다. 그리고 새로운 사용자가 이전에 구매한 제품 정보와 해당 제품의 특징 정보를 입력으로 받아 KNN 모델을 사용하여 유사한 사용자와 그들이 구매한 제품 정보를 찾습니다. 마지막으로, 유사한 사용자들이 구매한 제품 정보를 분석하여 새로운 사용자가 구매할 가능성이 높은 제품을 예측합니다.

아래는 파이썬 코드 예시입니다. 예시를 위해 scikit-learn 라이브러리에서 제공하는 KNeighborsClassifier 모델을 사용합니다.

 

 

 

K-NN (K-Nearest Neighbors) 알고리즘의 장점

 

  • 간단하고 이해하기 쉬움:
    K-NN 알고리즘은 매우 간단하며, 데이터 포인트 간 거리 기반으로 분류 또는 회귀 문제를 해결합니다. 이러한 간단한 구조로 인해, 데이터의 복잡도가 높지 않은 경우 적은 노력으로 분류기를 만들 수 있습니다.

 

  • 학습 데이터의 분포를 고려하지 않아도 됨
    K-NN 알고리즘은 학습 데이터의 분포나 특성을 고려하지 않습니다. 즉, 데이터가 어떤 분포를 따르더라도 거리 기반으로 분류가 가능합니다. 이러한 특성으로 인해 K-NN 알고리즘은 데이터셋의 특성을 파악하기 어려운 경우에도 적용할 수 있습니다.

 

  • 높은 분류 정확도
    K-NN 알고리즘은 데이터 포인트 간 거리 기반으로 분류하기 때문에, 분류의 정확도가 높습니다. 특히, 클래스 간 경계가 잘 구분되는 경우에는 분류 성능이 더욱 향상됩니다.

 

  • 적은 데이터셋에서도 잘 작동함
    K-NN 알고리즘은 적은 양의 학습 데이터에서도 잘 작동합니다. 이는 학습 데이터가 많지 않거나, 학습 데이터가 많아도 분류하기 어려운 경우에 유용합니다.

 

  • 다목적으로 사용 가능
    K-NN 알고리즘은 분류와 회귀 문제 모두에 적용할 수 있습니다. 즉, 데이터 포인트가 어떤 값에 속하는지 판별하는 분류 문제 뿐만 아니라, 데이터 포인트의 값을 예측하는 회귀 문제에도 적용할 수 있습니다.

 

따라서 K-NN 알고리즘은 데이터 분류나 회귀 문제를 해결할 때, 간단하고 높은 분류 정확도를 가지는 분류기를 구현할 수 있습니다.



K-NN 알고리즘의 단점

 

  • 계산 복잡도가 높음:
    K-NN 알고리즘은 모든 훈련 데이터를 기억해야 하므로, 데이터가 많을수록 메모리 사용량이 늘어나고, 새로운 데이터를 분류할 때마다 모든 데이터와의 거리를 계산해야 합니다. 이러한 계산 복잡도 때문에 대규모 데이터셋에서는 시간이 많이 소요됩니다.

 

  • 차원의 저주:
    데이터의 차원이 늘어나면, 공간의 부피가 기하급수적으로 커지는데, 이러한 현상을 "차원의 저주(curse of dimensionality)"라고 합니다. K-NN 알고리즘도 차원의 저주로 인해 정확도가 저하됩니다. 이를 해결하기 위해서는 차원 축소 기법 등을 적용할 수 있습니다.

 

  • 이상치(outlier)에 민감함:
    K-NN 알고리즘은 주변 이웃 데이터를 기반으로 분류를 수행하기 때문에, 이상치(outlier)에 민감합니다. 이상치가 존재하면, 분류 결과가 올바르지 않을 가능성이 높습니다.

 

  • 클래스 불균형 문제:
    클래스 불균형(class imbalance) 문제는 한 클래스의 데이터가 다른 클래스의 데이터보다 월등히 많은 경우를 의미합니다. 이러한 경우, K-NN 알고리즘은 적은 클래스의 데이터를 제대로 분류하지 못할 수 있습니다. 이를 해결하기 위해서는 샘플링 기법 등을 적용할 수 있습니다.

 

따라서 K-NN 알고리즘은 간단하고 직관적이지만, 데이터셋의 크기나 차원, 이상치, 클래스 불균형 등 다양한 요소들을 고려하여 사용해야 합니다.