IT ์•Œ์•„๊ฐ€๊ธฐ

[์ธ๊ณต์ง€๋Šฅ ์•Œ์•„๊ฐ€๊ธฐ] ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ KNN (K-์ตœ๊ทผ์ ‘ ์ด์›ƒ, K-Nearest Neighbors) (1) KNN ๋ถ„๋ฅ˜ ๋ชจ๋ธ

์žก์‹๋ƒฅ์ด 2025. 2. 17. 11:34

์ด๋ฒˆ์—๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์ถ• ๊ทธ๋ฆฌ๊ณ  ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ดˆ์ ์ธ ํ๋ฆ„์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด์•˜๋‹ค! ํŠนํžˆ ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฌ์šด KNN ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋ธ ๊ตฌํ˜„ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. 


ํ™˜๊ฒฝ

์šฐ์„  KNN์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ค์ •์ด๋‹ค! ๋ณ„๊ฑฐ ์—†๋‹ค!!

  • ํŒŒ์ด์ฌ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ : CoLab, Jupyter Lab ๋“ฑ๋“ฑ
  • ํŒจํ‚ค์ง€: ScikitLearn, Numpy, Matplotlib  => ์ฝ”๋žฉ์— ์ด๋ฏธ ์žˆ์Œ

๋จธ์‹ ๋Ÿฌ๋‹์˜ ์ฃผ์š” ํ‚ค์›Œ๋“œ ์ •๋ฆฌ

  • ํŠน์„ฑ (Feature): ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ•˜๋‚˜์˜ ์„ฑ์งˆ. ex) ์ƒ์„ ์˜ ๊ธธ์ด / ๋ฌด๊ฒŒ 
  • ํ›ˆ๋ จ (Training): ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ์ดํ„ฐ์—์„œ ๊ทœ์น™์„ ์ฐพ๋Š” ๊ณผ์ • ex) fit() ๋ฉ”์„œ๋“œ of scikitlearn ํŒจํ‚ค์ง€
  • ์ •ํ™•๋„ (Accuracy):  ์ •ํ™•ํ•œ ๋‹ต์„ ์–ผ๋งˆ๋‚˜ ๋งž์ท„๋Š”์ง€๋ฅผ ๋ฐฑ๋ถ„๋ฅ ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฐ’์œผ๋กœ, ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ๋Š” 0-1 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋จ.  => ์ •ํ™•๋„ = (์ •ํ™•ํžˆ ๋งžํžŒ ๊ฐœ์ˆ˜) / (์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜). ์•„๋ฌด๋ž˜๋„ ์ •๋‹ต์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "์ง€๋„ํ•™์Šต"์—์„œ ํ‰๊ฐ€ํ•˜๋Š” ๊ธฐ์ค€์ด ๋œ๋‹ค. 
  • ์ž…๋ ฅ (Input) : ํŠน์„ฑ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋“ค์ด๋‹ค. 
  • ํƒ€๊นƒ (Target) : ์ •๋‹ต์ง€ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ex) ๊ฐ•์•„์ง€ / ๊ณ ์–‘์ด 
  • ํ›ˆ๋ จ๋ฐ์ดํ„ฐ (Training Data): ํ›ˆ๋ จํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ์ง€๋„ํ•™์Šต์€ Input, Target ๋ชจ๋‘ ํ•„์š”ํ•˜๋‚˜ ๋น„์ง€๋„ํ•™์Šต์€ Input๋งŒ ์‚ฌ์šฉํ•จ. 
  • ํ…Œ์ŠคํŠธ ์„ธํŠธ(Test set): ํ‰๊ฐ€์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ, ๋ณดํ†ต์€ ์ค€๋น„๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์ผ๋ถ€ 20-30%๋ฅผ ๋–ผ์–ด๋‚ด์–ด ์‚ฌ์šฉํ•จ. ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€๊ทœ๋ชจ์ธ ๊ฒฝ์šฐ๋Š” 1%๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•จ.  
  • ํ›ˆ๋ จ์„ธํŠธ(Train set): ํ›ˆ๋ จ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ. ํ…Œ์ŠคํŠธ์„ธํŠธ์™€ ๋ณ„๋„๋กœ ์ค€๋น„๋˜์–ด์•ผํ•œ๋‹ค. 
  • ์ƒ˜ํ”Œ(Sample) : ํŠน์„ฑ๋“ค์ด ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ์ธ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ˜ํ”Œ์ด๋ผ๊ณ  ๋ถ€๋ฆ„.
  • ๋ชจ๋ธ(Model) : ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜, ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋”๋ผ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ˆ˜์‹...)์„ ๊ตฌ์ฒดํ™”ํ•œ ๊ฒƒ์„ ๋ชจ๋ธ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

