[ํผ๊ณต๋จธ์ ] 01. K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ๋๋ฏธ์ ๋น์ด ๋ถ๋ฅ
์์ ๋ถ๋ฅ ๋ฌธ์
๋จธ์ ๋ฌ๋์ ๊ธฐ์ค์ ์ฐพ์ ๋ฟ๋ง ์๋๋ผ ๊ธฐ์ค์ ์ด์ฉํด ์์ ์ข ๋ฅ ํ๋ณํ ์ ์์
๋จธ์ ๋ฌ๋ ์ฌ์ฉํด ๋๋ฏธ(bream)์ ๋น์ด(smelt) ๊ตฌ๋ถ
๋๋ฏธ(bream) ๋ฐ์ดํฐ ์ค๋น
๋๋ฏธ์ ํน์ง์ ๊ธธ์ด์ ๋ฌด๊ฒ๋ก ํํ -> ํน์ฑ
* ํน์ฑ : ๋ฐ์ดํฐ์ ํน์ง
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, #๊ธธ์ด
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, #๋ฌด๊ฒ
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
x, y์ถ์ผ๋ก ์ด๋ค์ง ์ขํ๊ณ์ ๋ ๋ณ์(x, y)์ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ
* matplotlib(๋งทํ๋กฏ๋ฆฝ) : ํ์ด์ฌ์์ ๊ณผํ๊ณ์ฐ์ฉ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํจํค์ง
* scatter( ) : matplotblib ํจํค์ง๋ฅผ ์ํฌํฐํ๊ณ ์ฐ์ ๋๋ฅผ ๊ทธ๋ฆฌ๋ ํจ์
* import : ๋ฐ๋ก ๋ง๋ค์ด๋ ํ์ด์ฌ ํจํค์ง(ํด๋์ค์ ํจ์์ ๋ฌถ์)์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ถ๋ฌ์ค๋ ๋ช ๋ น
ํจํค์ง๋ฅผ ์ํฌํธํ ๋ as ํค์๋๋ก ํจํค์ง ์ด๋ฆ ์ค์ฌ์ ์ฐ๋ ๊ฒ ์ข์ํจ
* matplotlib.pyplot : matplotlib์ด MATLAB์ฒ๋ผ ์๋ํ๋๋ก ํ๋ ํจ์ ๋ชจ์
* show( ) : ํ๋ฉด์ ๊ทธ๋ํ ์ถ๋ ฅ
import matplotlib.pyplot as plt # matplotlib์ pyplot ํจ์๋ฅผ plt๋ก ์ค์ฌ์ ์ํฌํธ
plt.scatter(bream_length,bream_weight)
plt.xlabel('length') # x์ถ = ๊ธธ์ด
plt.ylabel('weight') # y์ถ = ๋ฌด๊ฒ
plt.show()
์ฐ์ ๋ ๊ทธ๋ํ๊ฐ ์ผ์ง์ ์ ๊ฐ๊น์ด ํํ : ์ ํ์
๋น์ด(smelt) ๋ฐ์ดํฐ ์ค๋น
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
๋๋ฏธ, ๋น์ด ํ ๊ทธ๋ํ๋ก ๊ทธ๋ฆฌ๊ธฐ
* 2๊ฐ์ ์ฐ์ ๋ ํ ๊ทธ๋ํ๋ก ๊ทธ๋ฆฌ๊ธฐ : scatter( )ํจ์ ์ฐ๋ฌ์ ์ฌ์ฉ
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weght')
plt.show()
์ฃผํฉ์ : ๋น์ด / ํ๋์ : ๋๋ฏธ
๋๋ฏธ์ ๋น์ด ๋ฐ์ดํฐ ํ๋๋ก ํฉ์น๊ธฐ
๋ฆฌ์คํธ ํฉ์น๊ธฐ -> ๊ทธ๋ฅ ๋ํ๋ฉด ๋จ
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
์ฌ์ดํท๋ฐ ์ฌ์ฉ์ ์ํด ๊ฐ ํน์ฑ์ ๋ฆฌ์คํธ๋ฅผ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก ๋์ด๋จ๋ฆฐ 2์ฐจ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
KNN์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๊ธฐ ์ํด Scikit-learn ๋จธ์ ๋ฌ๋ ํจํค์ง ์ฌ์ฉ
Scikit-learn ํจํค์ง๋ฅผ ์ฐ๋ ค๋ฉด ๊ฐ ํน์ฑ์ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก ๋์ด๋จ๋ฆฐ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ผ ํจ
fish_data = [[l,w] for l,w in zip(length, weight)]
for๋ฌธ zip( )ํจ์๋ก length์ weight ๋ฆฌ์คํธ์์ ์์๋ฅผ ํ๋์ฉ ๊บผ๋ด l๊ณผ w์ ํ ๋น
๊ทธ๋ฌ๋ฉด [ l, w]๊ฐ ํ๋์ ์์๋ก ๊ตฌ์ฑ๋ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด์ง
์ ๋ต ๋ถ์ฌ
๊ณฑ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ ํ์ด์ฌ ๋ฆฌ์คํธ ๋ฐ๋ณต
์ฐพ์ผ๋ ค๋ ๋์ : 1
๊ทธ ์ธ : 0
fish_target = [1]*35 + [0]*14
๋๋ฏธ์ 1, ๋น์ด์ 0 ํ ๋น
KNeighborsClassifier ์ํฌํธ
* KNeighborsClassifier : ์ฌ์ดํท๋ฐ ํจํค์ง์ K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ํด๋์ค
* ํจํค์ง๋ ๋ชจ๋ ์ ์ฒด๋ฅผ ์ํฌํธํ์ง ์๊ณ ํน์ ํด๋์ค๋ง ์ํฌํธํ๋ ค๋ฉด
from ํจํค์ง(๋ชจ๋) ~ import ํด๋์ค ๊ตฌ๋ฌธ ์ฌ์ฉ
from sklearn.neighbors import KNeighborsClassifier
์ํฌํธํ ํด๋์ค์ ๊ฐ์ฒด ์์ฑ
kn = KNeighborsClassifier()
ํ๋ จ
๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ฌ ๊ท์น์ ํ์ตํ๋ ๊ณผ์
* fit( ) : ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ก ์๊ณ ๋ฆฌ์ฆ ํ๋ จ
kn.fit(fish_data,fish_target)
ํ๊ฐ
* score( ) : ๋ชจ๋ธ์ ํ๊ฐ, 0~1 ์ฌ์ด ๊ฐ ๋ฐํ
kn.score(fish_data, fish_target)
1.0 ์ 100% ์ ํ๋
์์ธก
๊ธธ์ด 300 ๋ชธ๋ฌด๊ฒ 600์ธ ์๋ก์ด ๋ฐ์ดํฐ ์์ธก
* predict( ) : ์๋ก์ด ๋ฐ์ดํฐ์ ์ ๋ต ์์ธก
๋ฆฌ์คํธ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฌํด์ผ ํจ -> ์์ธก ๊ฐ์ ๋ฆฌ์คํธ๋ก 2๋ฒ ๊ฐ์ธ์ -> .predict[ [์์ธก๊ฐ] ]
kn.predict([[30,600]])
๋ฐํ ๊ฐ => array([1])
์์ธก -> 1
>> K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ
์ด๋ค ๋ฐ์ดํฐ์ ๋ํ ๋ต์ ๊ตฌํ ๋ ์ฃผ์์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ๋ค์๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ ์ ๋ต์ผ๋ก ์ฌ์ฉ
์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ์์ธกํ ๋๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ง์ ๊ฑฐ๋ฆฌ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์๋์ง ์ดํด๋ด
๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ง์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์
๋ฐ์ดํฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ํ์ํ๊ณ ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋๋ฐ ๋ง์ ์๊ฐ ํ์
* _fit_X ์์ฑ์ ์ ๋ฌํ fish_data ๊ฐ์ง
print(kn._fit_X)
* _y ์์ฑ์ fish_target ๊ฐ์ง
print(kn._y)
K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์ธ๊ฐ ํ๋ จ๋๋ ๊ฒ ์๋ ์
fit( ) ๋ฉ์๋์ ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ ์ฅํ๊ณ ์๋ค๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ฑ์ฅํ๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฐ์ดํฐ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌ๋ถ
KNeighborsClassifier ํด๋์ค์ ๊ธฐ๋ณธ๊ฐ = 5
๊ธฐ์ค์ n_neighbors ๋งค๊ฐ๋ณ์๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
# ์ฐธ๊ณ ๋ฐ์ดํฐ๋ฅผ 49๊ฐ๋ก ํ ๋ชจ๋ธ
kn49 = KNeighborsClassifier(n_neighbors=49)
๊ฐ์ฅ ๊ฐ๊น์ด 49๊ฐ ๋ฐ์ดํฐ ์ฌ์ฉํ๋ k-์ต๊ทผ์ ์ด์ ๋ชจ๋ธ์ fish_data๋ฅผ ์ ์ฉํ๋ฉด fish_data์ ์๋ ๋ชจ๋ ์์ ์ ์ฌ์ฉํ์ฌ ์์ธกํ๊ฒ ๋จ => fish_data์ 49๊ฐ ์ค 35๊ฐ๊ฐ ๋๋ฏธ, 14๊ฐ๊ฐ ๋น์ด๋ก, ๋๋ฏธ๊ฐ ๋ค์๋ฅผ ์ฐจ์งํจ => ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ ๋ฌด์กฐ๊ฑด ๋๋ฏธ๋ก ์์ธก
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
๊ฒฐ๊ณผ๊ฐ => 0.714285714...
fish_data์ ์๋ ์์ ์ค ๋๋ฏธ๊ฐ 35๊ฐ, ๋น์ด๊ฐ 14๊ฐ => kn49๋ชจ๋ธ์ ๋๋ฏธ๋ง ์ฌ๋ฐ๋ฅด๊ฒ ๋ง์ถค => ์ ํ๋ = 35/49
print(35/49)
๊ฒฐ๊ณผ๊ฐ => 0.714285714...
score( ) ๋ฉ์๋์ ๊ฐ์ ์ ํ๋ ๊ฐ ์ป์
์ฐธ๊ณ ๋์ : ํผ์๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋ + ๋ฅ๋ฌ๋, ๋ฐํด์ , ํ๋น๋ฏธ๋์ด, 2020๋