A A
[ML] K-Nearest Neighbors, K-NN (K-μ΅œκ·Όμ ‘ 이웃)
μ΄λ²ˆμ—”λŠ” K-NN에 λ°ν•˜μ—¬ ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

K-NN μ΄λž€?

K-NN(μ΅œκ·Όμ ‘ 이웃 μ•Œκ³ λ¦¬μ¦˜)은 데이터 λΆ„λ₯˜ 및 νšŒκ·€ λ¬Έμ œμ—μ„œ 널리 μ‚¬μš©λ˜λŠ” λΉ„λͺ¨μˆ˜μ  기계 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

μž…λ ₯ 데이터 포인트의 클래슀λ₯Ό μ˜ˆμΈ‘ν•˜κΈ° μœ„ν•΄ κ·Έ 데이터 ν¬μΈνŠΈμ™€ κ°€μž₯ κ°€κΉŒμš΄ K개의 이웃을 기반으둜 결정을 λ‚΄λ¦¬λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

K-NN은 λΆ„λ₯˜(Classification)와 νšŒκ·€(Regression) 문제 λͺ¨λ‘μ— μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.


K-NN의 μ£Όμš” νŠΉμ§•

1. λΉ„λͺ¨μˆ˜μ  방법

  • K-NN은 데이터 뢄포에 λŒ€ν•΄ νŠΉμ •ν•œ 가정을 ν•˜μ§€ μ•ŠλŠ” λΉ„λͺ¨μˆ˜μ (non-parametric) λ°©λ²•μž…λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°μ˜ ν˜•νƒœλ‚˜ 뢄포에 λŒ€ν•΄ 사전 지식이 없어도 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

2. λ©”λͺ¨λ¦¬ 기반

  • λͺ¨λΈμ„ ν•™μŠ΅ν•˜λŠ” 과정이 μ—†κ³ , 예츑 μ‹œμ— λͺ¨λ“  ν•™μŠ΅ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λΈμ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ ν½λ‹ˆλ‹€.

3. λ‹¨μˆœμ„±

  • K-NN의 κ΅¬ν˜„μ€ 맀우 κ°„λ‹¨ν•˜μ§€λ§Œ, κ°•λ ₯ν•œ μ„±λŠ₯을 λ°œνœ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 λ°μ΄ν„°μ˜ ꡬ쑰가 λͺ…ν™•ν•˜μ§€ μ•Šμ„ λ•Œ μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

K-NN의 κΈ°λ³Έ 원리

K-NN의 κΈ°λ³Έ μ›λ¦¬λŠ” μ–΄λ– ν•œ 점듀이 μžˆμ„κΉŒμš”? ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

거리 μΈ‘μ •

  • μƒˆλ‘œμš΄ 데이터 ν¬μΈνŠΈμ™€ κΈ°μ‘΄ 데이터 ν¬μΈνŠΈλ“€ μ‚¬μ΄μ˜ 거리λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€. 일반적으둜 μœ ν΄λ¦¬λ“œ 거리가 μ‚¬μš©λ˜μ§€λ§Œ, λ§¨ν•΄νŠΌ 거리, 코사인 μœ μ‚¬λ„ λ“± λ‹€λ₯Έ 거리 척도도 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μœ ν΄λ¦¬λ“œ 거리 μˆ˜μ‹: 두 점 (x1,y1)와 (x2,y2) μ‚¬μ΄μ˜ κ±°λ¦¬λŠ” μ•„λž˜μ˜ μˆ˜μ‹μœΌλ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

이웃 선택

  • κ³„μ‚°λœ 거리 값을 κΈ°μ€€μœΌλ‘œ κ°€μž₯ κ°€κΉŒμš΄ K개의 이웃을 μ„ νƒν•©λ‹ˆλ‹€.

κ²°μ •

  • λΆ„λ₯˜(Classification): K개의 이웃 쀑 κ°€μž₯ 많이 λ“±μž₯ν•œ 클래슀λ₯Ό μƒˆλ‘œμš΄ 데이터 포인트의 클래슀둜 μ˜ˆμΈ‘ν•©λ‹ˆλ‹€.
  • νšŒκ·€(Regression): K개의 μ΄μ›ƒμ˜ 평균 값을 μƒˆλ‘œμš΄ 데이터 포인트의 예츑 κ°’μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

Kκ°’μ˜ 선택

그러면 K값은 μ–΄λ–»κ²Œ μ„ νƒν•˜λŠ” κ±ΈκΉŒμš”? ꡐ차검증 (Cross-Validation)을 μ‚¬μš©ν•˜μ—¬ μ„ νƒν•©λ‹ˆλ‹€.

 

ꡐ차 검증 (Cross-Validation):

  • λ‹€μ–‘ν•œ K 값을 μ‹œλ„ν•˜μ—¬ 졜적의 Kλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. ꡐ차 검증을 톡해 λ°μ΄ν„°μ˜ 일뢀뢄을 ν›ˆλ ¨ λ°μ΄ν„°λ‘œ, λ‚˜λ¨Έμ§€ 뢀뢄을 검증 λ°μ΄ν„°λ‘œ μ‚¬μš©ν•΄ λͺ¨λΈμ˜ μ„±λŠ₯을 ν‰κ°€ν•©λ‹ˆλ‹€.

