🐍 Python/🐍 인공지능

KK-최근접 이웃 (KNN, K-Nearest Neighbors) 알고리즘: 개념부터 실습까지

itstory(Booho) 2025. 1. 31. 11:16
728x90

1️⃣ K-최근접 이웃(KNN)이란?📌 KNN의 핵심 개념

  • 비모수적(Non-parametric) 모델: 사전에 학습을 하지 않고, 데이터가 들어올 때마다 계산하여 예측.
  • 거리 기반 분류: 새로운 데이터가 들어왔을 때, 가장 가까운 K개의 데이터 포인트를 찾아 다수결 투표로 분류 결정.
  • K 값의 설정: K 값이 크면 과적합(overfitting)을 방지하지만, 너무 크면 정확도가 떨어질 수 있음.

📌 KNN의 활용 사례

  • 질병 예측 (환자의 증상이 기존 환자와 얼마나 유사한가?)
  • 추천 시스템 (비슷한 취향의 사용자가 좋아하는 콘텐츠 추천)
  • 이미지 분류 (손글씨 숫자 인식 등)

2️⃣ KNN의 동작 원리

  1. 데이터 포인트 간의 거리 계산
    • 가장 일반적으로 사용되는 거리는 유클리드 거리(Euclidean Distance)
    • 유클리드 거리 공식:
  2. K개의 최근접 이웃 찾기
    • 데이터셋 내에서 가장 가까운 K개의 포인트를 선택
  3. 다수결 투표(Majority Vote)로 분류 결정
    • 선택된 K개의 이웃 중 가장 많이 등장하는 클래스로 예측

 

📌 K 값 선택의 중요성

  • K가 너무 작으면 과적합(overfitting) 문제가 발생할 수 있음.
  • K가 너무 크면 일반화(generalization) 성능이 저하될 수 있음.
  • 일반적으로 홀수 K를 사용하여 동점 상황을 방지

3️⃣ 실습: KNN을 활용한 광고 클릭 예측

  • 데이터셋: Social_Network_Ads.csv
  • 목표: 사용자의 나이와 연봉을 기반으로 광고 클릭 여부 예측

📌 1. 데이터 로드 및 전처리

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score

# 데이터 로드
dataset = pd.read_csv('Social_Network_Ads.csv')

# 독립변수(X)와 종속변수(y) 분리
X = dataset[['Age', 'EstimatedSalary']].values
y = dataset['Purchased'].values

# 훈련 데이터와 테스트 데이터로 분리 (80:20 비율)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 피처 스케일링 (표준화)
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

데이터를 전처리하고, 훈련 데이터와 테스트 데이터로 나눕니다.

 

📌 2. KNN 모델 학습 및 예측

# KNN 모델 생성 (K=5)
classifier = KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2)
classifier.fit(X_train, y_train)

K=5로 설정하여 모델을 학습시킵니다.

# 예측 수행
y_pred = classifier.predict(X_test)

 

✅ 테스트 데이터를 기반으로 예측값을 도출합니다.

 

📌 3. 모델 평가: 혼동 행렬 및 정확도 분석

# 혼동 행렬 및 정확도 계산
cm = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)

print("Confusion Matrix:")
print(cm)
print(f"Accuracy: {accuracy:.2f}")

혼동 행렬(Confusion Matrix)과 정확도를 출력하여 모델 성능을 평가합니다.

 

4️⃣ 평가 및 K 값 선택

 

실제 값 → 예측 값 ↓ 0 (미구매) 1 (구매)
0 (미구매) TN (True Negative) FP (False Positive)
1 (구매) FN (False Negative) TP (True Positive)

📌 정확도 분석

  • 정확도(Accuracy): 전체 예측 중 맞춘 비율
  • 정밀도(Precision), 재현율(Recall), F1-score 도출 가능

📌 최적의 K 찾기

accuracies = []
k_values = range(1, 21)

for k in k_values:
    classifier = KNeighborsClassifier(n_neighbors=k)
    classifier.fit(X_train, y_train)
    y_pred = classifier.predict(X_test)
    accuracies.append(accuracy_score(y_test, y_pred))

# 그래프 시각화
plt.plot(k_values, accuracies, marker='o')
plt.xlabel('K 값')
plt.ylabel('정확도')
plt.title('K 값에 따른 정확도 변화')
plt.show()

위 그래프를 통해 최적의 K 값을 찾아볼 수 있습니다.

 

5️⃣ 결론 및 요약

  • KNN은 거리 기반으로 분류하는 간단하면서도 강력한 알고리즘입니다.
  • K 값의 선택이 모델 성능에 중요한 영향을 미칩니다.
  • 최적의 K 값을 찾기 위해 교차 검증(Cross-validation) 또는 그래프 분석을 활용할 수 있습니다.
  • 과적합을 방지하기 위해 K 값을 적절히 조정해야 합니다.

  1.  
728x90
반응형