-
KK-최근접 이웃 (KNN, K-Nearest Neighbors) 알고리즘: 개념부터 실습까지🐍 Python 2025. 1. 31. 11:16728x90
1️⃣ K-최근접 이웃(KNN)이란?📌 KNN의 핵심 개념
- 비모수적(Non-parametric) 모델: 사전에 학습을 하지 않고, 데이터가 들어올 때마다 계산하여 예측.
- 거리 기반 분류: 새로운 데이터가 들어왔을 때, 가장 가까운 K개의 데이터 포인트를 찾아 다수결 투표로 분류 결정.
- K 값의 설정: K 값이 크면 과적합(overfitting)을 방지하지만, 너무 크면 정확도가 떨어질 수 있음.
📌 KNN의 활용 사례
- 질병 예측 (환자의 증상이 기존 환자와 얼마나 유사한가?)
- 추천 시스템 (비슷한 취향의 사용자가 좋아하는 콘텐츠 추천)
- 이미지 분류 (손글씨 숫자 인식 등)
2️⃣ KNN의 동작 원리
- 데이터 포인트 간의 거리 계산
- 가장 일반적으로 사용되는 거리는 유클리드 거리(Euclidean Distance)
- 유클리드 거리 공식:
- K개의 최근접 이웃 찾기
- 데이터셋 내에서 가장 가까운 K개의 포인트를 선택
- 다수결 투표(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 값을 적절히 조정해야 합니다.
728x90'🐍 Python' 카테고리의 다른 글
서포트 벡터 머신 (SVM, Support Vector Machine): 개념부터 실습까지 (0) 2025.01.31 리니어리그레션 (Linear Regression) 완벽 이해: 경력과 연봉의 관계 예측하기- Prediction (예측) (0) 2025.01.30 머신러닝과 데이터 전처리 - 초보자를 위한 친절한 가이드 (0) 2025.01.30 파이썬 그래프 관련 함수 정리 (Matplotlib 중심) (0) 2025.01.29 로지스틱 회귀 (Logistic Regression): 머신러닝 이진 분류 알고리즘의 이해와 실습 (0) 2025.01.27