K 값이 λͺ¨λΈμ— λΌμΉ˜λŠ” 영ν–₯?

  • μž‘μ€ K κ°’: λͺ¨λΈμ΄ λ³΅μž‘ν•΄μ Έ κ³ΌλŒ€μ ν•©(overfitting)이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 큰 K κ°’: λͺ¨λΈμ΄ λ‹¨μˆœν•΄μ Έ κ³Όμ†Œμ ν•©(underfitting)이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

K-NN κ°œμ„  방법

먄약, K-NN을 μ‚¬μš©ν•˜λŠ”λ° 결과값이 μ‚¬μš©μžκ°€ μ›ν•˜μ§€ μ•ŠλŠ” κ²°κ³Όκ°€ λ‚˜μ™”μ„λ• μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒμš”?
κ°œμ„  방법듀에 λ°ν•˜μ—¬ μ„€λͺ…을 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

κ°€μ€‘μΉ˜ λΆ€μ—¬

  • κ°€κΉŒμš΄ μ΄μ›ƒμ—κ²Œ 더 큰 κ°€μ€‘μΉ˜λ₯Ό λΆ€μ—¬ν•˜μ—¬ 예츑의 정확성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

차원 μΆ•μ†Œ

  • 고차원 데이터λ₯Ό μ €μ°¨μ›μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ 계산 λ³΅μž‘λ„λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ„±λΆ„ 뢄석(PCA)κ³Ό 같은 방법이 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

효율적인 거리 계산

  • KD 트리 λ˜λŠ” λ³Ό νŠΈλ¦¬μ™€ 같은 자료 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ 거리 계산을 효율적으둜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

K-NN의 μž₯, 단점

K-NN의 μž₯점과 단점은 μ–΄λ– ν•œ 점듀이 μžˆμ„κΉŒμš”?

K-NN의 μž₯점

  1. λ‹¨μˆœν•˜κ³  μ΄ν•΄ν•˜κΈ° 쉬움:
    • κ΅¬ν˜„κ³Ό 이해가 맀우 κ°„λ‹¨ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ ν•™μŠ΅ 과정이 μ—†μŒ:
    • 데이터가 좔가될 λ•Œλ§ˆλ‹€ λͺ¨λΈμ„ μž¬ν•™μŠ΅ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • μƒˆλ‘œμš΄ 데이터가 μΆ”κ°€λ˜λ©΄ κ·Έ 데이터도 ν¬ν•¨ν•˜μ—¬ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λ‹€μ–‘ν•œ λ¬Έμ œμ— 적용 κ°€λŠ₯:
    • λΆ„λ₯˜μ™€ νšŒκ·€ 문제 λͺ¨λ‘μ— μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

K-NN의 단점

  1. 계산 λΉ„μš©μ΄ λ†’μŒ:
    • 예츑 μ‹œμ— λͺ¨λ“  데이터λ₯Ό 비ꡐ해야 ν•˜λ―€λ‘œ, 데이터가 λ§Žμ„ 경우 계산 λΉ„μš©μ΄ λ†’μŠ΅λ‹ˆλ‹€.
  2. 곡간 λ³΅μž‘λ„:
    • λͺ¨λ“  ν•™μŠ΅ 데이터λ₯Ό μ €μž₯ν•΄μ•Ό ν•˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ ν½λ‹ˆλ‹€.
  3. K κ°’ μ„ νƒμ˜ 어렀움:
    • μ μ ˆν•œ K 값을 μ„ νƒν•΄μ•Όλ§Œ 쒋은 μ„±λŠ₯을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. ν¬μ†Œν•œ λ°μ΄ν„°μ—μ„œ μ„±λŠ₯ μ €ν•˜:
    • 데이터가 ν¬μ†Œν•œ 경우 μ„±λŠ₯이 μ €ν•˜λ  κ°€λŠ₯성이 ν½λ‹ˆλ‹€. 데이터가 μΆ©λΆ„νžˆ λ§Žμ•„μ•Ό 효과적으둜 μž‘λ™ν•©λ‹ˆλ‹€.

K-NN Example Code

K-NN 예제 μ½”λ“œλ₯Ό ν•œλ²ˆ λ³΄κ² μŠ΅λ‹ˆλ‹€.
!kaggle datasets download -d mlg-ulb/creditcardfraud
!unzip creditcardfraud.zip
# K-평균 ν΄λŸ¬μŠ€ν„°λ§ 예제

# ν•„μš”ν•œ 라이브러리 μž„ν¬νŠΈ
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 데이터셋 λ‘œλ“œ
data = pd.read_csv('/content/creditcard.csv')
data.head()

# ν•„μš”ν•œ νŠΉμ„± 선택
X = data.drop(['Time', 'Class'], axis=1)

# 데이터 ν‘œμ€€ν™”
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# K-평균 ν΄λŸ¬μŠ€ν„°λ§ λͺ¨λΈ 생성 및 ν•™μŠ΅
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans.fit(X_scaled)

# ν΄λŸ¬μŠ€ν„°λ§ κ²°κ³Ό μ‹œκ°ν™” (PCAλ₯Ό μ‚¬μš©ν•˜μ—¬ 2μ°¨μ›μœΌλ‘œ μΆ•μ†Œ)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

plt.figure(figsize=(10, 7))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='X')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.title('K-Means Clustering of Credit Card Fraud Dataset')
plt.show()