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! 실무에서 어떻게 활용할지 고민해 보는 것도 재미있겠죠? 😃