K-최근접 이웃(K-NN) 알고리즘 쉽게 이해하기
안녕하세요! 오늘은 머신러닝의 기초 알고리즘 중 하나인 K-최근접 이웃(K-NN) 알고리즘에 대해 쉽게 설명해드리겠습니다. K-NN 알고리즘은 이해하기 쉬우면서도 강력한 성능을 자랑하기 때문에, 머신러닝을 처음 접하시는 분들에게 추천하는 알고리즘입니다.
K-최근접 이웃(K-NN) 알고리즘이란?
K-NN 알고리즘은 지도 학습(Supervised Learning)의 한 종류로, 새로운 데이터 포인트의 클래스(라벨)를 예측하기 위해 가장 가까운 K개의 이웃을 참조하는 방식입니다. 간단히 말해서, 새로운 데이터가 주어졌을 때 그 데이터와 가장 가까운 K개의 데이터 포인트를 찾아 이들의 클래스를 투표하여 예측합니다.
K-NN 알고리즘의 작동 원리
- 데이터 준비: 먼저, 분류하고자 하는 데이터와 라벨(정답)이 있는 학습 데이터를 준비합니다.
- 거리 계산: 새로운 데이터 포인트와 학습 데이터의 각 포인트 간의 거리를 계산합니다. 주로 유클리드 거리(Euclidean Distance)를 사용합니다.
- K개의 이웃 선택: 계산된 거리 중 가장 가까운 K개의 이웃을 선택합니다.
- 투표: 선택된 K개의 이웃이 어떤 클래스에 속하는지 투표하여 가장 많은 클래스를 새로운 데이터의 클래스로 예측합니다.
예제: 생선 분류
예를 들어, 우리가 도미와 빙어를 분류하고자 한다고 가정해봅시다. 각 생선의 길이와 무게가 주어진 데이터를 사용하여 새로운 생선이 도미인지 빙어인지 예측하는 문제입니다.
1. 데이터 준비:
도미_길이 = [25.4, 26.3, 26.5, ...]
도미_무게 = [242.0, 290.0, 340.0, ...]
빙어_길이 = [10.0, 11.2, 12.0, ...]
빙어_무게 = [7.0, 9.0, 10.0, ...]
2. 거리 계산: 새로운 생선의 길이가 20cm, 무게가 150g이라면, 기존 데이터와의 유클리드 거리를 계산합니다.
거리 = sqrt((기존_길이 - 새로운_길이)^2 + (기존_무게 - 새로운_무게)^2)
3. K개의 이웃 선택: 가장 가까운 K개의 이웃을 선택합니다. 여기서 K는 3으로 가정합니다.
가장 가까운 3개의 생선 = [(25.4, 242.0), (26.3, 290.0), (24.0, 200.0)]
4. 예측: 이웃 3개 중 도미가 2개, 빙어가 1개라면, 새로운 생선은 도미로 예측합니다.
사이킷런을 이용한 K-NN 예제
파이썬의 사이킷런 라이브러리를 사용하면 K-NN 알고리즘을 쉽게 구현할 수 있습니다. 다음은 사이킷런을 이용한 간단한 예제입니다.
1. 데이터 준비:
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# 도미와 빙어의 길이와 무게 데이터
length = [25.4, 26.3, 26.5, 27.0, 27.6, 28.0, 29.0, 29.7, 29.9, 30.0, 30.5, 31.0, 31.5, 32.0, 32.5, 10.0, 11.2, 11.3, 11.8, 12.0, 12.2, 12.4, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0]
weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 540.0, 500.0, 475.0, 500.0, 500.0, 340.0, 7.0, 9.0, 9.8, 10.0, 10.5, 11.0, 11.2, 12.0, 12.2, 12.4, 13.0, 14.0, 15.0, 16.0, 17.0]
# 라벨링: 도미는 1, 빙어는 0
fish_target = [1] * 15 + [0] * 15
# 데이터를 2차원 배열로 변환
fish_data = np.column_stack((length, weight))
# 훈련 데이터와 테스트 데이터로 분리
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, test_size=0.3, random_state=42)
2. K-NN 모델 학습:
# K-NN 모델 생성 (k=3)
knn = KNeighborsClassifier(n_neighbors=3)
# 모델 학습
knn.fit(train_input, train_target)
3. 모델 예측:
# 새로운 생선 데이터 (길이 20cm, 무게 150g)
new_fish = np.array([[20, 150]])
# 예측
prediction = knn.predict(new_fish)
print("예측된 결과:", prediction)
4. 모델 평가:
# 모델 정확도 평가
accuracy = knn.score(test_input, test_target)
print("모델 정확도:", accuracy)
장점과 단점
장점
- 단순하고 직관적: 이해하기 쉽고 구현하기 간단합니다.
- 비선형 데이터 처리: 데이터의 분포가 비선형인 경우에도 잘 작동합니다.
단점
- 계산 비용: 데이터가 많아지면 거리 계산에 많은 시간이 소요될 수 있습니다.
- 저장 공간: 모든 학습 데이터를 저장해야 하므로 저장 공간이 많이 필요할 수 있습니다.
결론
K-최근접 이웃(K-NN) 알고리즘은 단순하면서도 강력한 성능을 제공하는 머신러닝 알고리즘입니다. 새로운 데이터 포인트를 예측할 때, 가장 가까운 K개의 이웃을 참조하여 예측하는 방식으로 작동합니다. 이해하기 쉽고 구현하기 간단하다는 장점이 있어 머신러닝을 처음 접하시는 분들께 매우 유용합니다.
이제 여러분도 K-NN 알고리즘을 활용해 다양한 분류 문제를 해결해보세요! 다음 포스팅에서는 더 흥미로운 알고리즘과 예제를 소개해드리겠습니다. 감사합니다!