상세 컨텐츠

본문 제목

분류 - K-최근접 이웃(K-Nearest Neighbors)

인공지능/머신러닝

by 2^7 2024. 12. 18. 21:00

본문

K-최근접 이웃(K-Nearest Neighbors, KNN)

새로운 데이터가 들어왔을 때, 기존 데이터 중 가장 가까운 K개의 이웃(데이터 포인트)을 참고하여 이 데이터를 분류하거나 값을 예측하는 알고리즘 (가까운 기준은 거리(distance)를 기준으로 함)

 

K-최근접 이웃 주요 특징

  • 지도 학습(Supervised Learning): KNN은 입력 데이터(특징)와 정답(레이블)을 기반으로 학습
  • 거리 기반 알고리즘: 데이터 간의 유사성을 거리로 계산하여 가까운 데이터와 유사하다고 판단
  • 비모수적 알고리즘(Non-parametric): KNN은 특정한 데이터 분포 가정 없이 작동

 

K-최근접 이웃 작동 원리

 1) 거리 계산 : 새로운 데이터와 기존 데이터 간의 거리를 계산함

  • 일반적으로 사용하는 거리 계산 방법은 유클리드 거리(Euclidean Distance)를 사용
  • 유클리드 거리 계산식

 2) 가까운 K개의 이웃 선택 : 거리 계산 결과를 기반으로 가장 가까운 K개의 데이터를 선택

 3) 다수결(or 평균) 

  • 분류 문제: 선택된 K개의 이웃 중 가장 많은 레이블(클래스)을 가진 쪽으로 새 데이터를 분류
  • 회귀 문제: 선택된 K개의 이웃의 평균값을 새 데이터의 예측값으로 사용

 4) 결과 출력 : 최종적으로 분류 결과나 예측값을 제공

 

K 선택의 중요성

K는 KNN 알고리즘의 핵심 파라미터로 적절한 K값을 선택하는 것이 성능에 큰 영향을 미침

  • K가 너무 작으면: 알고리즘이 데이터의 노이즈에 민감해져 잘못된 결과를 낼 수 있음
  • K가 너무 크면: 데이터의 전반적인 경향에만 의존하여 세부적인 패턴을 무시할 수 있음

일반적으로, K는 홀수로 설정하며, 교차 검증(cross-validation)을 통해 적절한 값을 찾음

 

K-최근접 이웃의 장단점

 1) 장점

  • 간단한 구조: 구현과 이해가 쉬움
  • 학습 시간이 거의 없음: 데이터 저장만으로도 사용할 수 있음
  • 다양한 문제에 적용 가능: 분류와 회귀 모두에서 유용함

 2) 단점

  • 예측 시 느림: 모든 데이터를 비교해야 하므로 데이터가 많아질수록 느려짐
  • 메모리 소모: 모든 데이터를 저장해야 하기 때문에 메모리 사용량이 큼.
  • 스케일 민감: 거리 계산에 의존하므로, 데이터 스케일링(정규화)이 필요함

Python에서 scikit-learn 라이브러리를 사용해 간단한 K-최근접 이웃(KNN) 모델을 구현

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

# 데이터 생성
X = np.array([[1, 2], [2, 3], [3, 1], [6, 5], [7, 7], [8, 6]])
y = np.array([0, 0, 0, 1, 1, 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)
knn.fit(X_train, y_train)

# 예측
y_pred = knn.predict(X_test)

# 결과 출력
print("Predictions:", y_pred)
print("Accuracy:", accuracy_score(y_test, y_pred))
728x90

관련글 더보기