ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KK-최근접 이웃 (KNN, K-Nearest Neighbors) 알고리즘: 개념부터 실습까지
    🐍 Python 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
Designed by Tistory.