๐Ÿฆญ AI&Big Data/ML

K ์ตœ๊ทผ์ ‘ ์ด์›ƒ

๊ณ„๋ž€์†Œ๋…„ 2025. 2. 27. 15:23

๋จธ์‹ ๋Ÿฌ๋‹

  • ํŠน์„ฑ(Feature): ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์š”์†Œ๋“ค์„ ํŠน์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง‘ ๊ฐ€๊ฒฉ ์˜ˆ์ธก์—์„œ๋Š” ๋ฉด์ , ๋ฐฉ ๊ฐœ์ˆ˜, ์œ„์น˜ ๋“ฑ์ด ํŠน์„ฑ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋ถ„๋ฅ˜ ๋ฌธ์ œ์™€ ์ด์ง„ ๋ถ„๋ฅ˜

๋จธ์‹ ๋Ÿฌ๋‹ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ๋ถ„๋ฅ˜(Classification) ๋ฌธ์ œ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค ์ค‘์—์„œ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฉ”์ผ์ด ์ŠคํŒธ์ธ์ง€ ์ŠคํŒธ ์•„๋‹˜์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ด์ง„ ๋ถ„๋ฅ˜(Binary Classification)์— ํ•ด๋‹น

  • ์ด์ง„ ๋ถ„๋ฅ˜: ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ (์˜ˆ: ์ด๋ฉ”์ผ์ด ์ŠคํŒธ์ธ์ง€ ์•„๋‹Œ์ง€)
  • ๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ (์˜ˆ: ๋™๋ฌผ ์ข…๋ฅ˜๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ)

 

ํ›ˆ๋ จ(Training)๊ณผ ์˜ˆ์ธก(Prediction)

  • ํ›ˆ๋ จ(Training): ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•˜๊ณ , ๊ทœ์น™์„ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •
  • ์˜ˆ์ธก(Prediction): ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๊ณผ์ •

 

K-์ตœ๊ทผ์ ‘ ์ด์›ƒ(K-Nearest Neighbors, KNN)

K-์ตœ๊ทผ์ ‘ ์ด์›ƒ(KNN) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ๋ณ€ ๋ฐ์ดํ„ฐ์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜์—ฌ ์˜ˆ์ธก์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ›ˆ๋ จ ๊ณผ์ •์„ ๋”ฐ๋กœ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๋’ค, ์˜ˆ์ธก ์‹œ ์ฃผ๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • ํ›ˆ๋ จ: ์‹ค์ œ๋กœ ๊ทœ์น™์„ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์€ ์—†์œผ๋ฉฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
  • ์˜ˆ์ธก: ์˜ˆ์ธกํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด K๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„, ์ด๋“ค์˜ ๋‹ค์ˆ˜๊ฒฐ๋กœ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ •
  • ํŠน์ง•
    • ์ง์„  ๊ฑฐ๋ฆฌ(Euclidean distance) ๋˜๋Š” ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ(Manhattan distance)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ A์˜ K๊ฐœ์˜ ์ตœ๊ทผ์ ‘ ์ด์›ƒ์„ ์‚ดํŽด๋ณด๊ณ , ๊ทธ๋“ค์˜ ๋ถ„๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋‹ค์ˆ˜๊ฒฐ๋กœ ์˜ˆ์ธกํ•œ๋‹ค.
    • K๊ฐ’์„ ์ž์œ ๋กญ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ํ™€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ˆ˜๊ฒฐ์ด ์œ ํšจํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์žฅ์ 
    • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž„
    • ํ›ˆ๋ จ ๊ณผ์ •์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ํ•™์Šต ์‹œ๊ฐ„์ด ์งง๋‹ค.
  • ๋‹จ์ 
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ , ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์ด ์†Œ๋ชจ๋จ
    • ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์˜ˆ์ธกํ•  ๋•Œ ์ „์ฒด ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ KNN ์‚ฌ์šฉํ•˜๊ธฐ

 

์‚ฌ์ดํ‚ท๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ KNN์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

KNeighborsClassifier() ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ KNN ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ํ›ˆ๋ จ์‹œํ‚จ๋‹ค.

์ฃผ์š” ๋ฉ”์„œ๋“œ

  1. fit(): ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จ
  2. model.fit(X_train, y_train)
  3. predict(): ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก
  4. predictions = model.predict(X_test)
  5. score(): ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •
  6. accuracy = model.score(X_test, y_test)
from sklearn.neighbors import KNeighborsClassifier

# KNN ๋ชจ๋ธ ์ƒ์„ฑ (์ด์›ƒ์˜ ์ˆ˜๋Š” 3์œผ๋กœ ์„ค์ •)
model = KNeighborsClassifier(n_neighbors=3)

# ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ ํ•™์Šต
model.fit(X_train, y_train)

# ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์˜ˆ์ธก
predictions = model.predict(X_test)

# ๋ชจ๋ธ ์„ฑ๋Šฅ ํ‰๊ฐ€
accuracy = model.score(X_test, y_test)
print(f"Accuracy: {accuracy * 100:.2f}%")

KNN ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜

  • n_neighbors: ์‚ฌ์šฉํ•  ์ด์›ƒ์˜ ์ˆ˜(K ๊ฐ’)
  • metric: ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ• (1: ๋งจํ—ˆํŠผ๊ฑฐ๋ฆฌ, 2: ์œ ํด๋ฆฌ๋””์•ˆ ๊ฑฐ๋ฆฌ)
  • weights: ์ด์›ƒ์˜ ์ค‘์š”๋„๋ฅผ ์„ค์ • (์˜ˆ: uniform: ๋ชจ๋“  ์ด์›ƒ ๋™์ผ ๊ฐ€์ค‘์น˜, distance: ๊ฐ€๊นŒ์šด ์ด์›ƒ์— ๋” ๋งŽ์€ ๊ฐ€์ค‘์น˜)