본문 바로가기
Machine Learning/Supervised

머신러닝 분류 모델 : K-Nearest Neighbor (KNN)

by ssury94 2025. 1. 30.
 
 
 

 

 

 

 

 

K-Nearest Neighbor (KNN) 알고리즘이란? 🤔

KNN 알고리즘은 쉽게 말해 "가까운 친구들끼리 의견을 모아서 결정하는 방식"입니다. 예를 들어, 새로운 음식점을 가려는데 어디가 맛있는지 모를 때 보통 어떻게 하나요? 주변 친구들에게 물어보겠죠!

  • A 친구: "여기 맛있어!"
  • B 친구: "여기도 좋아!"
  • C 친구: "난 여기 추천!"

대부분이 추천하는 곳으로 가게 되는 것처럼, KNN도 비슷한 원리로 작동합니다. 즉, 새로운 데이터가 주어지면 가장 가까운 K개의 데이터를 찾아서 다수결로 결정을 내리는 방식입니다. 😊

 

 

KNN 알고리즘의 동작 원리 🏃‍♂️

KNN은 데이터의 유사도를 기준으로 분류하거나 예측을 수행합니다. 기본적인 과정은 다음과 같습니다.

 

 

1️⃣ 거리 측정: 새로운 데이터와 기존 데이터 간의 거리를 계산합니다. (유클리드 거리 등 활용)

 

 

 

2️⃣ 가까운 K개의 이웃 찾기: 가장 가까운 데이터 K개를 선택합니다.

3️⃣ 투표 또는 평균 계산:

  • 분류 문제: 가장 많은 표를 얻은 클래스로 결정
  • 회귀 문제: K개의 평균값을 사용하여 예측값 결정

 

 

 

K 값(K-Neighbors)의 중요성 🎯

K 값은 알고리즘의 성능을 결정하는 중요한 요소입니다.

  • K가 너무 작으면? 주변 몇 개의 데이터에 너무 의존하여 과적합(overfitting)될 가능성이 있습니다.
  • K가 너무 크면? 너무 많은 데이터를 평균내어 버려서 특징이 희석될 수 있습니다.

💡 최적의 K 값 찾기:

  • 보통 K는 홀수로 설정하는 것이 좋습니다. (특히 2개의 클래스를 구분할 때)
  • 데이터에 따라 K 값을 조절하면서 테스트해보는 것이 중요합니다.

 

K-NN 이용한 분석 예제 - 구매를 할 것인가 말 것인가

# 1. 분석 데이터 로드
# 연봉과 나이를 토대로 구매를 할지, 말지를 분석하는 머닝러신입니다.

# 2. 결측치 확인
df.isna().sum()
df.dropna(inplace=True)

#3. X,y 분리
y=df['Purchased']
X=df.loc[ : , 'Age':'EstimatedSalary']
# df에 문자열데이터가 있을경우 카테고리컬데이터 개수에 따라 원핫인코딩 혹은 라벨인코딩으로 데이터 전처리

#4. 데이터 스케일링
from sklearn.preprocessing import StandardScaler

#5. 스케일링 수행
scaler = StandardScaler()
X=scaler_X.fit_transform(X)

#6. 테스트데이터와 트레이닝데이터 분리
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)

#7. 모델링
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5)
# n_neighbors= 가까운 데이터 설정, 홀수로 넣어야한다.
classifier.fit(X_train,y_train)

#8. 성능평가 confusion_matrix
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
cm=confusion_matrix(y_test, y_pred)

# 정확도 측정 (블로그 글 참고)
cm=confusion_matrix(y_test, y_pred)
accuracy_score(y_test, y_pred)
print(classification_report(y_test, y_pred))

 

 

1️⃣ 혼동 행렬(Confusion Matrix) 📋

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)

# 출력
array([[47,  7],
       [ 3, 23]])

혼동 행렬은 모델의 예측 결과와 실제 정답을 비교하여 얼마나 정확한 예측을 했는지를 확인하는 데 사용됩니다.

예제: 음주운전 판별 모델 🚗

실제/예측 예측(✅) 정상운전 예측(⛔) 음주운전

실제(✅) 정상운전 TP (참긍정) FN (거짓부정)
실제(⛔) 음주운전 FP (거짓긍정) TN (참부정)

