본문 바로가기
Drawing (AI)/MachineLearning

Udemy - 머신러닝의 모든 것 (K-NN)

by 생각하는 이상훈 2023. 3. 31.
728x90

K-Nearest Neighbors

KNN알고리즘은 다음과 같이 분류되어있는 데이터 사이의 새로운 데이터를 특정 결정짓는 알고리즘이다.

알고리즘의 과정을 살펴보자.

 

STEP 1: K의 숫자를 고른다. 이때 k는 알고리즘 안에 넣을 이웃의 수이다. 가장 흔한 디폴트 값은 5이다.

STEP 2: K개의 가장 가까운 이웃 데이터를 찾는다. 이는 어떠한 거리 방식을 이용해도 괜찮지만 보통 유클리드 거리를 이용한다.

STEP 3: 발견한 K개의 이웃들이 포함된 카테고리를 조사하여 각 카테고리에 포함된 이웃 수를 센다.

STEP 4: 새로운 데이터를 가장 많은 이웃이 포함된 카테고리에 포함시킨다.

 

위 그림을 보면 k=5일때 가장 가까운 이웃으로 선정된 5개의 데이터중 3개는 Category A, 2개는 Category B에 포함되므로 새로운 데이터는 Category A로 분류가 된다.


Model

#K-Nearest Neighbors (K-NN)
#Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#Importing the dataset
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

#Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

여기까지는 이전에 다룬 로지스틱 회귀와 같다.

#Training the K-NN model on the Training set
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train)

#Predicting a new result
print(classifier.predict(sc.transform([[30,87000]])))
[0]

#Predicting the Test set results
y_pred = classifier.predict(X_test)
print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))

[[0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [1 1]
 [0 0]
 [1 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [1 0]
 [0 0]
 [0 0]
 [1 1]
 [0 0]
 [0 0]
 [1 1]
 [0 0]

KNeighborsClassifier함수에 들어간 parameter들을 살펴보면 n_neighbors는 위 과정에서 보았던 k 즉 선택할 최근접 이웃수를 결정하는 것이다. 다음으로 metric은 이웃을 선택하기 위한 거리 측정 방법을 지정하는 것인데 여기서는 'minkowski' 거리를 사용한다. 다음으로 p는 minkowski 거리의 차수를 나타내는데 p=2로 설정되면 유클리드 거리와 같아진다. 따라서 metric과 p는 모두 유클리드 거리를 이용하겠다는 의미를 넣기 위한 parameter이다.

 

#Making the Confusion Matrix
from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(y_test, y_pred)
print(cm)
accuracy_score(y_test, y_pred)

[[64  4]
 [ 3 29]]
0.93

confusion matrix를 통해 로지스틱 회귀보다 성능이 올라갔음을 알 수 있다.

 

#Visualising the Training set results
from matplotlib.colors import ListedColormap
X_set, y_set = sc.inverse_transform(X_train), y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 10, stop = X_set[:, 0].max() + 10, step = 0.25),
                     np.arange(start = X_set[:, 1].min() - 1000, stop = X_set[:, 1].max() + 1000, step = 0.25))
plt.contourf(X1, X2, classifier.predict(sc.transform(np.array([X1.ravel(), X2.ravel()]).T)).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('salmon', 'dodgerblue')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('salmon', 'dodgerblue'))(i), label = j)
plt.title('Logistic Regression (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

#Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, y_set = sc.inverse_transform(X_test), y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 10, stop = X_set[:, 0].max() + 10, step = 0.25),
                     np.arange(start = X_set[:, 1].min() - 1000, stop = X_set[:, 1].max() + 1000, step = 0.25))
plt.contourf(X1, X2, classifier.predict(sc.transform(np.array([X1.ravel(), X2.ravel()]).T)).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('salmon', 'dodgerblue')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('salmon', 'dodgerblue'))(i), label = j)
plt.title('Logistic Regression (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

시각화 결과를 보면 K-NN알고리즘이 로지스틱 회귀보다는 더 좋은 모델을 만들어내는 것을 볼 수 있다.


 

728x90