[Machine Learning] KNN

1 minute read


KNN Classifier

KNN 은 테스트 시에 새로운 데이터와 인접 데이터들 간의 거리를 계산한다.

따라서 특이하게, 훈련 시에는 하는 것이 없고 테스트 시에 시간이 오래 걸린다.

image-20211023175509831

3-Class classification (k = 15, weights = 'uniform')

Setup

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier
from sklearn.neighbors import KNeighborsClassifier

Import dataset

iris = load_iris()
X, y = iris.data, iris.target
import matplotlib.pyplot as plt
plt.scatter(X[:,0], X[:,1], c=y)

output_5_1


Split train/test dataset

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

clf = SGDClassifier()
knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train, y_train)
print("kNN score: {:.2f}".format(knn.score(X_test, y_test)))
clf.fit(X_train, y_train)
print("Linear Reg score: {:.2f}".format(clf.score(X_test, y_test)))
kNN score: 0.98
Linear Reg score: 0.93


Evaluation

for i in range(1,30,3):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)
    print("K가", i, "일때 정확도: {:.2f}".format(knn.score(X_test, y_test)))
K가 1 일때 정확도: 0.93
K가 4 일때 정확도: 0.93
K가 7 일때 정확도: 0.93
K가 10 일때 정확도: 0.96
K가 13 일때 정확도: 0.96
K가 16 일때 정확도: 0.93
K가 19 일때 정확도: 0.91
K가 22 일때 정확도: 0.93
K가 25 일때 정확도: 0.96
K가 28 일때 정확도: 0.98


Cross validation

from sklearn.model_selection import cross_val_score, KFold
cross_val_score(knn, X, y, cv=5).mean().round(4)
0.94
cross_val_score(clf, X, y, cv=5).mean().round(4)
0.8067


Observation

  • 선형 알고리즘이 성능이 더 좋지 않은 것으로 나타난다. (하지만 데이터 사이즈가 작아 불확실)
  • scaling 한 후에 다시 한 번 확인해 보자
  • 선형 모델이나 SVM, 신경망에서는 반드시 scaling 을 해야 한다.
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_sc = sc.fit_transform(X)
cross_val_score(clf, X_sc, y, cv=5).mean().round(4)
0.9267
cross_val_score(knn, X_sc, y, cv=5).mean().round(4)  # 별 차이가 없음
0.9267

Leave a comment