AI/ML

[ML] 지도학습 - 분류모델 (KNN)

죵욜이 2024. 12. 29. 00:38

KNN 이란?

  • K-최근접 이웃 (K-Nearest Neighbors, KNN) 은 분류와 회귀 분석에 사용되는 비모수적 방법
  • KNN 은 간단하면서도 효과적인 알고리즘으로, 새로운 데이터 포인트를 가장 가까운 K 개의 이웃데이터와 비교하여 분류하거나 값을 예측

KNN의 주요 특징

  1. 비모수(non-parametric) 알고리즘:
    • KNN은 사전에 데이터의 분포를 가정하지 않는 비모수적 모델입니다. 대신, 학습 데이터 자체가 모델로 사용됩니다.
  2. 지연 학습(lazy learning):
    • KNN은 학습 과정에서 실제로 "학습"을 하지 않습니다. 대신 모든 데이터를 저장하고, 예측 시점에서 계산을 수행합니다.
    • 새로운 데이터에 대해 예측할 때, 저장된 데이터를 기준으로 최근접 이웃을 계산합니다.

KNN 알고리즘 작동 방식

  1. 데이터 저장:
    • KNN은 학습 데이터와 레이블(목표 변수)을 메모리에 저장합니다.
  2. 거리 계산:
    • 새로운 데이터 포인트가 주어지면, 저장된 모든 학습 데이터와의 거리를 계산합니다. 가장 많이 사용하는 거리 척도는 다음과 같습니다:
      • 유클리디안 거리(Euclidean Distance)

    • 맨해튼 거리(Manhattan Distance)

  • 코사인 유사도(Cosine Similarity) : 주로 텍스트 데이터에 사용
  1. 가장 가까운 K개의 이웃 선택:
    • 거리 계산 결과를 기준으로 가장 가까운 K개의 데이터 포인트를 선택합니다.
  2. 분류/회귀:
    • 분류: 선택된 K개의 이웃 중에서 가장 많이 등장한 클래스를 예측 결과로 반환합니다. (다수결 원칙)
    • 회귀: 선택된 K개의 이웃 값의 평균이나 가중 평균을 반환합니다.

K 값의 선택

  • K 값은 모델의 성능에 중요한 영향을 미칩니다.
    • K가 너무 작으면:
      • 모델이 노이즈에 민감해지고, 과적합(overfitting)될 가능성이 있습니다.
    • K가 너무 크면:
      • 모델이 지나치게 단순해져서, 데이터의 세부적인 패턴을 놓치고 과소적합(underfitting)될 수 있습니다.
    • 일반적으로 홀수 값을 선택하여 동점 상황을 방지합니다.
    • 최적의 K 값은 교차 검증(cross-validation)을 통해 찾는 것이 좋습니다.

KNN의 장점

  1. 직관적이고 이해하기 쉬움:
    • 알고리즘이 단순해서 구현이 쉽고, 데이터 간의 유사성을 기반으로 예측을 수행하기 때문에 직관적입니다.
  2. 비선형 데이터 처리 가능:
    • KNN은 데이터의 분포나 관계를 가정하지 않기 때문에, 비선형 데이터를 처리할 수 있습니다.
  3. 다목적:
    • 분류와 회귀 모두에 사용할 수 있습니다.
  4. 유연성:
    • 다양한 거리 척도를 선택하여 데이터 특성에 맞게 조정할 수 있습니다.

KNN의 단점

  1. 계산 비용이 큼:
    • 학습 단계에서 데이터를 저장만 하고, 예측 시점에 모든 학습 데이터와 거리를 계산하므로, 데이터가 많거나 차원이 높으면 속도가 느려질 수 있습니다.
  2. 메모리 사용량이 큼:
    • 모든 학습 데이터를 저장하므로 메모리 사용량이 높습니다.
  3. 스케일의 민감성:
    • 거리 기반 알고리즘이므로, 데이터의 스케일(예: 값의 크기)에 매우 민감합니다. 이를 해결하려면 표준화(Standardization) 또는 **정규화(Normalization)**를 수행해야 합니다.
  4. 노이즈에 민감:
    • 노이즈 데이터가 가까운 이웃으로 선택되면 잘못된 예측을 할 가능성이 있습니다.

KNN이 잘 동작하는 경우

  • 데이터가 적을 때: 적은 양의 데이터로도 높은 성능을 발휘할 수 있습니다.
  • 클래스 간의 경계가 명확할 때: 각 클래스가 고유한 영역에 잘 분포되어 있다면 KNN은 효과적입니다.
  • 저차원 데이터: 데이터 차원이 높아지면(고차원 데이터) 거리 계산의 정확도가 떨어질 수 있습니다. 이를 해결하려면 차원 축소(예: PCA)를 사용할 수 있습니다.

KNN 활용 사례

  1. 추천 시스템:
    • 사용자의 행동(예: 구매 기록)과 유사한 행동을 보이는 다른 사용자들을 기준으로 추천.
  2. 의료 진단:
    • 환자의 증상이 이전 환자들과 얼마나 유사한지 비교하여 질병을 예측.
  3. 패턴 인식:
    • 손글씨 숫자 인식, 이미지 분류 등.
  4. 이상치 탐지:
    • 특정 데이터 포인트가 다른 데이터와 얼마나 다른지 계산하여 이상치를 탐지.

예시

- 데이터 로드 및 전처리

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

- 모델 학습

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 모델 생성 및 학습
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")