move84

머신러닝: K-최근접 이웃 (K-Nearest Neighbors, KNN) 알고리즘 본문

머신러닝

머신러닝: K-최근접 이웃 (K-Nearest Neighbors, KNN) 알고리즘

move84 2025. 4. 10. 07:35
반응형

K-최근접 이웃(KNN) 알고리즘은 지도 학습의 한 종류로서, 분류(Classification) 및 회귀(Regression) 문제에 널리 사용된다. 이 알고리즘은 새로운 데이터 포인트가 주어졌을 때, 기존 데이터에서 가장 가까운 K개의 이웃을 찾아 그들의 속성을 기반으로 새로운 데이터의 속성을 예측한다. KNN은 이해하기 쉽고 구현이 간단하다는 장점을 가지며, 복잡한 모델을 학습하기 전에 시도해볼 수 있는 좋은 기준 모델(Baseline Model)이 된다.


KNN 알고리즘의 기본 개념 (Basic Concepts of KNN)
KNN 알고리즘은 매우 직관적이다. 새로운 데이터 포인트가 주어지면, 알고리즘은 기존의 모든 데이터 포인트와의 거리를 계산한다. 그 후, 가장 가까운 K개의 데이터 포인트를 선택하고, 선택된 이웃들의 클래스 또는 값을 기반으로 새로운 데이터 포인트의 클래스 또는 값을 예측한다. 여기서 K는 사용자가 지정하는 파라미터이며, 적절한 K값을 선택하는 것이 중요하다. K값이 너무 작으면 노이즈에 민감해지고, 너무 크면 모델이 과도하게 단순해질 수 있다.


📏 거리 측정 방법 (Distance Metrics)
KNN 알고리즘에서 가장 중요한 부분 중 하나는 데이터 포인트 간의 거리를 측정하는 방법이다. 가장 일반적으로 사용되는 거리 측정 방법은 다음과 같다.

  • 유클리드 거리 (Euclidean Distance): 두 점 사이의 직선 거리를 계산한다. 수식은 다음과 같다. d(p, q) = sqrt((q1 - p1)^2 + (q2 - p2)^2 + ... + (qn - pn)^2)
  • 맨해튼 거리 (Manhattan Distance): 각 차원에서의 거리 차이의 절대값의 합을 계산한다. 수식은 다음과 같다. d(p, q) = |q1 - p1| + |q2 - p2| + ... + |qn - pn|
  • 민코프스키 거리 (Minkowski Distance): 유클리드 거리와 맨해튼 거리를 일반화한 거리 측정 방법이다. p값을 조절하여 다양한 거리 척도를 사용할 수 있다. p=2일 경우 유클리드 거리, p=1일 경우 맨해튼 거리가 된다. 수식은 다음과 같다. d(p, q) = (|q1 - p1|^p + |q2 - p2|^p + ... + |qn - pn|^p)^(1/p)

예를 들어, 2차원 공간에서 두 점 (1, 2)와 (4, 6) 사이의 유클리드 거리는 sqrt((4-1)^2 + (6-2)^2) = sqrt(9 + 16) = 5가 된다. 맨해튼 거리는 |4-1| + |6-2| = 3 + 4 = 7이 된다.


⚙️ KNN 알고리즘의 작동 방식 (How KNN Works)

  1. 데이터 준비 (Data Preparation): 훈련 데이터셋을 준비한다. 각 데이터 포인트는 특징(feature)과 레이블(label)을 가지고 있다.
  2. 거리 계산 (Distance Calculation): 예측하려는 새로운 데이터 포인트와 훈련 데이터셋의 모든 데이터 포인트 간의 거리를 계산한다. 유클리드 거리, 맨해튼 거리 등 적절한 거리 측정 방법을 사용한다.
  3. K개 이웃 선택 (Select K-Nearest Neighbors): 계산된 거리를 기준으로 가장 가까운 K개의 이웃을 선택한다.
  4. 예측 (Prediction):
    • 분류 (Classification): 선택된 K개 이웃 중 가장 많은 클래스를 새로운 데이터 포인트의 클래스로 예측한다. 다수결 투표(majority voting) 방식을 사용한다.
    • 회귀 (Regression): 선택된 K개 이웃의 값들의 평균 또는 가중 평균을 새로운 데이터 포인트의 값으로 예측한다.

🐍 Python을 사용한 KNN 구현 (KNN Implementation with Python)
Python의 scikit-learn 라이브러리를 사용하여 KNN 알고리즘을 쉽게 구현할 수 있다. 다음은 간단한 예제 코드이다.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np

