웹사이트 검색

Python의 K-최근접 이웃(KNN)


K-최근접 이웃(kNN)은 분류 및 회귀 작업을 모두 처리하는 데 사용할 수 있는 감독 기계 학습 기술입니다. 저는 KNN을 실생활에서 유래한 알고리즘이라고 생각합니다. 사람들은 주변 사람들에게 영향을 받는 경향이 있습니다.

K-최근접 이웃 알고리즘의 아이디어

우리의 행동은 함께 자란 동료들에 의해 형성됩니다. 우리의 부모는 또한 다양한 방식으로 우리의 성격을 형성합니다. 스포츠를 즐기는 사람들 사이에서 자라면 결국 스포츠를 좋아하게 될 가능성이 큽니다. 물론 예외가 있습니다. KNN도 비슷하게 작동합니다.

  1. 가까운 친구가 있고 그/그녀와 대부분의 시간을 보낸다면 결국 비슷한 관심사를 갖고 같은 것을 사랑하게 될 것입니다. 그것은 k=1인 kNN입니다.
  2. 5명의 그룹과 지속적으로 어울리면 그룹의 각 구성원이 행동에 영향을 미치고 결국 평균 5가 됩니다. 즉, k=5인 kNN입니다.

kNN 분류기는 다수결 원칙을 사용하여 데이터 포인트의 클래스를 식별합니다. k가 5로 설정되면 가장 가까운 5개의 클래스가 검사됩니다. 우세 클래스에 따라 예측이 수행됩니다. 마찬가지로 kNN 회귀는 5개의 가장 가까운 위치의 평균값을 사용합니다.

가까운 사람들을 목격하지만 데이터 포인트가 가까운 것으로 간주되는 방법은 무엇입니까? 데이터 포인트 사이의 거리가 측정됩니다. 거리를 추정하는 다양한 기술이 있습니다. 유클리드 거리(p=2인 Minkowski 거리)는 가장 정기적으로 사용되는 거리 측정 중 하나입니다. 아래 그래픽은 2차원 공간에서 두 점 사이의 유클리드 거리를 계산하는 방법을 설명합니다. 위치의 x 좌표와 y 좌표 차이의 제곱을 사용하여 결정됩니다.

Python에서 KNN 알고리즘 구현

이제 Python에서 KNN을 구현해 보겠습니다. 코드를 분해하고 이해하는 데 도움이 되는 단계를 살펴보겠습니다.

1. 모듈 가져오기

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

2. 데이터셋 생성

Scikit-learn에는 기계 학습 알고리즘을 테스트하는 데 유용한 합성 데이터 세트를 만들기 위한 많은 도구가 있습니다. make blobs 메서드를 사용하겠습니다.

X, y = make_blobs(n_samples = 500, n_features = 2, centers = 4,cluster_std = 1.5, random_state = 4)

이 코드는 총 2개의 특성을 가진 4개의 클래스로 분리된 500개 샘플의 데이터 세트를 생성합니다. 연관된 매개변수를 사용하여 샘플, 특성 및 클래스 수를 빠르게 변경할 수 있습니다. 또한 각 클러스터(또는 클래스)의 분포를 변경할 수도 있습니다.

3. 데이터 세트 시각화

plt.style.use('seaborn')
plt.figure(figsize = (10,10))
plt.scatter(X[:,0], X[:,1], c=y, marker= '*',s=100,edgecolors='black')
plt.show()

4. 데이터를 교육 및 테스트 데이터 세트로 분할

모든 감독 기계 학습 방법에 대해 데이터 세트를 훈련 및 테스트 세트로 분할하는 것이 중요합니다. 먼저 모델을 교육한 다음 데이터 세트의 다양한 부분에서 테스트합니다. 데이터를 분리하지 않으면 이미 알고 있는 데이터로 모델을 테스트하는 것입니다. train_test_split 메서드를 사용하면 간단히 테스트를 분리할 수 있습니다.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

열차 크기 및 테스트 크기 옵션을 사용하여 원본 데이터가 열차 및 테스트 세트에 각각 얼마나 활용되는지 결정할 수 있습니다. 기본 분리는 훈련 세트의 경우 75%이고 테스트 세트의 경우 25%입니다.

