머신러닝 모델 소개 (3) - KNN (K-Nearest Neighbor)

Mozen

·

2023. 7. 10. 13:42

반응형

반응형
머신러닝 모델 소개 시리즈의 세 번째 글입니다. KNN(K-Nearest Neighbors)은 간단하면서도 강력한 분류 알고리즘으로 알려져 있습니다. KNN은 새로운 데이터를 분류할 때, 해당 데이터 주변 K개의 이웃들을 찾고 다수결 방식을 통해 분류합니다. 이번에는 KNN의 기본 개념을 소개하고, 파이썬의 Scikit-learn 라이브러리를 사용하여 실제 데이터에 KNN을 적용하는 방법을 알아보겠습니다.

 

1. 모델 설명

 

    K-NN(K-Nearest Neighbor Algorithm)은 간단하지만 높은 정확성을 가져 흔히 사용되는 분류 알고리즘입니다. 간단하게 설명하면, 새로운 데이터가 들어왔을 때 K개의 가장 가까이 있는 데이터들과 비교하여 예측하고 분류하는 알고리즘입니다. 예를 들어, 아래 그림처럼 다섯개의 파란색 데이터와 다섯개의 노란색 데이터가 기존에 주어졌다고 하겠습니다. 새로운 데이터(빨간색 별)이 주어졌을 때, 새로운 데이터를 파란색으로 분류할 것인지 노란색으로 분류할 것인지를 K-NN을 통해 간단하게 정할 수 있습니다. 주변 이웃(k)을 3으로 설정하였을 때는 새로운 데이터와 가장 가까운 데이터 3개 중 노란색 데이터가 다수이기 때문에 새로운 데이터는 노란색으로 분류됩니다. 반면, k를 7로 설정하였을 때는 파란색 데이터가 다수이기 때문에 새로운 데이터는 파란색으로 분류됩니다.

주변 이웃(k) 정의를 3과 7로 한 KNN 예시

 


    데이터 분류 작업에 KNN을 적용할 때 고려해야 할 몇 가지 중요한 요소가 있습니다.

    첫째, KNN에서의 K 값은 이웃의 수를 의미합니다. 즉, 분류할 때 고려할 이웃의 개수입니다. K 값은 모델의 성능에 직접적인 영향을 미치므로 적절한 값을 선택하는 것이 중요합니다. 작은 K 값은 노이즈에 민감하게 반응할 수 있고, 큰 K 값은 결정 경계를 부드럽게 만들 수 있으나 클래스 사이의 경계를 흐리게 할 수 있습니다. 따라서 적절한 K 값 선택은 모델의 정확도에 영향을 줄 수 있습니다.

    둘째, KNN은 데이터 간의 거리(유사도) 측정에 의존합니다. 일반적으로 유클리디안 거리(Euclidean distance)를 사용하지만, 데이터셋의 특성에 따라 다른 거리 측정 방법(Manhattan Distance, Minkowski distance, Hamming distance 등)을 선택할 수 있습니다. 거리 측정 방법은 모델의 성능에 영향을 미치므로 적절한 거리 측정 방법을 선택하는 것이 중요합니다.

    셋째, KNN은 데이터의 분포에 민감한 모델입니다. 데이터셋이 고차원이거나 특성 간에 상관관계가 있는 경우, 올바른 결과를 얻기 위해 데이터를 사전에 정규화하는 것이 중요합니다. 예를 들어 닭의 무게와 길이를 이용하여 닭을 분류할 때 무게의 범위가 100g~1300g이고 길이의 범위가 0.1m~0.5m라고 하면, 데이터가 거리에 미치는 영향은 무게가 굉장히 크고 길이는 영향을 미치지 않게 됩니다. 이처럼 두 특성의 범위가 매우 다른 경우를 두 특성의 스케일(scale)이 다르다고 합니다. 이를 방지하기 위해 스케일링 작업을 수행하거나, 주성분 분석(PCA)과 같은 차원 축소 기법을 적용할 수 있습니다. 데이터 전처리는 모델의 성능을 향상시키는 데 도움이 됩니다.

    마지막으로, KNN은 계산 비용이 높은 알고리즘입니다. 예측할 데이터 포인트와 모든 훈련 데이터 포인트 간의 거리를 계산해야 하기 때문에, 데이터셋의 크기가 커지면 계산 비용이 증가합니다. 특히 대규모 데이터셋이나 고차원 데이터의 경우, 모든 데이터 포인트 간의 거리를 계산하는 작업이 많은 연산량을 필요로 합니다. 따라서 대규모 데이터세트를 다룰 때는 주의가 필요하며, 데이터세트의 크기에 따라 모델을 적절히 조정해야 합니다.

 

 

