본문 바로가기
개발/Python

K-Nearest Neighbors Hyper Parameters

by 피로물든딸기 2025. 11. 18.
반응형

전체 링크

K-Nearest Neighbors

- 비모수 모델 (Non-parametric), 학습 단계에서 모델이 데이터의 분포를 가정하지 않는다.

- Lazy Learning, 학습 단계에서는 거의 계산을 하지 않고, 예측할 때만 계산

거리 기반 결정, 새로운 데이터가 들어오면, 학습 데이터 중 가장 가까운 K개의 이웃을 찾고, 분류 또는 회귀

실시간 데이터에 강점, 새로운 데이터가 들어와도 바로 예측 가능, 단 학습 데이터가 많으면 느려질 수 있음.

 

장점

- 단순하고 직관적

- K 값과 거리 측정 방법만 바꿔서 다양한 실험 가능.

비모수 모델, 데이터 분포 가정이 필요 없어서 다양한 데이터에 적용 가능

- 다중 클래스 분류 가능

- 학습은 거의 데이터 저장만 하므로 빠름

 

단점

- 모든 학습 데이터를 대상으로 거리 계산을 해야 하므로, 데이터가 많으면 느려짐

- 메모리 많이 사용, 학습 데이터를 모두 저장

- K 값에 민감 → K가 작으면 노이즈에 민감하고, K가 크면 과도하게 평균화되어 경계가 뭉개짐.

- 거리 척도 선택에 따라 성능이 크게 달라짐

- 차원의 저주에 취약 → 피처(변수)가 많아지면 거리 계산이 의미 없게 되어 정확도가 떨어질 수 있음.

특징 스케일링 필요, 거리 기반이므로 피처 값의 단위가 다르면 영향을 많이 받음.


하이퍼 파라미터

from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

KNeighborsClassifier(
    n_neighbors=5,
    weights='uniform',
    algorithm='auto',
    leaf_size=30,
    p=2,
    metric='minkowski',
    metric_params=None,
    n_jobs=None,
    **kwargs,
)

KNeighborsRegressor(
    n_neighbors=5,
    weights='uniform',
    algorithm='auto',
    leaf_size=30,
    p=2,
    metric='minkowski',
    metric_params=None,
    n_jobs=None,
    **kwargs,
)

n_neighbors

- kneighbors 질의에 기본적으로 사용할 이웃의 수


weights

- 예측 시 사용되는 가중치 함수

- 'uniform' : 균일 가중치. 각 이웃 내의 모든 점이 동일한 가중치를 가진다.

- 'distance' : 거리의 역수에 의해 점들에 가중치를 부여한다.
  이 경우, 질의 지점과 더 가까운 이웃이 멀리 있는 이웃보다 더 큰 영향을 미친다.

- [callable] : 거리 배열을 입력으로 받아, 동일한 형태의 가중치 배열을 반환하는 사용자 정의 함수

import numpy as np
from sklearn.datasets import make_moons
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt

X, y = make_moons(n_samples=300, noise=0.25, random_state=0)

# 사용자 정의 weights 함수
def custom_weight(distances):
    eps = 1e-5  # 거리 0 회피
    return 1 / (distances + eps)**2  # 거리의 제곱의 역수 → 가까울수록 급격히 큰 가중치

knn_custom = KNeighborsClassifier(n_neighbors=5, weights=custom_weight)
knn_custom.fit(X, y)

sample = np.array([[1.5, -0.1]])
print("Custom weighted prediction:", knn_custom.predict(sample))
print("Custom weighted probability:", knn_custom.predict_proba(sample))

def plot_decision_boundary(clf, X, y, title):
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300),
                         np.linspace(y_min, y_max, 300))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', s=25)
    plt.title(title)
    plt.show()

plot_decision_boundary(knn_custom, X, y, "KNN with Custom Weights")


algorithm

- 최근접 이웃을 계산할 때 사용할 알고리즘

- 'ball_tree' : BallTree 를 사용

- 'kd_tree' : KDTree 를 사용

- 'brute' : 브루트 포스(전수 탐색)를 사용

- 'auto' : fit 메서드에 전달된 값에 따라 가장 적절한 알고리즘을 자동으로 선택


leaf_size

 - BallTree 또는 KDTree에 전달되는 leaf 크기
 - 트리 구성 및 조회 속도, 그리고 트리 저장에 필요한 메모리에 영향을 줄 수 있음


p

- Minkowski 거리의 지수 파라미터


metric

- 트리에 사용할 거리(metric)


metric_params

- metric 함수에 대한 추가 keyword 인자

반응형

댓글