✔️ TP (True Positive, 참긍정): 실제 정상운전이고, 모델도 정상운전이라고 예측

✔️ TN (True Negative, 참부정): 실제 음주운전이고, 모델도 음주운전이라고 예측

✔️ FP (False Positive, 거짓긍정): 실제 음주운전인데, 모델이 정상운전이라고 오판 ❌

✔️ FN (False Negative, 거짓부정): 실제 정상운전인데, 모델이 음주운전으로 잘못 예측 ❌

 

📌 이 행렬을 통해 모델이 어떤 유형의 오류를 많이 범하는지 분석할 수 있습니다!

 

 

 

 

2️⃣ 정확도(Accuracy) 🎯

**정확도(Accuracy)**는 모델이 올바르게 예측한 비율을 의미합니다.

Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{TP + TN + FP + FN}

✔️ 예제:

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)

# 출력
0.875

 

하지만 정확도만으로 모델의 성능을 평가하는 것은 위험할 수 있습니다.

예를 들어, 데이터가 불균형한 경우(정상운전 95%, 음주운전 5%) 모델이 무조건 "정상운전"이라고 예측해도 95% 정확도를 얻을 수 있습니다. 따라서 다른 지표도 함께 확인해야 합니다. ⚠️

 

 

 

3️⃣ 정밀도(Precision), 재현율(Recall), F1-score 📊

classification_report(y_test, y_pred)를 사용하면 정밀도(Precision), 재현율(Recall), F1-score를 한 번에 확인할 수 있습니다.

주요 개념 ✅

✔️ 정밀도(Precision): 모델이 양성(예: 음주운전)을 예측한 것 중 실제로 맞는 비율

Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}

✔️ 재현율(Recall): 실제 양성 중에서 모델이 올바르게 예측한 비율

Recall=TPTP+FNRecall = \frac{TP}{TP + FN}

✔️ F1-score: 정밀도와 재현율의 조화를 고려한 점수

F1−score=2×Precision×RecallPrecision+RecallF1-score = 2 \times \frac{Precision \times Recall}{Precision + Recall}

✔️ 예제:

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

# 출력
              precision    recall  f1-score   support

           0       0.94      0.87      0.90        54
           1       0.77      0.88      0.82        26

    accuracy                           0.88        80
   macro avg       0.85      0.88      0.86        80
weighted avg       0.88      0.88      0.88        80

📌 활용 예시:

  • 정밀도가 낮으면? FP(거짓 긍정)가 많음 → "음주운전이 아닌 사람을 음주운전자로 오판할 가능성 큼"
  • 재현율이 낮으면? FN(거짓 부정)가 많음 → "음주운전자를 정상운전자로 오판할 가능성 큼"
  • F1-score는 Precision과 Recall이 균형 잡혀야 높아지므로, 모델의 전반적인 성능을 평가하는 좋은 지표

 

 

 

 

KNN 알고리즘의 장점과 단점 ⚖️

장점

  • 이해하기 쉽고 직관적
  • 데이터의 분포를 가정할 필요 없음
  • 비선형 데이터도 처리 가능

단점

  • 데이터가 많아질수록 속도가 느려짐
  • 이상치(Outlier)에 민감
  • 차원이 너무 많으면 성능 저하 가능 (차원의 저주)

 

 

KNN을 사용하면 좋은 경우 💡

  • 범죄 데이터 분석: 유사한 사건 패턴을 분석하여 범죄 유형 예측
  • 이상 거래 탐지: 신용카드 사용 패턴을 보고 사기 여부 판별
  • 의료 진단: 환자의 증상 데이터를 비교하여 질병 예측

KNN은 간단하지만 활용도가 높은 알고리즘입니다! 알고리즘을 처음 접하는 분들이라면 한 번 직접 실습해 보면서 감을 익혀보는 것도 좋겠습니다. 🚀

 

 

 

마무리 🏁

KNN은 "가까운 이웃들의 의견을 반영해 결정하는 방식"으로, 우리 주변에서도 쉽게 찾아볼 수 있는 개념입니다. 다만 데이터가 많아질수록 속도가 느려질 수 있다는 점을 고려해야 합니다.

경찰 업무를 비롯해 다양한 분야에서 활용될 수 있는 KNN! 실무에서 어떻게 활용할지 고민해 보는 것도 재미있겠죠? 😃