2. Scikit-learn 라이브러리를 활용한 KNN 사용 방법


    KNN은 데이터를 분류하는 데 사용되는 지도 학습(Supervised Learning) 알고리즘입니다. 주어진 데이터셋에서 각 데이터는 여러 개의 독립 변수와 하나의 종속 변수(레이블)로 구성됩니다. KNN은 새로운 데이터를 분류하기 위해, 해당 데이터와 가장 가까운 K개의 이웃 데이터를 찾습니다. 이웃 데이터들의 종속 변수 값들을 살펴보고 다수결 방식을 통해 새로운 데이터의 종속 변수 값을 결정합니다.

    Scikit-learn은 KNN을 구현한 다양한 클래스와 함수를 제공합니다. KNN을 사용하기 위해 필요한 라이브러리를 임포트합니다.

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

 

    이제 사용할 데이터를 준비해야 합니다. Scikit-learn에는 다양한 내장 데이터세트가 있습니다. 그중에서 붓꽃 데이터세트(iris dataset)를 사용해 보겠습니다. Scikit-learn 라이브러리를 사용하면 'load_iris'함수를 통해 붓꽃 데이터세트를 불러올 수 있습니다. 붓꽃 데이터세트는 세 가지 종류의 붓꽃에 대한 측정값을 포함하고 있으며, 분류 작업에 널리 사용되는 데이터세트입니다.

 

# 붓꽃 데이터셋 로드
iris = datasets.load_iris()

# 독립 변수와 종속 변수 분리
X = iris.data
y = iris.target

 

    데이터를 학습용과 테스트용으로 나누는 것이 중요합니다. Scikit-learn의 train_test_split 함수를 사용하여 데이터를 나눌 수 있습니다. 아래 코드에서 'test_size=0.4'란 테스트 데이터세트를 전체 데이터세트의 40%로 설정한다는 뜻입니다. 또한, 'random_state=24'는 코드의 재현성을 확보하기 위한 설정입니다. 만약 'random_state'가 특정 숫자로 정의되어 있지 않으면, 코드를 실행할 때마다 학습 데이터세트와 테스트 데이터세트의 데이터가 달라집니다. 'random_state'의 숫자는 0 이상의 정수로 아무 숫자를 사용해도 괜찮습니다.

 

# 학습용 데이터와 테스트용 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=24)

 

    이제 KNN 모델을 만들고 학습시키는 작업을 수행합니다. Scikit-learn의 KNeighborsClassifier 클래스를 사용하여 모델을 초기화하고 fit 메서드를 사용하여 모델을 학습시킵니다.

 

# KNN 모델 초기화
model = KNeighborsClassifier()

# 모델 학습
model.fit(X_train, y_train)

 

    모델 학습이 완료되면, 테스트 데이터를 사용하여 예측을 수행하고 모델의 성능을 평가할 수 있습니다.

 

# 테스트 데이터 예측
y_pred = model.predict(X_test)

# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)

 

    위 코드에서는 KNeighborsClassifier 클래스를 사용하여 KNN 모델을 초기화하고, fit 메서드를 사용하여 모델을 학습시킵니다. 학습이 완료된 모델을 사용하여 테스트 데이터를 예측하고, accuracy_score 함수를 사용하여 예측 결과의 정확도를 계산합니다.

    Scikit-learn에 내장된 붓꽃 데이터세트를 사용하여 KNN 모델을 학습하고 예측하는 방법을 보여주었습니다. Scikit-learn에는 다양한 내장 데이터세트가 있으며, 이를 활용하여 다양한 분류 작업에 KNN 모델을 적용할 수 있습니다. Scikit-learn의 KNN 클래스와 관련 함수를 사용하면 간편하게 KNN 모델을 구축하고 데이터를 분석할 수 있습니다.

 

머신러닝 모델 소개 시리즈

2023.07.04 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (1) - 선형 회귀 모델 (Linear Regression)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (2) - 서포트벡터머신 (Support Vector Machine, SVM)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (3) - KNN (K-Nearest Neighbor)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (4) - 랜덤 포레스트 (Random Forest)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (5) - 에이다부스트 (AdaBoost)

2023.07.11 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (6) - 다층 퍼셉트론 (Multilayer Perceptron)

반응형