728x90
반응형
반응형
1. K-NN 알고리즘이란?
1) 기본 개념
- K-NN은 주변의 K개 이웃 데이터를 기준으로 새로운 데이터의 클래스 또는 값을 예측하는 비모수(non-parametric) 알고리즘입니다.
- 데이터를 학습하지 않고 저장 후, 예측 시 거리 계산을 통해 이웃을 찾습니다.
2) 주요 특징
- 간단한 구현: 수식보다 데이터 비교를 중심으로 작동.
- 거리 기반 계산: 유클리드 거리(Euclidean Distance) 등이 일반적으로 사용됨.
3) 예시
- 새로운 학생이 좋아할 스포츠를 예측한다고 가정.
- 이미 알고 있는 학생들의 성별과 나이를 기준으로, 가장 가까운 5명의 학생(K=5)을 확인하여 결과를 결정.
2. K-NN의 작동 원리
1) 주요 단계
- 데이터 저장: 모든 학습 데이터를 메모리에 저장.
- 거리 계산: 새로운 데이터 포인트와 기존 데이터 사이의 거리를 계산.
- K개의 이웃 선택: 거리 기준으로 가장 가까운 K개의 데이터를 선택.
- 결과 도출:
- 분류 문제: 다수결(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
반응형