addinedu

iris with knn

붓꽃 데이터셋을 활용한 KNN(K-Nearest Neighbors) 분류 모델 구현 및 성능 평가. 데이터 분할, 모델 학습, 정확도 측정, 혼동 행렬 및 분류 리포트를 통한 성능 분석을 수행하고, KNN 알고리즘의 특성과 한계를 학습합니다.

Machine Learning
Python
Scikit-learn

KNN

KNN(K-Nearest Neighbors, K-최근접 이웃)은 지도 학습 알고리즘으로, 분류와 회귀 문제에 모두 사용할 수 있다.

작동 원리

  1. 거리 계산: 새로운 데이터 포인트가 주어지면, 학습 데이터셋의 모든 포인트와의 거리를 계산한다.
  2. K개 이웃 선택: 가장 가까운 K개의 이웃을 선택한다.
  3. 예측:
    • 분류: 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 의 거리를 계산해야하므로 예측과 모델성능 측정시 계산량이 늘어난다는 단점이 있다.