AI/이론

129. [Python] [Machine Learning] : K-NN 알고리즘

천재단미 2025. 1. 28. 15:39
728x90
반응형

반응형

 

 




1. K-NN 알고리즘이란?

1) 기본 개념

  • K-NN은 주변의 K개 이웃 데이터를 기준으로 새로운 데이터의 클래스 또는 값을 예측하는 비모수(non-parametric) 알고리즘입니다.
  • 데이터를 학습하지 않고 저장 후, 예측 시 거리 계산을 통해 이웃을 찾습니다.

2) 주요 특징

  • 간단한 구현: 수식보다 데이터 비교를 중심으로 작동.
  • 거리 기반 계산: 유클리드 거리(Euclidean Distance) 등이 일반적으로 사용됨.

3) 예시

  • 새로운 학생이 좋아할 스포츠를 예측한다고 가정.
  • 이미 알고 있는 학생들의 성별과 나이를 기준으로, 가장 가까운 5명의 학생(K=5)을 확인하여 결과를 결정.

 

 

 

 

2. K-NN의 작동 원리

1) 주요 단계

  1. 데이터 저장: 모든 학습 데이터를 메모리에 저장.
  2. 거리 계산: 새로운 데이터 포인트와 기존 데이터 사이의 거리를 계산.
  3. K개의 이웃 선택: 거리 기준으로 가장 가까운 K개의 데이터를 선택.
  4. 결과 도출:
    • 분류 문제: 다수결(Majority Voting)로 클래스를 결정.
    • 회귀 문제: K개의 평균 값으로 예측.

2) 거리 계산 방식

  • 유클리드 거리: d=i=1∑n(xi−yi)2
  • d=∑i=1n(xi−yi)2d = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}
  • 맨하탄 거리(Manhattan Distance): d=i=1∑n∣xi−yi∣
  • d=∑i=1n∣xi−yi∣d = \sum_{i=1}^{n} |x_i - y_i|

 

 

 


 

 

 

 

 

3. 데이터 준비

 

3-1. 데이터 로드

첨부된 데이터셋을 활용하여 실습을 진행합니다.

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 데이터 로드
df = pd.read_csv('../data/Social_Network_Ads.csv')

df.head(2)

 

출력

 

 

 

 

3-2. Feature와 Target 정의

y = df['Purchased']
X = df.loc[ : ,'Age' : 'EstimatedSalary']

 

 

 

 

3-3. 피처 스케일링

from sklearn.preprocessing import MinMaxScaler, StandardScaler
scaler_X = StandardScaler()
scaler_X.fit_transform( X )

출력

 

 

 

 

 

3-4. 데이터 분할

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y ,test_size = 0.2, random_state = 27)

 

 

 


 

 

 

 

4. K-NN 구현

 

4-1. 모델 생성 및 훈련

from sklearn.neighbors import KNeighborsClassifier

# K-NN 모델 생성
# n_neighbors =  숫자는 홀수로 넣어준다 .
knn = KNeighborsClassifier(n_neighbors=5)  # K=5
knn.fit(X_train, y_train)

 

 

 

 

 

4-2. 예측

y_pred = classifier.predict(X_test)

y_pred

 

 

 

 

 


 

 

 

 

 

5. 모델 평가

 

5-1. 정확도 평가

from sklearn.metrics import confusion_matrix, accuracy_score, classification_report

cm = confusion_matrix(y_test,y_pred)
cm

 

출력

array([[47,  7],
       [ 9, 17]])
accuracy_score(y_test,y_pred)

 

출력

0.8
print( classification_report(y_test,y_pred))

 

출력

       precision    recall  f1-score   support

           0       0.84      0.87      0.85        54
           1       0.71      0.65      0.68        26

    accuracy                           0.80        80
   macro avg       0.77      0.76      0.77        80
weighted avg       0.80      0.80      0.80        80

 

 

 

 

5-2. 시각화

import seaborn as sb

sb.heatmap(data=cm, cmap='RdBu', annot=True, linewidths = 0.8) 
plt.show()

 

 

728x90
반응형
home top bottom
}