# 샘플 데이터 생성
X = np.array([[1, 2], [2, 3], [3, 1], [6, 5], [7, 7], [8, 6]])
y = np.array([0, 0, 0, 1, 1, 1])  # 0과 1로 분류

# 훈련 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# KNN 분류기 생성 및 훈련
knn = KNeighborsClassifier(n_neighbors=3)  # K=3으로 설정
knn.fit(X_train, y_train)

# 예측
y_pred = knn.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"정확도: {accuracy}")

# 새로운 데이터 포인트 예측
new_data = np.array([[5, 4]])
prediction = knn.predict(new_data)
print(f"새로운 데이터 포인트 예측 결과: {prediction}")

이 코드는 샘플 데이터를 생성하고, 데이터를 훈련 데이터와 테스트 데이터로 분리한 후, KNN 분류기를 훈련시키고, 테스트 데이터에 대한 예측을 수행한다. 마지막으로, 정확도를 평가하고 새로운 데이터 포인트에 대한 예측을 수행한다. n_neighbors 파라미터는 K값을 설정하는 부분이다.


KNN의 장점과 단점 (Advantages and Disadvantages of KNN)

장점:

  • 단순성 (Simplicity): 이해하고 구현하기 쉽다.
  • 비모수적 (Non-parametric): 데이터에 대한 가정이 적다.
  • 다양한 문제에 적용 가능 (Versatility): 분류 및 회귀 문제에 모두 사용될 수 있다.

단점:

  • 계산 비용 (Computational Cost): 모든 데이터 포인트와의 거리를 계산해야 하므로, 데이터셋이 클 경우 계산 비용이 많이 든다.
  • 차원의 저주 (Curse of Dimensionality): 특징의 수가 많아질수록 성능이 저하될 수 있다.
  • 적절한 K값 선택의 어려움 (Difficulty in Choosing K): K값에 따라 결과가 크게 달라질 수 있다.
  • 데이터 전처리 필요 (Need for Data Preprocessing): 특징의 스케일이 다르면 결과에 영향을 미칠 수 있으므로, 데이터 스케일링이 필요하다.

💡 KNN 사용 시 고려 사항 (Considerations When Using KNN)

  • 적절한 K값 선택 (Choosing the Right K Value): K값을 선택하는 것은 매우 중요하다. 일반적으로 홀수 값을 선택하여 동점을 방지한다. Cross-validation을 통해 최적의 K값을 찾을 수 있다.
  • 특징 스케일링 (Feature Scaling): KNN은 거리 기반 알고리즘이므로, 특징의 스케일이 다르면 큰 영향을 미칠 수 있다. StandardScaler 또는 MinMaxScaler를 사용하여 특징을 스케일링하는 것이 좋다.
  • 차원 축소 (Dimensionality Reduction): 특징의 수가 많을 경우, 차원 축소 기법(예: PCA)을 사용하여 성능을 향상시킬 수 있다.
  • 거리 측정 방법 선택 (Choosing Distance Metric): 데이터의 특성에 따라 적절한 거리 측정 방법을 선택해야 한다. 예를 들어, 텍스트 데이터의 경우 코사인 유사도(Cosine Similarity)를 사용할 수 있다.

📌 핵심 용어 정리 (Key Terms Summary)

  • K-최근접 이웃 (K-Nearest Neighbors, KNN): 가장 가까운 K개의 이웃을 사용하여 예측하는 알고리즘
  • 분류 (Classification): 데이터를 특정 카테고리로 할당하는 작업
  • 회귀 (Regression): 연속적인 값을 예측하는 작업
  • 유클리드 거리 (Euclidean Distance): 두 점 사이의 직선 거리
  • 맨해튼 거리 (Manhattan Distance): 각 차원에서의 거리 차이의 절대값의 합
  • 민코프스키 거리 (Minkowski Distance): 유클리드 거리와 맨해튼 거리를 일반화한 거리
  • 다수결 투표 (Majority Voting): 가장 많은 클래스를 선택하는 방식
  • 특징 (Feature): 데이터의 속성
  • 레이블 (Label): 데이터의 클래스 또는 값
  • 차원의 저주 (Curse of Dimensionality): 특징의 수가 많아질수록 성능이 저하되는 현상
  • 데이터 스케일링 (Data Scaling): 특징의 스케일을 조정하는 작업 (예: StandardScaler, MinMaxScaler)
  • 교차 검증 (Cross-validation): 모델의 성능을 평가하는 방법

KNN 알고리즘은 간단하면서도 강력한 머신러닝 알고리즘이다. 기본적인 개념을 이해하고, 적절한 파라미터 튜닝과 데이터 전처리를 통해 다양한 문제에 적용할 수 있다.

반응형