KNN

김혜인·2023년 5월 25일

머신러닝

목록 보기
8/11

K-최근접 이웃(K-Nearest Neighbors, KNN)

  • 주변의 데이터 중 가까운 k개의 데이터로 분류/예측

  • K: 포인트의 개수를 지정하는 하이퍼파라미터

  • 분류: K개의 y중 다수의 class로 추론

  • 회귀: K개의 y값 평균값으로 추론(K작으면 overfitting, K크면 underfitting)

  • from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

  • 이웃수
    :n_neighbors=K(K작으면 overfitting, K크면 underfitting)

  • 거리재는 법
    - p=2:유클리디안거리(각 벡터끼리 빼고 제곱한거 더하고 루트)
    - p=1:맨하탄거리(각 벡터끼리 빼고 절대값한거끼리 합)

#위스콘신 유방암 데이터 이용

#import
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV

from sklearn.preprocessing import StandardScaler

from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

from sklearn.metrics import accuracy_score


#데이터 로드/분리
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)


#KNN - Feature scaling 전처리
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)


## K(이웃수) 변화에 따른 accuracy 확인
train_acc_list = []
test_acc_list = []

k_list = range(1,11) # 1(이상치취약-overfitting) ~ 10(underfitting 발생할 수 있다)
for k in k_list:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train_scaled, y_train)
    
    #검증
    pred_train = knn.predict(X_train_scaled)
    pred_test = knn.predict(X_test_scaled)
    
    train_acc_list.append(accuracy_score(y_train,pred_train))
    test_acc_list.append(accuracy_score(y_test,pred_test))

0개의 댓글