move84

머신러닝 기초 - K-최근접 이웃 (K-Nearest Neighbors) : 거리 측정 방법 본문

머신러닝

머신러닝 기초 - K-최근접 이웃 (K-Nearest Neighbors) : 거리 측정 방법

move84 2025. 2. 20. 23:10
반응형

😀 K-최근접 이웃(K-NN)이란?
K-K-Nearest Neighbors은 새로운 데이터를 예측할 때, 학습 데이터 중 가장 가까운 K개의 이웃을 찾아 다수결 투표 또는 평균을 통해 예측하는 간단하면서도 효과적인 분류 및 회귀 기법이다. 이 알고리즘은 복잡한 모델 학습 없이 데이터 간의 유사도를 기반으로 결정을 내리므로, "유사한 것을 모으면 비슷한 결과가 나온다"는 직관적인 원리를 따른다.


📏 거리 측정 방법의 중요성
K-최근접 이웃에서 '거리'는 이웃을 선정하는 핵심 요소다. 데이터 간의 거리를 올바르게 측정해야만 비슷한 특성을 가진 데이터들이 올바르게 그룹화된다. 대표적인 거리 측정 방법으로는 유클리드 거리, 맨해튼 거리, 민코우스키 거리 등이 있다.

  • 유클리드 거리(Euclidean Distance): 가장 널리 쓰이는 거리 척도로, 두 점 사이의 직선 거리를 계산한다.
  • 맨해튼 거리(Manhattan Distance): 도시의 격자 모양 도로를 따라 이동하는 거리처럼, 두 점 사이의 수평 및 수직 거리의 합으로 계산한다.
  • 민코우스키 거리(Minkowski Distance): 유클리드 거리와 맨해튼 거리의 일반화된 형태로, 파라미터 (p)에 따라 다양한 거리 척도로 변환할 수 있다.

거리 측정 방법에 따라 K-최근접 이웃의 성능이 달라지므로, 데이터의 특성에 맞는 적절한 거리를 선택하는 것이 매우 중요하다.


💻 파이썬 코드 예제: 유클리드 거리 기반 K-NN 분류
아래 코드는 사이킷런의 KNeighborsClassifier를 사용해 아이리스 데이터셋에 대해 K-NN 분류 모델을 구현하는 예제다. 여기서는 기본적으로 유클리드 거리를 사용하며, 초보자들이 K-NN의 동작 원리를 쉽게 이해할 수 있도록 구성했다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 아이리스 데이터셋 로드: 3종류의 붓꽃 데이터
iris = load_iris()
X = iris.data   # 특징: 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비
y = iris.target # 클래스: 0, 1, 2

# 데이터를 훈련 세트와 테스트 세트로 분할 (70% 훈련, 30% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# K-최근접 이웃 분류기 생성 (k=5 사용, 기본 유클리드 거리)
knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train, y_train)

# 테스트 데이터에 대해 예측 수행
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("정확도:", accuracy)
print("혼동 행렬:\n", confusion_matrix(y_test, y_pred))
print("\n분류 보고서:\n", classification_report(y_test, y_pred))

# 간단한 시각화를 위해 2차원 데이터 (꽃받침 길이, 꽃받침 너비) 사용
plt.figure(figsize=(8, 6))
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap='viridis', edgecolor='k', s=80)
plt.xlabel("꽃받침 길이")
plt.ylabel("꽃받침 너비")
plt.title("K-최근접 이웃 분류 결과 (유클리드 거리)")
plt.show()

이 코드는 아이리스 데이터셋을 활용해 K-NN 모델을 구축하고, 훈련된 모델을 사용해 테스트 데이터에 대한 예측을 수행한 후, 모델의 정확도와 혼동 행렬을 출력한다. 또한, 2차원 시각화를 통해 간단한 분류 결과를 확인할 수 있다.


