K-Nearest Neighbors (K-NN)

혜쿰·2023λ…„ 11μ›” 21일
1
post-thumbnail

🍴 κ°œλ…

πŸ₯› K-Nearest Neighbors (K-NN) μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

K-Nearest Neighbors(K-NN)은 K-μ΅œκ·Όμ ‘ 이웃 μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³ λ„ ν•œλ‹€. K-NN은 지도 ν•™μŠ΅(Supervised Learning) μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ‘œ, 데이터 κ°„ 거리λ₯Ό 기반으둜 λΆ„λ₯˜(Classification)λ‚˜ νšŒκ·€(Regression) 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•˜κ³  직관적인 λ°©λ²•μœΌλ‘œ 데이터λ₯Ό λΆ„λ₯˜ν•˜κ±°λ‚˜ μ˜ˆμΈ‘ν•˜λŠ” 데 νš¨κ³Όμ μ΄λ‹€.

πŸ₯› μž‘λ™ 원리

K-NN은 κ°„λ‹¨ν•œ 아이디어λ₯Ό 기반으둜 ν•œλ‹€.
K-μ΅œκ·Όμ ‘ 이웃 μ•Œκ³ λ¦¬μ¦˜μ΄λΌλŠ” λ‹¨μ–΄μ—μ„œ μ•Œ 수 μžˆλ“―μ΄, KNN은 μ„œλ‘œ κ°€κΉŒμ΄ μžˆλŠ” λͺ¨λ“  데이터 ν¬μΈνŠΈκ°€ λ™μΌν•œ ν΄λž˜μŠ€μ— μ†ν•œλ‹€λŠ” 원칙에 따라 μž‘λ™ν•˜λŠ” 지도 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ—¬κΈ°μ„œ κΈ°λ³Έ 가정은 μ„œλ‘œ κ°€κΉŒμ΄ μžˆλŠ” 것듀은 μ„œλ‘œ κ°™λ‹€λŠ” 것이닀.

μ£Όμš” κ°œλ…

  • 거리 μΈ‘μ • 방법: K-NN은 데이터 κ°„ 거리λ₯Ό μΈ‘μ •ν•˜μ—¬ 이웃을 μ°ΎλŠ”λ‹€. μœ ν΄λ¦¬λ””μ•ˆ 거리(Euclidean distance)κ°€ 일반적으둜 μ‚¬μš©λ˜μ§€λ§Œ, λ§¨ν•˜νƒ„ 거리(Manhattan distance)λ‚˜ 코사인 μœ μ‚¬λ„(Cosine similarity) λ“± λ‹€μ–‘ν•œ 거리 μΈ‘μ • 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

  • μ΄μ›ƒμ˜ 수(K): K-NNμ—μ„œλŠ” μƒˆλ‘œμš΄ 데이터 포인트 μ£Όλ³€μ˜ K개의 이웃을 μ„ νƒν•œλ‹€. K의 값에 따라 λͺ¨λΈμ˜ μ„±λŠ₯이 λ‹¬λΌμ§ˆ 수 있으며, μ μ ˆν•œ K 값을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

  • κ°€μ€‘μΉ˜: 이웃 데이터 포인트의 거리에 따라 κ°€μ€‘μΉ˜λ₯Ό λΆ€μ—¬ν•˜μ—¬ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. κ°€μ€‘μΉ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€κΉŒμš΄ μ΄μ›ƒμ˜ μ˜κ²¬μ— 더 큰 영ν–₯을 λ°›κ²Œ λœλ‹€.

KNN의 κ°€μž₯ μ€‘μš”ν•œ λ‹¨κ³„λŠ” Nearest Neighbors의 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 'K' 값을 μ •μ˜ν•˜λŠ” 것이닀.
μœ„ 사진과 같이 데이터셋 λ‚΄μ˜ 각각의 λ°μ΄ν„°λŠ” νŠΉμ„± κ³΅κ°„μƒμ˜ 점으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. λ§Œμ•½, K값이 3이라면 κ·Έ μ£Όλ³€μ˜ 3개의 κ°€μž₯ κ°€κΉŒμš΄ 이웃 데이터듀을 μ°Ύμ•„μ„œ λ°μ΄ν„°λ“€μ˜ λ ˆμ΄λΈ”μ„ λΆ„λ₯˜ν•˜κ±°λ‚˜ μ˜ˆμΈ‘ν•˜λŠ” 방법이닀.

πŸ₯› μž₯단점

μž₯점

  • κ°„λ‹¨ν•˜κ³  μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.
  • ν›ˆλ ¨ 과정이 μ—†μ–΄ μƒˆλ‘œμš΄ 데이터에 λŒ€ν•œ 예츑이 λΉ λ₯΄λ‹€.
  • λ‹€λͺ©μ μœΌλ‘œ μ‚¬μš©λ  수 있으며, νšŒκ·€μ™€ λΆ„λ₯˜ λͺ¨λ‘μ— 적용 κ°€λŠ₯ν•˜λ‹€.
  • 데이터에 λŒ€ν•œ 가정이 μ—†λ‹€. μΆ”κ°€ 가정을 ν•˜κ±°λ‚˜ λͺ¨λΈμ„ ꡬ좕할 ν•„μš”κ°€ μ—†λ‹€.

단점

  • λŒ€κ·œλͺ¨ 데이터셋에 λŒ€ν•΄ 계산 λΉ„μš©μ΄ 많이 λ“€ 수 μžˆλ‹€.
  • νŠΉμ„±μ΄ λ§Žκ±°λ‚˜ μŠ€μΌ€μΌμ΄ λ‹€λ₯Έ κ²½μš°μ—λŠ” μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€.

