[์ธ๊ณต์ง๋ฅ ์์๊ฐ๊ธฐ] ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ KNN (K-์ต๊ทผ์ ์ด์, K-Nearest Neighbors) (1) KNN ๋ถ๋ฅ ๋ชจ๋ธ
์ด๋ฒ์๋ ๋จธ์ ๋ฌ๋์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๋ฐ์ดํฐ์ ๊ตฌ์ถ ๊ทธ๋ฆฌ๊ณ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ๋ฑ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ตฌํํ๋ ๊ธฐ์ด์ ์ธ ํ๋ฆ์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํด๋ณด์๋ค! ํนํ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ฌ์ด 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์ ๊ธฐ๋ณธ์ ์ธ ํน์ง์ ๋ํด์ ์ ๋ฆฌํ์๋ฉด,
- ๋ฐ์ดํฐ ์ค๋น: KNN์ ํน๋ณํ ํ๋ จ ๊ณผ์ ์ด ์๊ณ , ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ์ ์ฅํ๋ ๊ฒ์ด ์ ๋ถ์ด๋ค. ํน์ฑ๊ฐ์ด ์ ์ฅ๋ ํ๋ จ๋ฐ์ดํฐ์ ํ๊น๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค. ํ๊น์ ๋๊ฐ์ง๋ก ๊ตฌ๋ถํ๋ ๊ฒฝ์ฐ(Binary), 0, 1๋ก ํ๊น์ ์ค์ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ: ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด, ๊ธฐ์กด ๋ฐ์ดํฐ์์ ์ง์ ๊ฑฐ๋ฆฌ(์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ)๋ฅผ ๊ณ์ฐํ๋ค. ์ด ์ธ์๋ ๊ฒฉ์ ๊ธฐ๋ฐ ๊ฑฐ๋ฆฌ์ธ ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ก๋ ๊ณ์ฐํ ์ ์๋ค.
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ ํ: ๊ฑฐ๋ฆฌ ๊ณ์ฐ ํ ๊ฐ์ฅ ๊ฐ๊น์ด K๊ฐ์ ์ด์์ ์ฐพ์ผ๋ฉฐ, ์ด๋์ 'K'๋ ์ง์ ์ค์ ํ ์ ์์ผ๋ฉฐ, n_neighbors ๋งค๊ฐ๋ณ์๋ก ์กฐ์ ํ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ 5๋ก ์ง์ ๋์ด ์๋ค.
- ๋ค์๊ฒฐ ํฌํ: ์ ํ๋ ์ด์๋ค ์ค ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ๋ ํด๋์ค๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ค.
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)
- p: ๊ฑฐ๋ฆฌ ๊ณ์ฐ ๋ฐฉ์
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์ด๋ผ๋ ๋ป์ด๋ค.
์ฐธ๊ณ : ํผ์๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋+๋ฅ๋ฌ๋ (ํ๋น๋ฏธ๋์ด, ๋ฐํด์ )