5. KNN 분류기 구현

그런 다음 kNN 분류기 개체를 빌드합니다. k 값의 관련성을 입증하기 위해 k 값이 1과 5인 두 개의 분류기를 개발했습니다. 그런 다음 모델은 기차 세트를 사용하여 훈련됩니다. k 값은 n_neighbors 인수를 사용하여 선택됩니다. 기본값이 5이므로 명시적으로 지정할 필요가 없습니다.

knn5 = KNeighborsClassifier(n_neighbors = 5)
knn1 = KNeighborsClassifier(n_neighbors=1)

6. KNN 분류기에 대한 예측

그런 다음 테스트 세트에서 대상 값을 예측하고 실제 값과 비교합니다.

knn5.fit(X_train, y_train)
knn1.fit(X_train, y_train)

y_pred_5 = knn5.predict(X_test)
y_pred_1 = knn1.predict(X_test)

7. 두 k 값 모두에 대한 정확도 예측

from sklearn.metrics import accuracy_score
print("Accuracy with k=5", accuracy_score(y_test, y_pred_5)*100)
print("Accuracy with k=1", accuracy_score(y_test, y_pred_1)*100)

k 값의 정확도는 다음과 같이 나옵니다.

Accuracy with k=5 93.60000000000001
Accuracy with k=1 90.4

8. 예측 시각화

k 값의 영향을 확인하기 위해 k=5 및 k=1인 테스트 세트 및 예측 값을 살펴보겠습니다.

plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_5, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=5", fontsize=20)

plt.subplot(1,2,2)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_1, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=1", fontsize=20)
plt.show()

KNN 구현을 위한 최상의 k 값을 찾는 방법

  1. k=1: 모델이 너무 좁고 적절하게 일반화되지 않았습니다. 노이즈에 대한 민감도도 높습니다. 이 모델은 열차 세트에서 높은 정확도로 이전에 알려지지 않은 새로운 데이터 포인트를 예측하지만 이전에 본 적이 없는 새로운 데이터 포인트에 대한 예측은 좋지 않습니다. 그 결과 모델이 과적합될 가능성이 높습니다.
  2. k=100: 모델이 지나치게 광범위하고 학습 및 테스트 세트 모두에서 신뢰할 수 없습니다. 과소적합은 이러한 상황에 대한 용어입니다.

KNN 알고리즘의 한계

KNN은 파악하기 쉬운 알고리즘입니다. 예측을 생성하기 위해 내부 기계 학습 모델에 의존하지 않습니다. KNN은 작업해야 할 범주가 몇 개인지(하나 이상) 알아야 하는 분류 방법입니다. 즉, 얼마나 많은 카테고리가 있는지 알 필요 없이 새 카테고리를 추가해야 하는지 여부를 신속하게 평가할 수 있습니다.

이 단순성의 단점은 KNN이 건강한 인구에서 희귀 품목의 유병률을 모르기 때문에 달성할 수 없는 특이한 것(예: 새로운 질병)을 예상할 수 없다는 것입니다.

KNN은 테스트 세트에서 높은 정확도를 달성하지만 시간과 메모리 측면에서 더 느리고 더 비쌉니다. 예측을 위해 전체 학습 데이터 세트를 저장하려면 상당한 양의 메모리가 필요합니다. 또한 유클리드 거리는 크기에 매우 민감하기 때문에 크기가 큰 데이터 세트의 특성은 항상 크기가 작은 특성보다 중요합니다.

마지막으로 지금까지 논의한 모든 내용을 고려할 때 KNN은 대규모 데이터 세트에 이상적이지 않다는 점을 명심해야 합니다.

결론

이제 KNN 알고리즘을 더 잘 이해하셨기를 바랍니다. KNN이 예측을 생성하기 위해 전체 데이터 세트를 저장하는 방법에 대한 다양한 아이디어를 살펴보았습니다.

KNN은 예측을 위해 학습 모델을 사용하지 않는 여러 지연 학습 알고리즘 중 하나입니다. 들어오는 관찰과 이미 사용 가능한 데이터 간의 유사성을 평균화하여 KNN은 즉석에서 예측을 생성합니다.

읽어 주셔서 감사합니다!