
이 문서는 머신러닝 실습에서 배우게 된 KNN(K-Nearest Neighbors) 알고리즘에 대한 이론과 실습 이해를 바탕으로 정리한 내용입니다.
단순 개념뿐만 아니라 수학적 원리, 하이퍼파라미터 튜닝, 실무 적용 시 고려할 점까지 포함했습니다.
KNN(K-Nearest Neighbors)은 가장 직관적이고 단순한 머신러닝 알고리즘 중 하나입니다.
새로운 데이터가 주어졌을 때, 기존 데이터 중에서 가장 가까운 K개의 이웃을 찾아
그 이웃들의 라벨(또는 값)을 기준으로 분류(Classification)하거나 회귀(Regression)를 수행합니다.
KNN은 데이터 간의 거리를 비교하기 위해 보통 유클리드 거리를 사용합니다.
이 유클리드 거리는 피타고라스 정리를 기반으로 계산됩니다.
두 점 (x1, y1), (x2, y2) 간의 거리:
d = sqrt((x1 - x2)^2 + (y1 - y2)^2)
d = sqrt(sum((xi - yi)^2))
기타 거리 계산 방식도 존재함:
K가 너무 작으면 과적합(overfitting) 위험
→ 소수의 이상치에 민감해짐
K가 너무 크면 과소적합(underfitting) 위험
→ 국지적인 패턴을 놓칠 수 있음
보통 홀수를 쓰는 이유는:
분류(Classification):
→ 가장 가까운 K개의 클래스 중 가장 많은 것으로 예측
회귀(Regression):
→ 가장 가까운 K개의 값의 평균 or 가중 평균으로 예측
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 데이터 불러오기
X, y = load_iris(return_X_y=True)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# KNN 모델 생성
knn = KNeighborsClassifier(n_neighbors=3)
# 학습
knn.fit(X_train, y_train)
# 예측
y_pred = knn.predict(X_test)
# 정확도 확인
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
데이터 스케일링은 필수!
StandardScaler, MinMaxScaler 등을 사용하여 정규화 필요고차원에서는 성능 저하
K 선택은 교차검증으로
GridSearchCV, cross_val_score 등을 통해 최적 K 탐색import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
# 샘플 데이터 생성
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_redundant=0, random_state=0)
model = KNeighborsClassifier(n_neighbors=5).fit(X, y)
# 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
plt.title("2차원 데이터에서 KNN 분류 결과")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
KNN은 가장 간단하지만 강력한 비모수(non-parametric) 학습 알고리즘이다.
거리 기반이므로 정규화 필수, K값과 차원의 수에 민감하다.