๋จธ์‹ ๋Ÿฌ๋‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ง€๋„ํ•™์Šต๊ณผ ๋น„์ง€๋„ํ•™์Šต, ๊ทธ๋ฆฌ๊ณ  ๊ฐ•ํ™”ํ•™์Šต

  • ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜: ์ง€๋„ํ•™์Šต(Supervised Learning), ๋น„์ง€๋„ํ•™์Šต(Unsupervised Learning), ๊ฐ•ํ™”ํ•™์Šต(Reinforcement Learning) 
  • ์ง€๋„ํ•™์Šต์€ ์ •๋‹ต์ธ Target์ด ์žˆ์œผ๋ฏ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •๋‹ต์„ ๋งžํžˆ๋Š” ๊ฒƒ์„ ํ•™์Šตํ•จ. 
  • ๋น„์ง€๋„ํ•™์Šต์€ ์ •๋‹ต์ด ์—†์–ด์„œ ๋งžํžˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ˜•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•จ. Input๋งŒ ์žˆ์œผ๋ฉด ๋จ. 
  • ๊ฐ•ํ™”ํ•™์Šต : ํƒ€๊นƒ์ด ์•„๋‹ˆ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ–‰๋™ํ•œ ๊ฒฐ๊ณผ๋กœ ์–ป์€ ๋ณด์ƒ์„ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šตํ•จ.

๋จธ์‹ ๋Ÿฌ๋‹์˜ ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๋ชจ๋ธ)์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด์„œ ๋” ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

 

[์ธ๊ณต์ง€๋Šฅ ์•Œ์•„๊ฐ€๊ธฐ] ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜

๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ ์ •๋ฆฌ ๐Ÿ“š๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ฒŒ ์ง€๋„ํ•™์Šต(Supervised Learning), ๋น„์ง€๋„ํ•™์Šต(Unsupervised Learning), ๊ฐ•ํ™”ํ•™์Šต(Reinforcement Learning), ๋”ฅ๋Ÿฌ๋‹(Deep Learning)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ

nyangwisdom.tistory.com

 

์˜ค๋Š˜ ๊ณต๋ถ€ํ•ด๋ณผ KNN์€ ์ง€๋„ํ•™์Šต์˜ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค! 


KNN, K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์ด๋ž€? 

KNN์€ ๊ธฐ๋ณธ์ ์œผ๋กœ '๋‹ค์ˆ˜๊ฒฐ์˜ ์›์น™'์— ๊ธฐ๋ฐ˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ฑ์žฅํ–ˆ์„ ๋•Œ, ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์˜ "๊ฐ€์žฅ ๊ฐ€๊นŒ์šด" ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋“ค์„ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•˜๋Š” ํด๋ž˜์Šค(๋ฒ”์ฃผ)๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฉ”์ผ์ด ์ŠคํŒธ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๋ถ„๋ฅ˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ์ด๋ฉ”์ผ์ด ๊ธฐ์กด์˜ ์ŠคํŒธ ๋ฉ”์ผ๊ณผ ์–ผ๋งˆ๋‚˜ ๊ฐ€๊นŒ์šด์ง€ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€๊นŒ์šด ๊ฒƒ ์ค‘ ์ŠคํŒธ์ด ๋” ๋งŽ์œผ๋ฉด ์ŠคํŒธ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. 

 

