KNN
KNN(K-Nearest Neighbors, K-최근접 이웃)은 지도 학습 알고리즘으로, 분류와 회귀 문제에 모두 사용할 수 있다.
작동 원리
- 거리 계산: 새로운 데이터 포인트가 주어지면, 학습 데이터셋의 모든 포인트와의 거리를 계산한다.
- K개 이웃 선택: 가장 가까운 K개의 이웃을 선택한다.
- 예측:
- 분류: K개 이웃 중 가장 많은 클래스를 선택 (다수결 투표)
- 회귀: K개 이웃의 평균값을 예측값으로 사용
주요 특징
- 지연 학습(Lazy Learning): 학습 단계에서 모델을 구축하지 않고, 예측 시점에 계산을 수행한다.
- 거리 기반: 유클리드 거리, 맨하탄 거리 등 다양한 거리 측정 방법을 사용할 수 있다.
- K값 선택: K값이 너무 작으면 과적합(overfitting), 너무 크면 과소적합(underfitting) 위험이 있다.
장점
- 구현이 간단하고 직관적이다.
- 비선형 문제에도 잘 작동한다.
- 학습 데이터가 충분하면 좋은 성능을 보인다.
단점
- 예측 시 모든 학습 데이터와의 거리를 계산해야 하므로 계산 비용이 높다.
- 고차원 데이터에서는 성능이 저하될 수 있다 (차원의 저주).
- 불균형 데이터셋에서는 성능이 떨어질 수 있다.
In [33]:
# 붓꽃 데이터 로드
from sklearn.datasets import load_iris
iris = load_iris()In [34]:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
iris.data,
iris.target,
test_size=0.2,
random_state=42,
stratify=iris.target
)
In [35]:
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train);In [36]:
from sklearn.metrics import accuracy_score
pred = knn.predict(X_test)
print(accuracy_score(y_test, pred))1.0
모델 성능을 측정해보기
In [37]:
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, pred))
print(classification_report(y_test, pred))[[10 0 0]
[ 0 10 0]
[ 0 0 10]]
precision recall f1-score support
0 1.00 1.00 1.00 10
1 1.00 1.00 1.00 10
2 1.00 1.00 1.00 10
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
KNN은 feature 가 많으면 데이터 각각마다 feature 의 거리를 계산해야하므로 예측과 모델성능 측정시 계산량이 늘어난다는 단점이 있다.