🌟 초보자를 위한 실생활 예시
K-최근접 이웃 알고리즘은 일상 생활에서도 쉽게 비유할 수 있다. 예를 들어, 새로운 맛의 음식을 추천받을 때 친구들이 비슷한 취향의 음식을 좋아하는지 살펴본다면, 그 친구들이 먹은 음식과 내 취향이 비슷할 가능성이 높다. 즉, 비슷한 사람들(가까운 이웃)의 의견을 참고해 결정을 내리는 것과 같다. 이처럼 K-NN은 데이터 포인트 간의 '유사성'에 기반해 결정을 내리며, 적절한 거리 측정 방법이 이를 가능하게 만든다.


📚 중요 용어 정리

  • K-최근접 이웃(K-NN): 새로운 데이터를 예측할 때, 가장 가까운 K개의 이웃 데이터를 기반으로 예측하는 분류 및 회귀 기법.
  • 거리 측정(Distance Metric): 데이터 포인트 간의 유사도를 측정하는 방법. 대표적으로 유클리드 거리, 맨해튼 거리, 민코우스키 거리가 있다.
  • 유클리드 거리(Euclidean Distance): 두 점 사이의 직선 거리를 계산하는 방식.
  • 맨해튼 거리(Manhattan Distance): 두 점 사이의 수평 및 수직 거리의 합으로 계산되는 방식.

📊 모델 평가와 성능 개선
K-NN 모델의 성능 평가는 주로 정확도, 정밀도, 재현율, F1 스코어 등의 지표를 통해 이루어진다. 또한, 데이터 전처리 및 스케일링이 매우 중요한 역할을 한다. 예를 들어, 특성의 스케일이 크게 다르면 거리가 왜곡되어 잘못된 이웃을 선택할 가능성이 있다. 따라서 표준화나 정규화를 통해 데이터 스케일을 맞춰주는 것이 필요하다.
또한, 적절한 K 값의 선택과 거리 측정 방법의 최적화는 모델 성능에 큰 영향을 미친다. 그리드 서치(Grid Search)를 통해 다양한 K 값과 거리 측정 방식을 실험하며 최적의 조합을 찾는 것이 효과적이다.


📌 실제 응용 분야와 전망
K-최근접 이웃은 이미지 인식, 추천 시스템, 의료 진단 등 다양한 분야에서 활용된다. 예를 들어, 사진 속 객체 인식에서 유사한 이미지의 특징을 비교해 해당 객체를 분류하거나, 쇼핑몰에서 사용자의 구매 이력을 기반으로 유사한 제품을 추천하는 데 사용된다.
미래에도 K-NN은 단순하면서도 직관적인 모델로, 대규모 데이터셋이나 실시간 예측이 필요한 상황에서 유용하게 쓰일 전망이다. 특히, 하드웨어 성능이 향상됨에 따라 실시간 데이터 처리에서도 K-NN의 활용 가능성은 더욱 높아질 것이다.


📌 결론 및 요약
K-최근접 이웃 알고리즘은 간단하지만 강력한 분류 및 회귀 기법으로, 데이터 포인트 간의 유사성을 측정해 예측을 수행한다. 이 글에서는 유클리드 거리와 같은 거리 측정 방법의 중요성과, K-NN 모델의 작동 원리, 그리고 파이썬 코드를 통한 예제 구현 방법을 설명했다. 초보자들은 이 글을 통해 K-NN의 기본 개념, 거리 측정 방식, 그리고 실제 데이터에 적용하는 과정을 이해할 수 있다. 또한, 일상생활의 비유와 중요한 용어 정리를 통해 K-NN의 작동 원리를 쉽게 파악할 수 있다. 모델 성능 향상을 위해 데이터 전처리, 스케일링, 그리고 하이퍼파라미터 튜닝의 중요성을 인식하고, 이를 실제 문제 해결에 적용하는 경험을 쌓으면 좋다.

키워드: #K최근접이웃 #거리측정 #머신러닝기초 #파이썬예제

반응형