KNN์˜ ๊ธฐ๋ณธ์ ์ธ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜์ž๋ฉด, 

  1. ๋ฐ์ดํ„ฐ ์ค€๋น„: KNN์€ ํŠน๋ณ„ํ•œ ํ›ˆ๋ จ ๊ณผ์ •์ด ์—†๊ณ , ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ „๋ถ€์ด๋‹ค. ํŠน์„ฑ๊ฐ’์ด ์ €์žฅ๋œ ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์™€ ํƒ€๊นƒ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํƒ€๊นƒ์„ ๋‘๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒฝ์šฐ(Binary), 0, 1๋กœ ํƒ€๊นƒ์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
  2. ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์™€์˜ ์ง์„  ๊ฑฐ๋ฆฌ(์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ)๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด ์™ธ์—๋„ ๊ฒฉ์ž ๊ธฐ๋ฐ˜ ๊ฑฐ๋ฆฌ์ธ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋กœ๋„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. 
  3. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ ์„ ํƒ: ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ํ›„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด K๊ฐœ์˜ ์ด์›ƒ์„ ์ฐพ์œผ๋ฉฐ, ์ด๋•Œ์˜ 'K'๋Š” ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, n_neighbors ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 5๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค.
  4. ๋‹ค์ˆ˜๊ฒฐ ํˆฌํ‘œ: ์„ ํƒ๋œ ์ด์›ƒ๋“ค ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•˜๋Š” ํด๋ž˜์Šค๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

KNN์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜์ž๋ฉด, 

(+) ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ด๋ก  : ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์–ด๋–ค ๊ฐ’์ด ์žˆ๋Š”์ง€๋งŒ ์•Œ๋ฉด ๋œ๋‹ค. 

(+) ๋น„๋ชจ์ˆ˜ ๋ชจ๋ธ : ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๊ฐ€ "์ •๊ทœ๋ถ„ํฌ"๋‹ค ์•„๋‹ˆ๋‹ค ๋“ฑ ๋ถ„ํฌ์— ๋Œ€ํ•œ ๊ฐ€์ • ์—†์ด ์ง์ ‘ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•ด์„œ ์œ ์—ฐํ•˜๋‹ค. 

 

(-) ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์— ์†๋„๊ฐ€ ๋А๋ฆผ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ๊ณ , ์—ฐ์‚ฐ๋Ÿ‰๋„ ๋งŽ๋‹ค. 

(-) K๊ฐ’์— ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ ํŽธ์ฐจ๊ฐ€ ํผ : K๊ฐ€ ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ์ž‘์€ ๋…ธ์ด์ฆˆ์— ๋ฏผ๊ฐํ•˜๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด ๋ถ„๋ฅ˜ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค. 

 

K๊ฐ’์— ๋”ฐ๋ผ์„œ ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ์–ด๋–ค K๊ฐ’์ด ์ ๋‹นํ•œ์ง€ ์ •๋ฆฌํ•˜์ž๋ฉด

K๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด  (K=1, 2) : ๋ฐ์ดํ„ฐ์…‹ ๋‚ด ์ด์ƒ์น˜(Outlier)๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•œ ๋‘๊ฐœ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์— ์˜ํ–ฅ์„ ํฌ๊ฒŒ ๋ฐ›๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜์— ๋„ˆ๋ฌด ์˜์กดํ•˜๊ฒŒ ๋˜์–ด ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ๊ณผ์ ํ•ฉ(Overfitting)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์—๋งŒ ์ตœ์ ํ™”๋˜์–ด์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ๊ฐ•๋ฐ•์ ์ด๊ณ  ๊ณผํ•˜๋‹ค!

 

๋ฐ˜๋Œ€๋กœ, K๊ฐ’์ด  ๋„ˆ๋ฌด ํฌ๋ฉด (K=20, 50) : ๋ฐ์ดํ„ฐ๊ฐ€ ํ‰๊ท ํ™”(Averaging)๋˜์–ด์„œ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•์ด ํฌ์„๋  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋ธ์ด ๋„ˆ๋ฌด ๋‹จ์ˆœํ•ด์ ธ์„œ (Underfitting) ์—ญ์‹œ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์‹œ๋งํ•ด ๋„ˆ๋ฌด ๋‘ฅ๊ธ€๊ณ  ๋ญ‰๋šฑ๊ทธ๋ ค์ ธ์„œ ๊ธฐ๋Šฅ์„ ์žƒ๋Š”๋‹ค! 

 

