본문 바로가기
머신러닝

kNN

by 미생22 2024. 5. 22.
728x90

K-최근접 이웃 알고리즘(K-Nearest Neighbors, KNN)은 앙상블 기법이 아닙니다. KNN은 단일 모델 기반의 지도 학습 알고리즘으로, 분류와 회귀 모두에 사용할 수 있습니다. knn의 작동원리는 매우 직관적입니다. 새로운 데이터 포인트의 클래스를 예측할 때, knn은 이미 레이블이 지정된 데이터 포인트 중에서 가장 가까운 k개의 이웃을 찾아 그들의 레이블을 기반으로 예측을 수행합니다.

  1. 거리 측정: 새로운 데이터 포인트와 훈련 데이터 세트의 모든 데이터 포인트 간의 거리를 계산합니다. 주로 유클리드 거리가 사용됩니다.
  2. 이웃 선택: 가장 가까운 K개의 데이터 포인트(이웃)를 선택합니다.
  3. 다수결 투표 (분류): 이웃의 레이블을 기반으로 다수결 투표를 통해 새로운 데이터 포인트의 클래스를 예측합니다.
  4. 평균 계산 (회귀): 이웃의 레이블 값을 평균하여 새로운 데이터 포인트의 값을 예측합니다.

knn은 앙상블 기법이 아닙니다. 앙상블 기법은 여러 개의 모델을 결합하여 하나의 예측을 만드는 방법입니다. 대표적인 앙상블 기법에는 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등이 있습니다. 각기 다른 모델을 결합하여 예측 성능을 향상시키는 것이 목표입니다.

KNN은 단일 모델로 작동하며, 여러 모델의 결합이나 투표 과정을 포함하지 않습니다. 예측을 위해 단일 데이터 세트와의 거리 계산을 기반으로 합니다.

 

새로운 데이터가 있을 때, 기존 데이터의 그룹 중 어떤 그룹에 속하는지를 분류하는 문제입니다.

k는 몇번째 가까운 데이터까지 볼 것인가를 정하는 수치입니다.

 

여기서 4,4의 데이터 N이 나타난 경우 어떤 그룹에 들어가야할까요?

k=5라고 하면 5번째까지 가까운 데이터까지 고려해서 따라가라고 하는 겁니다.

k가 1이면 파란동그라미, k가 3이면 초록세모, k가 5이면 다시 파란동그라미가 되네요.

거리를 재는 방법은 유클리드 기하법을 씁니다.

각각의 거리의 차를 제곱한걸 더해서 루트를 씌운다는 것입니다.

또 knn은 거리를 재기 때문에 x가 1단위 ,y가 1000단위로 1칸일 경우 표준화가 필요합니다.

 

장단점으로는

- 실시간 예측을 위한 학습이 필요하지 않습니다. 이미 라벨이 붙어있는 것들한테 거리를 재기 때문입니다.

- 결국 속도가 빨라집니다.

- 고차원 데이터에는 적합하지 않습니다.

 

예전에 썼던 iris 데이터를 가지고 knn을 돌려보겠습니다.

 

from sklearn.datasets import load_iris

iris = load_iris()

 

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3,
                                                    random_state=12,
                                                    stratify=iris.target)

 

train, test 데이터를 구분했으니 이제 knn을 돌리겠습니다.

#kNN을 돌리겠습니다.

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5) #근처에 있는 5개를 가져온다고 하겠습니다.
knn.fit(X_train, y_train) #실제로 학습하지않습니다. 절차상 하는겁니다.

 

실제로 학습하지않습니다. 절차상 하는겁니다.

knn의 옵션인 n_neighbors=5는 근처에 있는 5개를 가져온다고 하는겁니다.

 

accuracy score를 확인해보겠습니다.

 

#accuracy를 확인해보겠습니다.

from sklearn.metrics import accuracy_score

pred = knn.predict(X_test)
print(accuracy_score(y_test, pred))

 

confusion matrix를 기억하나요? 이진분류의 혼동행렬입니다.

  • True Positive (TP): 실제로 양성인 경우를 모델이 양성으로 정확하게 예측한 경우.
  • False Positive (FP): 실제로 음성인 경우를 모델이 양성으로 잘못 예측한 경우 (일명 Type I 오류).
  • False Negative (FN): 실제로 양성인 경우를 모델이 음성으로 잘못 예측한 경우 (일명 Type II 오류).
  • True Negative (TN): 실제로 음성인 경우를 모델이 음성으로 정확하게 예측한 경우.

이 데이터를 가져와보겠습니다.

from sklearn.metrics import classification_report, confusion_matrix

confusion_matrix(y_test, pred)

confusion matrix가 3x3인 행렬이네요. 

다중 클래스 분류에서는 이와같이 나올 수 있습니다.

클래스가 A, B, C 세 개가 있다고 가정하면 혼동 행렬은 다음과 같이 나타낼 수 있습니다.

  • 정밀도 (Precision): 특정 클래스로 예측된 샘플 중 실제로 해당 클래스인 샘플의 비율.
  • 재현율 (Recall): 실제 특정 클래스인 샘플 중 해당 클래스로 올바르게 예측된 샘플의 비율.
  • F1 점수 (F1 Score): 정밀도와 재현율의 조화 평균.

이 점수들을 미리 나타내주는 classification report를 프린트해보겠습니다.

print(classification_report(y_test, pred))

class 1에 대해서 맞출 확률은 100%가 나오네요.

728x90