주변의 데이터 중 가까운 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))