머신러닝 - k-Nearest Neighbor (k-NN)

dumbbelldore·2025년 1월 1일
0

zero-base 33기

목록 보기
56/97

1. k-NN (k-Nearest Neighbor)

  • 비지도 학습 알고리즘 중 하나로, 분류회귀에 모두 활용할 수 있음

  • 새로운 데이터 포인트에 대해 예측하고자 할 때, 거리상 가장 가까운 k개의 이웃 데이터를 기준으로 삼음

    • 분류: k개 이웃 중 가장 우세한 클래스를 해당 데이터 포인트의 클래스로 예측
    • 회귀: k개 이웃의 평균값을 해당 데이터 포인트의 예측값으로 사용
  • 새로운 데이터가 들어올 때마다 전체 데이터 포인트와 거리계산을 수행하기 때문에 연산효율이 좋지 않을 수 있음

  • k값에 따라 성능이 크게 변할 수 있어, 교차 검증 등의 과정을 통해 최적의 k값을 선정하는 과정이 중요


2. 거리 측정 알고리즘

2-1. 유클리드 거리 (Euclidean Distance)

  • 두 점(p,qp, q) 사이의 '직선 거리'를 계산하는 방식으로, 직관적으로 이해할 수 있음

    Distance(p,q)=i=1n(piqi)2Distance(p, q) = \sqrt{\sum_{i=1}^{n} (p_i - q_i)^2}

2-2. 맨하탄 거리 (Manhattan Distance)

  • 두 점(p,qp, q) 사이의 '격자 거리'로, 수평과 수직으로만 이동이 가능한 경우의 최단 거리

  • 유클리드 거리보다 계산이 간단하고 빠름

    d(p,q)=i=1npiqid(p, q) = \sum_{i=1}^{n} |p_i - q_i|

2-3. 코사인 유사도 (Cosine Similarity)

  • 두 벡터가 이루는 각도의 '코사인'을 비교하며, 내적과 노름(Norm)을 이용하여 계산할 수 있음
  • 주로 텍스트 데이터나 고차원 데이터의 예측에 사용됨

3. 동작 원리

  • 훈련 데이터가 다음과 같이 4개 주어진 경우: [(1,2),(2,5),(3,3),(6,6)][(1, 2), (2, 5), (3, 3), (6, 6)]

  • 새로운 데이터 포인트 (2,3)(2, 3)에 대해 k-NN 기반 분류(거리=유클리드, kk=3)를 수행한다고 가정

  • 새로운 데이터 포인트와 기존의 훈련 데이터 간 거리 측정

    • (2,3)(2, 3)(1,2)(1, 2)의 거리: (21)2+(32)2=2\sqrt{(2-1)^2 + (3-2)^2} = \sqrt{2}
    • (2,3)(2, 3)(2,5)(2, 5)의 거리: (22)2+(35)2=2\sqrt{(2-2)^2 + (3-5)^2} = 2
    • ...
  • 가장 가까운 3개의 이웃 선택: [(1,2),(3,3),(2,5)][(1, 2), (3, 3), (2, 5)]

  • 다수결로 결과 예측: 클래스 AA가 2개, BB가 1개라면 (2,3)(2,3)은 클래스 AA에 해당


4. 예제

import pandas as pd
import plotly.graph_objs as go
wine = pd.read_csv("./data/wine.csv")

X = wine.drop(columns="type")
y = wine["type"]

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

# k값 후보
param_grid={
    "n_neighbors": [3, 5, 7, 9]
}

knn = KNeighborsClassifier(metric="euclidean")
gs = GridSearchCV(knn, param_grid, cv=5)

# Grid Search 실시
gs.fit(X_train, y_train)
print("Best Param", gs.best_params_) # 최적 k값: 7

# 최적 k값 기반 예측
from sklearn.metrics import classification_report
print(classification_report(y_test, gs.predict(X_test)))

## 출력 결과
#               precision    recall  f1-score   support
# 
#            0       0.94      0.98      0.96       959
#            1       0.92      0.83      0.87       341
# 
#     accuracy                           0.94      1300
#    macro avg       0.93      0.90      0.92      1300
# weighted avg       0.94      0.94      0.94      1300

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글