비지도 학습 알고리즘 중 하나로, 분류와 회귀에 모두 활용할 수 있음
새로운 데이터 포인트에 대해 예측하고자 할 때, 거리상 가장 가까운 k개의 이웃 데이터를 기준으로 삼음
새로운 데이터가 들어올 때마다 전체 데이터 포인트와 거리계산을 수행하기 때문에 연산효율이 좋지 않을 수 있음
k값에 따라 성능이 크게 변할 수 있어, 교차 검증 등의 과정을 통해 최적의 k값을 선정하는 과정이 중요함
두 점() 사이의 '직선 거리'를 계산하는 방식으로, 직관적으로 이해할 수 있음
두 점() 사이의 '격자 거리'로, 수평과 수직으로만 이동이 가능한 경우의 최단 거리
유클리드 거리보다 계산이 간단하고 빠름
훈련 데이터가 다음과 같이 4개 주어진 경우:
새로운 데이터 포인트 에 대해 k-NN 기반 분류(거리=유클리드, =3)를 수행한다고 가정
새로운 데이터 포인트와 기존의 훈련 데이터 간 거리 측정
가장 가까운 3개의 이웃 선택:
다수결로 결과 예측: 클래스 가 2개, 가 1개라면 은 클래스 에 해당
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
*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.