K๊ฐ’์ด ์ง์ˆ˜์ธ ๊ฒฝ์šฐ : ๋งŒ์•ฝ k=2์—ฌ์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด 2๊ฐœ์˜ ๊ฐ’๋งŒ ์ฐธ๊ณ ํ•˜๋Š”๋ฐ, ๊ฒฐ๊ณผ๊ฐ’์ด 1๋Œ€ 1๋กœ ๋™๋ฅ (Tie)์ด ๋‚˜์˜ค๋ฉด ๊ฒฐ์ •์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ K๊ฐ’์€ ํ™€์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ ์ ˆํ•œ K๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”๊ฐ€? 

(1) ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜(N)์˜ ์ œ๊ณฑ๊ทผ( √N)์„ ์ฐธ๊ณ ํ•œ๋‹ค. (ex. N=1000, K=30~40)

(2) ๊ต์ฐจ ๊ฒ€์ฆ(Cross Validation)์„ ํ†ตํ•ด ์ตœ์ ์˜ K๊ฐ’์„ ์ฐพ๊ธฐ๋„ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ K๊ฐ’์„ ์‹œ๋„ํ•˜๋ฉฐ ๋ชจ๋ธ ์„ฑ๋Šฅ(์ •ํ™•๋„ ๋“ฑ)์„ ํ‰๊ฐ€ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์…‹์— ๋”ฐ๋ผ์„œ ์ตœ์ ์˜ K๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ—˜์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

KNN์˜ ํ™œ์šฉ ๋ถ„์•ผ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜์ž๋ฉด, 

์ŠคํŽจ๋ฉ”์ผ ๋ถ„๋ฅ˜, ์‚ฌ์šฉ์ž ์œ ์‚ฌ๋„๋ฅผ ๋ณด๊ณ  ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœํ•˜๋Š” ์‹œ์Šคํ…œ, ์˜๋ฃŒ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ์—์„œ ์ž์ฃผ ํ™œ์šฉ๋œ๋‹ค. 

 


SciKit Learn

๋Œ€ํ‘œ์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ, ์‚ฌ์ดํ‚ท๋Ÿฐ!

 

์‚ฌ์ดํ‚ท๋Ÿฐ์€ ํŒŒ์ด์ฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ํŒจํ‚ค์ง€๋กœ, ์ „ํ†ต์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ œ๊ณต๋˜์–ด ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด์„œ ๋” ๊ถ๊ธˆํ•˜๋ฉด ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

 

[์ธ๊ณต์ง€๋Šฅ ์•Œ์•„๊ฐ€๊ธฐ] ๋จธ์‹ ๋Ÿฌ๋‹๊ณผ ๋”ฅ๋Ÿฌ๋‹์˜ ์ข…๋ฅ˜์™€ ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ

INTRO. ์ธ๊ณต์ง€๋Šฅ ๋ถ์ด ์˜ค๋‹ค.์ตœ๊ทผ ๋ถ€์ƒํ•œ ์ค„ ์•Œ์•˜๋˜ ์ธ๊ณต์ง€๋Šฅ์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ธด 80๋…„ ์ •๋„์˜ ์—ญ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฃผ์‹ ๋งˆ๋ƒฅ ๋ถ์ด ์™”๋‹ค๊ฐ€ ํญ๋ฝํ•˜๊ณ  ๋‹ค์‹œ ๋ถ์ด ์™”๋‹ค๊ฐ€ ํญ๋ฝํ•˜๋Š” ํ˜„์ƒ์„ ๋ฐ˜๋ณตํ•˜๋‹ค ์ง€๊ธˆ ๋“œ

nyangwisdom.tistory.com

 


SciKitLearn์˜ KNN Classifier ๊ด€๋ จ ์ฃผ์š” ์ฝ”๋“œ๋“ค์„ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค! 

 