πŸ₯› 적용 λΆ„μ•Ό

  • 이미지 λΆ„λ₯˜
  • μΆ”μ²œ μ‹œμŠ€ν…œ
  • 의료 진단
  • ν…μŠ€νŠΈ λΆ„λ₯˜
  • μ‚¬μš©μž 행동 인식 (Activity Recognition)
  • 자율 μ£Όν–‰ μžλ™μ°¨
  • λ³΄μ•ˆ 및 μΉ¨μž… 탐지
  • ν™˜κ²½ λͺ¨λ‹ˆν„°λ§
  • μžμ› ν• λ‹Ή 및 예츑
  • μœ μ „μž λΆ„λ₯˜ 및 μœ μ „μ²΄ ν•™μŠ΅

K-NN은 λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ μ‚¬μš©λ˜λ©°, κ·Έ μœ μ—°μ„±κ³Ό λ‹¨μˆœν•¨μœΌλ‘œ 인해 λ§Žμ€ λ¬Έμ œμ— 적용될 수 μžˆλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ€ 특히 μž‘μ€ λ°μ΄ν„°μ…‹μ—μ„œ 효과적이며, μœ μ‚¬μ„±μ— κΈ°λ°˜ν•˜μ—¬ νŒ¨ν„΄μ„ μ°Ύκ³  λΆ„λ₯˜ν•˜λŠ” 데 강점을 보인닀.

πŸ₯© μ‹€μŠ΅

μ•„λž˜λŠ” K-NN μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ Iris 데이터셋을 λΆ„λ₯˜ν•˜κ³  μ‹œκ°ν™”ν•˜λŠ” 예제 μ½”λ“œμ΄λ‹€.이 μ½”λ“œλ₯Ό 톡해 데이터 뢄포와 K-NN의 μž‘λ™ 방식을 μ‹œκ°μ μœΌλ‘œ 확인해볼 수 μžˆλ‹€.

πŸ§‚ μ½”λ“œ 예제

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# 데이터 λ‘œλ“œ
iris = load_iris()
X = iris.data[:, :2]  # 처음 두 개의 νŠΉμ„±λ§Œ μ‚¬μš© (μ‹œκ°ν™”λ₯Ό μœ„ν•΄)
y = iris.target

# 데이터 λΆ„ν• 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# λͺ¨λΈ μ΄ˆκΈ°ν™” 및 ν•™μŠ΅
knn = KNeighborsClassifier(n_neighbors=3)  # μ΄μ›ƒμ˜ 수 Kλ₯Ό 3으둜 μ„€μ •
knn.fit(X_train, y_train)

# 예츑
y_pred = knn.predict(X_test)

# 평가
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f'정확도: {accuracy:.4f}')
print('λΆ„λ₯˜ λ³΄κ³ μ„œ:\n', report)

# μ‹œκ°ν™”λ₯Ό μœ„ν•œ κ·Έλ¦¬λ“œ 생성
h = 0.02  # λ©”μ‰¬μ˜ λ‹¨μœ„
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

# κ²°μ • 경계 μ‹œκ°ν™”
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(8, 6))
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# ν›ˆλ ¨ 데이터와 ν…ŒμŠ€νŠΈ 데이터 그리기
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_bold, edgecolor='k', s=60)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_bold, marker='x', s=80)

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = 3)")
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.show()

πŸ§‚ μ½”λ“œ 리뷰

  • Iris 데이터셋을 λ‘œλ“œν•˜κ³ , 처음 두 개의 νŠΉμ„±λ§Œμ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ€€λΉ„ν•œλ‹€. (2차원 μ‹œκ°ν™”λ₯Ό μœ„ν•΄)
  • KNeighborsClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ K-NN λΆ„λ₯˜κΈ°λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  ν•™μŠ΅μ‹œν‚¨λ‹€. μ—¬κΈ°μ„œλŠ” μ΄μ›ƒμ˜ 수 Kλ₯Ό 3으둜 μ„€μ •ν•œλ‹€.
  • predict() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ 데이터에 λŒ€ν•œ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜κ³ , accuracy_score()와 classification_report() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ˜ μ„±λŠ₯을 ν‰κ°€ν•œλ‹€.
  • matplotlib을 μ‚¬μš©ν•˜μ—¬ κ²°μ • 경계λ₯Ό μ‹œκ°ν™”ν•˜κ³ , ν›ˆλ ¨ 데이터와 ν…ŒμŠ€νŠΈ 데이터λ₯Ό ν”Œλ‘―ν•œλ‹€. 이λ₯Ό 톡해 λͺ¨λΈμ΄ μ–΄λ–»κ²Œ λΆ„λ₯˜ν•˜λŠ”지 μ‹œκ°μ μœΌλ‘œ 확인할 수 μžˆλ‹€.

κ²°μ • 경계λ₯Ό 톡해 각 클래슀의 뢄포와 K-NN μ•Œκ³ λ¦¬μ¦˜μ΄ μ–΄λ–»κ²Œ 데이터λ₯Ό λΆ„λ₯˜ν•˜λŠ”지 μ‹œκ°μ μœΌλ‘œ 확인할 수 μžˆλ‹€. 이λ₯Ό 톡해 K-NN의 μž‘λ™ 방식을 더 잘 이해할 수 μžˆλ‹€.




K-NN μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•˜λ©΄μ„œλ„ μœ μš©ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄μ§€λ§Œ, λ°μ΄ν„°μ˜ νŠΉμ„±κ³Ό λ¬Έμ œμ— 따라 μ„±λŠ₯이 λ‹¬λΌμ§ˆ 수 μžˆλ‹€. μ μ ˆν•œ K 값을 μ„ νƒν•˜κ³  데이터λ₯Ό 잘 μ΄ν•΄ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.









knn μ°Έκ³  및 이미지 좜처

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보