KNeighborsClassifier ํด๋ž˜์Šค

  • ์—ญํ• : k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„
  • ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ:
    • p: ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐฉ์‹
      • p=1 → ๋งจํ•ดํŠผ(Manhattan) ๊ฑฐ๋ฆฌ
      • p=2 → ์œ ํด๋ฆฌ๋””์•ˆ(Euclidean) ๊ฑฐ๋ฆฌ (๊ธฐ๋ณธ๊ฐ’)
    • n_jobs: ์‚ฌ์šฉํ•  CPU ์ฝ”์–ด ์ˆ˜ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’์€ 1)
      • n_jobs=-1 → ๋ชจ๋“  ์ฝ”์–ด ์‚ฌ์šฉํ•ด ์—ฐ์‚ฐ ์†๋„ ํ–ฅ์ƒ
    • n_neighbors: ์ฐธ์กฐํ•  ์ด์›ƒ์˜ ๊ฐœ์ˆ˜ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’์€ 5)
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=3, p=2, n_jobs=1)

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

  • fit(X, y) : ์ฃผ์–ด์ง„ ํ•™์Šต ๋ฐ์ดํ„ฐ(X: 2์ฐจ์› ํŠน์„ฑ ๋ฆฌ์ŠคํŠธ, y: ์ •๋‹ต ๋ฆฌ์ŠคํŠธ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ํ›ˆ๋ จ
  • predict() : ํ•™์Šต๋œ ๋ชจ๋ธ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์˜ ์˜ˆ์ธก๊ฐ’ ๋ฐ˜ํ™˜
  • score() : ์˜ˆ์ธก ๊ฒฐ๊ณผ์™€ ์‹ค์ œ ์ •๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ๋ชจ๋ธ์˜ ์ •ํ™•๋„(์„ฑ๋Šฅ)๋ฅผ ํ‰๊ฐ€. ๋‚ด๋ถ€์ ์œผ๋กœ predict()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ ํ›„, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ˆ์ธก๋œ ์ƒ˜ํ”Œ์˜ ๋น„์œจ์„ ๋ฐ˜ํ™˜. Accuracy๋ฅผ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ method์ธ๋ฐ, ์ด์™ธ์—๋„ KNN ๋ชจ๋ธ ํ‰๊ฐ€ ๋ฐฉ์‹์—๋Š” F1 score ๋ฐฉ์‹๋„ ์žˆ๋‹ค๊ณ ๋Š” ํ•˜๋‹ˆ ๋‚˜์ค‘์— ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 
  • kneighbors(): ์ฃผ์–ด์ง„ ์ƒ˜ํ”Œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ๋“ค์„ ์ฐพ์Œ
    • distances: ๊ฐ ์ด์›ƒ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
    • indexes: ํ•ด๋‹น ์ด์›ƒ์˜ ์ธ๋ฑ์Šค
distances, indexes = kn.kneighbors([[25,150]])
print(train_target[indexes])
print(distances)

 


๊ฒฐ๋ก ์ ์œผ๋กœ KNN ๋ถ„๋ฅ˜ ๋ชจ๋ธ์€ KNeighborsclassifier๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, fit()์œผ๋กœ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ณ , predict()๋กœ ์–˜์ธกํ•˜๋ฉฐ, score()๋กœ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 


๋ฐ์ดํ„ฐ์…‹ ๋งŒ๋“œ๋Š” ๋ฒ• 

ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ์…‹๊ณผ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ์…‹์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ฆฌ์ด๋‹ค! 

 

1. ํŠน์„ฑ(Feature) ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ : ํŠน์„ฑ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋Š˜์–ด๋œจ๋ฆฐ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ (= ๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ)๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•จ.

2. ํ•™์Šต์šฉ๊ณผ ํ…Œ์ŠคํŠธ์šฉ ์„ธํŠธ๋ฅผ ๋”ฐ๋กœ ๊ตฌ์„ฑ: Train set, Test set์„ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ 

3. ์ƒ˜ํ”Œ๋ง ํŽธํ–ฅ (Sampling Bias) ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Stratify ๋งค๊ฐœ๋ณ€์ˆ˜ ํ™œ์šฉ : Train set์—๋Š” ์ƒ˜ํ”Œ์ด ๊ณ ๋ฅด๊ฒŒ ๋“ค์–ด๊ฐ€๋„๋ก ๋„ฃ์–ด์•ผํ•˜๋ฉฐ, ํŠน์ • ์ข…๋ฅ˜์˜ ์ƒ˜ํ”Œ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๋งŽ์€ ํŽธํ–ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด score๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ๋‚˜์˜จ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฌด์ž‘์œ„๋กœ ์„ž๋Š”๋‹ค๊ณ  ์ƒ˜ํ”Œ์ด ๊ณจ๊ณ ๋ฃจ ์„ž์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, stratify ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ํด๋ž˜์Šค ๋น„์œจ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„์–ด์•ผํ•จ. 

from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(X, y, stratify=y, random_state=28)

 

์‚ฌ์ดํ‚ท๋Ÿฐ์˜ model_selection ๋ชจ๋“ˆ ์•„๋ž˜์— ์žˆ๋Š” train_test_split() ๋ฉ”์„œ๋“œ๋ฅผ import ํ•˜๊ณ  stratify๋กœ test ์„ธํŠธ์™€ train ์„ธํŠธ์˜ ํด๋ž˜์Šค๊ฐ„ ๋น„์œจ ๋งž์ถค. random state๋Š” ๋žœ๋ค์‹œ๋“œ๋กœ ๊ฒฐ๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์›ํ•˜๋ฉด ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๊ณ„์† ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๋‹จ์ˆœํžˆ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋งŒ ํ•ด๋„ ๋˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์ž์ฃผ ๋‚˜์˜ค๋Š” "์ „์ฒ˜๋ฆฌ"๋ผ๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ์ œ๋Œ€๋กœ๋œ ๋ชจ๋ธ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. 


๋ฐ์ดํ„ฐ์…‹ ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์ „์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?

KNN์€ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ์ƒ˜ํ”Œ๋“ค์„ ๊ณ ๋ฅด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ๊ฑฐ๋ฆฌ๊ฐ€ X์ถ•๊ณผ Y์ถ•์˜ Scale์ด ๋‹ค๋ฅด๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํŠน์„ฑ๊ฐ’์„ ์ผ์ •ํ•œ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ์ค˜์•ผ ํ•˜๊ณ  ์ด ๊ณผ์ •์„ "๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ(Data Preprocessing)"๋ผ๊ณ  ํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์— ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์ „์— ๊ฐ€๊ณตํ•˜๋Š” ๊ณผ์ •์ธ ๊ฒƒ์ด๋‹ค. 

 

ํ‘œ์ค€์ ์ˆ˜ Standard Score (Z-score)

์ „์ฒ˜๋ฆฌ๋Š” ํ‘œ์ค€์ ์ˆ˜๋กœ ๋งŽ์ด ์‹œํ–‰ํ•œ๋‹ค. ๊ฐ ํŠน์„ฑ๊ฐ’์ด ํ‰๊ท ์—์„œ ํ‘œ์ค€ํŽธ์ฐจ์˜ ๋ช‡ ๋ฐฐ๋งŒํผ ๋–จ์–ด์ ธ์žˆ๋Š”์ง€๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ด๋ ‡๊ฒŒ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋ฉด ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

numpy ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ np.mean()์™€ np.std() ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

mean = np.mean(train_input, axis =0)
std = np.std(train_input, axis=0) 
train_scaled = (train_input - mean) / std 

*์—ฌ๊ธฐ์„œ axis=0์€ train_input์ด 2์ฐจ์› ๋ฐ์ดํ„ฐ๋ผ๋ฉด, ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด  axis=0์ด๊ณ  ํ–‰์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด axis=1์ด๋ผ๋Š” ๋œป์ด๋‹ค. 

 


์ฐธ๊ณ : ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹ (ํ•œ๋น›๋ฏธ๋””์–ด, ๋ฐ•ํ•ด์„ )

728x90