[ํผ๊ณต๋จธ์ ] 02. ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ - ํ๋ จ์ธํธ & ํ ์คํธ ์ธํธ, ์ํ๋ง ํธํฅ, ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ
์ง๋ ํ์ต vs ๋น์ง๋ ํ์ต
์ง๋ํ์ต : ์ ๋ต(ํ๊น)์ด ์์ผ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ ๋ต์ ๋งํ๋ ๊ฒ์ ํ์ต
ํ๋ จํ๊ธฐ ์ํ ๋ฐ์ดํฐ์ ์ ๋ต ํ์
๋ฐ์ดํฐ = ์
๋ ฅ, ์ ๋ต = ํ๊น, ์ด ๋์ ํฉ์ณ ํ๋ จ๋ฐ์ดํฐ
๋น์ง๋ํ์ต : ํํท ์์ด ์
๋ ฅ ๋ฐ์ดํฐ๋ง ์ฌ์ฉ
-> ์ ๋ต์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๋ฌด์ธ๊ฐ ๋งํ ์ ์์
๋์ ๋ฐ์ดํฐ๋ฅผ ์ ํ์
ํ๊ฑฐ๋ ๋ณํํ ์ ์์
+) ๊ฐํํ์ต : ํํท์ด ์๋๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ํ๋ํ ๊ฒฐ๊ณผ๋ก ์ป์ ๋ณด์์ ์ฌ์ฉํด ํ์ต
02-1. ํ๋ จ์ธํธ์ ํ ์คํธ ์ธํธ
๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ ๋๋ก ํ๊ฐํ๋ ค๋ฉด ํ๋ จ ๋ฐ์ดํฐ์ ํ๊ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ๋ฌ๋ผ์ผ ํจ
-> 1. ํ๊ฐ๋ฅผ ์ํ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ค๋น 2. ์ด๋ฏธ ์ค๋น๋ ๋ฐ์ดํฐ ์ค์ ์ผ๋ถ๋ฅผ ๋ผ์ด ๋ด์ด ํ์ฉ( V )
ํ๊ฐ์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ = ํ
์คํธ ์ธํธ, ํ๋ จ์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ = ํ๋ จ ์ธํธ
ํ๋ จ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ๊ฐํ๋ ๊ฒ ์ ์ ํ์ง ์์
ํ๋ จํ ๋ ์ฌ์ฉํ์ง ์์ ๋ฐ์ดํฐ๋ก ํ๊ฐํด์ผ ํจ
์ด๋ฅผ ์ํด ํ๋ จ ๋ฐ์ดํฐ์์ ์ผ๋ถ๋ฅผ ๋ผ์ด ๋ด์ด ํ
์คํธ ์ธํธ๋ก ์ฌ์ฉ
๋๋ฏธ์ ๋น์ด์ ๋ฐ์ดํฐ ํฉ์น ํ์ด์ฌ ๋ฆฌ์คํธ
fish_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, 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]
fish_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, 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์ฐจ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14
ํ๋์ ์์ ๋ฐ์ดํฐ = ์ํ
๋๋ฏธ(35) + ๋น์ด(14) -> ์ ์ฒด ๋ฐ์ดํฐ๋ 49๊ฐ ์ํ, ์ฌ์ฉํ๋ ํน์ฑ์ ๊ธธ์ด์ ๋ฌด๊ฒ 2๊ฐ
์ฌ์ดํท๋ฐ์ KNeighborsClassifer ํด๋์ค ์ํฌํธํ๊ณ ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ
from sklearn.neighbors import KNeighborsClassifier
kn= KNeighborsClassifier()
๋ฐ์ดํฐ์ ์ฒ์ 35๊ฐ๋ฅผ ํ๋ จ ์ธํธ, ๋๋จธ์ง 14๊ฐ๋ฅผ ํ ์คํธ ์ธํธ๋ก ์ฌ์ฉ
์ธ๋ฑ์ค : ๋ฐฐ์ด์ ์์น
์ฌ๋ผ์ด์ฑ : ์ฝ๋ก (:)์ ๊ฐ์ด๋ฐ ๋๊ณ ์ธ๋ฑ์ค์ ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ
๋ง์ง๋ง ์ธ๋ฑ์ค์ ์์๋ ํฌํจ๋์ง ์๋๋ค [ ์์ : ๋ง์ง๋ง +1 ]
์ฒ์๋ถํฐ ์์ [ : n ] ๋ง์ง๋ง๊น์ง [ n : ] ์๋ต ๊ฐ๋ฅ
# ํ๋ จ ์ธํธ ์
๋ ฅ๊ฐ 0~34 (์ฒ์ 35๊ฐ)
train_input = fish_data[ :35]
# ํ๋ จ ์ธํธ ํ๊น๊ฐ 0~34
train_target = fish_target[ :35]
# ํ
์คํธ ์ธํธ ์
๋ ฅ๊ฐ 35~๋ง์ง๋ง (๋๋จธ์ง 14๊ฐ)
test_input = fish_data[35: ]
# ํ
์คํธ ์ธํธ ํ๊น๊ฐ 35~๋ง์ง๋ง
test_target = fish_target[35: ]
์ธ๋ฑ์ค 0~34๊น์ง ์ฒ์ 35๊ฐ ์ํ - ํ๋ จ ์ธํธ
์ธ๋ฑ์ค 35~48๊น์ง ๋๋จธ์ง 14๊ฐ ์ํ - ํ
์คํธ ์ธํธ
ํ๋ จ ์ธํธ๋ก fit( ) ๋ฉ์๋ ํธ์ถ ๋ชจ๋ธ ํ๋ จ
ํ
์คํธ ์ธํธ๋ก score( ) ๋ฉ์๋ ํธ์ถ ๋ชจ๋ธ ํ๊ฐ
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
fish_data์๋ ์ฒ์๋ถํฐ ์์๋๋ก 35๊ฐ์ ๋๋ฏธ์ 14๊ฐ์ ๋น์ด ์ํ์ด ๋ค์ด๊ฐ ์์
๋ฐ๋ผ์ ๋ง์ง๋ง 14๊ฐ๋ฅผ ํ
์คํธ ์ธํธ๋ก ๋ง๋ค๋ฉด ๋น์ด ๋ฐ์ดํฐ๋ง ๋ค์ด๊ฐ๊ฒ ๋จ
ํ๋ จ ์ธํธ์ ๋๋ฏธ๋ง ์์ด์ ํ
์คํธ ์ธํธ๊ฐ ๋ฌด์์ด๋ ๋ฌด์กฐ๊ฑด ๋๋ฏธ๋ก ๋ถ๋ฅ
๊ทธ๋ฐ๋ฐ ํ
์คํธ ์ธํธ๋ ๋น์ด๋ง ์์
=> ์ ํ๋ 0 %
์ํ๋ง ํธํฅ
ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ ์ํ์ด ๊ณจ๊ณ ๋ฃจ ์์ฌ ์์ง ์์ผ๋ฉด ์ํ๋ง์ด ํ์ชฝ์ผ๋ก ์น์ฐ์น ๊ฒฝ์ฐ
-> ํ๋ จ ์ธํธ, ํ
์คํธ ์ธํธ ๋๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ง, ๊ณจ๊ณ ๋ฃจ ์ํ์ ๋ฝ์์ ํ๋ จ ์ธํธ, ํ
์คํธ ์ธํธ ๋ง๋ค์ด์ผ ํจ
* ๋ํ์ด numpy
๊ณ ์ฐจ์์ ๋ฐฐ์ด์ ์์ฝ๊ฒ ๋ง๋ค๊ณ ์กฐ์ํ ์ ์๋ ๊ฐํธํ ๋๊ตฌ <- ์ ๊ณต ๋ฐ์ดํฐ๋ฅผ ์๊ฑฐ๋ ๋ฝ๋ ๊ฒ์ ๊ฐํธํ ์ฒ๋ฆฌ๊ฐ๋ฅ
1์ฐจ์ ๋ฐฐ์ด - ์ , 2์ฐจ์ ๋ฐฐ์ด - ๋ฉด, 3์ฐจ์ ๋ฐฐ์ด - ๊ณต๊ฐ
๋ณดํต์ xy ์ขํ๊ณ์ ๋ฌ๋ฆฌ ์์์ ์ด ์ผ์ชฝ ์์์๋ถํฐ ์์
๋ํ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
import numpy as np
ํ์ด์ฌ ๋ฆฌ์คํธ๋ฅผ ๋ํ์ด ๋ฐฐ์ด๋ก ๋ฐ๊พธ๊ธฐ
* ๋ํ์ด array( ) ํจ์ : ํ์ด์ฌ ๋ฆฌ์คํธ๋ฅผ ๋ํ์ด ๋ฐฐ์ด๋ก ๋ฐ๊พธ๊ธฐ
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
๋ฐฐ์ด ํฌ๊ธฐ ํ์ธ
* shape ๋ฐฐ์ด์ ํฌ๊ธฐ ์๋ ค์ค (์ํ ์, ํน์ฑ ์)
print(input_arr.shape)
(49, 2) => ์ํ 49๊ฐ, ํน์ฑ 2๊ฐ
๋ฐฐ์ด์์ ๋๋คํ๊ฒ ์ํ ์ ํํด ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ ๋ง๋ค๊ธฐ
์ฃผ์ ) input_arr์ target_arr์์ ๊ฐ์ ์์น๋ ํจ๊ป ์ ํ๋์ด์ผ ํจ
-> ์ธ๋ฑ์ค๋ฅผ ์์ ๋ค์ input_arr, target_arr ์ํ ์ ํ -> ๋ฌด์์
* ๋ํ์ด arange( ) ํจ์ : ์์์์ ๋๊น์ง step ํฌ๊ธฐ๋งํผ ์ผ์ ํ๊ฒ ๋จ์ด์ง ์ซ์๋ค์ array ํํ๋ก ๋ฐํ
np.arange(์์์ (์๋ต ์ 0), ๋์ (๋ฏธํฌํจ), step size(์๋ต ์ 1))
* shuffle( ) ํจ์ : ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ฌด์์๋ก ์์
np.random.seed(42) # ์ผ์ ํ ๊ฒฐ๊ณผ ์ป์ผ๋ ค๋ฉด ์ด๊ธฐ์ ๋๋ค์๋ ์ง์
index = np.arange(49)
np.random.shuffle(index)
* ๋ฐฐ์ด ์ธ๋ฑ์ฑ : ์ฌ๋ฌ ๊ฐ์ ์ธ๋ฑ์ค๋ก ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ
index ๋ฐฐ์ด์ ์ฒ์ 35๊ฐ๋ฅผ input_arr์ target_arr ์ ๋ฌํ์ฌ ๋๋คํ๊ฒ 35๊ฐ ์ํ์ ํ๋ จ ์ธํธ๋ก ๋ง๋ค๊ธฐ
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
๋๋จธ์ง 14๊ฐ๋ฅผ ํ
์คํธ ์ธํธ๋ก ๋ง๋ค๊ธฐ
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
์ฐ์ ๋ ํ์ธ
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
ํ๋์ = ํ๋ จ ์ธํธ, ์ฃผํฉ์ = ํ
์คํธ ์ธํธ
๋ ๋ฒ์งธ ๋จธ์ ๋ฌ๋ ํ๋ก๊ทธ๋จ
K-์ต๊ทผ์ ์ด์ ๋ชจ๋ธ ํ๋ จ
kn = kn.fit(train_input, train_target)
๋ชจ๋ธ ํ ์คํธ
kn.score(test_input, test_target)
ํ ์คํธ ์ธํธ์ ์์ธก ๊ฒฐ๊ณผ์ ์ค์ ํ๊น ํ์ธ
kn.predict(test_input)
test_target
predict( ) ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ ๋ํ์ด ๋ฐฐ์ด์
02-2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ค์ ์ ํฌ์ > ๊ธธ์ด๊ฐ 25cm, ๋ฌด๊ฒ๊ฐ 150g์ด๋ฉด ๋๋ฏธ์ธ๋ฐ ๋น์ด๋ผ๊ณ ์์ธก --> ๋ญ๊ฐ ์๋ชป๋ ๊ฑธ๊น?
๋ํ์ด๋ก ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
fish_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, 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]
fish_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, 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]
๋ํ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
import numpy as np
์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ ์ผ๋ ฌ๋ก ์ธ์ด ๋ค์ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐ
for๋ฌธ, zip() ์ด์ฉ ํ์ด์ฌ ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉด์ ์์๋ฅผ ํ๋์ฉ ๊บผ๋ด
์์ ํ๋์ ๊ธธ์ด์ ๋ฌด๊ฒ๋ฅผ ๋ฆฌ์คํธ ์์ ๋ฆฌ์คํธ๋ก ์ง์ ๊ตฌ์ฑ
-> ๋ํ์ด column_stack( ) ์ฌ์ฉ!
* column_stack( ) : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ ์ผ๋ ฌ๋ก ์ธ์ด ๋ค์ ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐ
์ฐ๊ฒฐํ ๋ฆฌ์คํธ๋ ํ์ด์ฌ ํํ๋ก ์ ๋ฌ
์) np.column_stack(( [1,2,3], [4,5,6] ))
=> array([[1,4],
[2,5],
[3,6]])
* ํ์ด์ฌ ํํ์ ๋ฆฌ์คํธ์ ๋งค์ฐ ๋น์ท. ๋ฆฌ์คํธ์ฒ๋ผ ์์์ ์์๊ฐ ์์ง๋ง ํ ๋ฒ ๋ง๋ค์ด์ง ํํ์ ์์ ํ ์ ์๋ค.
ํํ์ ์ฌ์ฉํ๋ฉด ํจ์๋ก ์ ๋ฌํ ๊ฐ์ด ๋ฐ๋์ง ์๋๋ค ~> ๋งค๊ฐ๋ณ์ ๊ฐ์ผ๋ก ๋ง์ด ์ฌ์ฉ
fish_data = np.column_stack((fish_length, fish_weight))
๋ํ์ด ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ฉด ๋ฆฌ์คํธ์ฒ๋ผ ํ ์ค๋ก ๊ธธ๊ฒ ์ถ๋ ฅ x
ํ๊ณผ ์ด์ ๋ง์ถ์ด ๊ฐ์ง๋ฐํ ์ ๋ฆฌ๋ ๋ชจ์ต์ผ๋ก ๋ณด์ฌ์ค
ํ๊น ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
> 1์ด 35๊ฐ์ธ ๋ฐฐ์ด๊ณผ 0์ด 14๊ฐ์ธ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
์์๊ฐ ํ๋์ธ ๋ฆฌ์คํธ [1], [0]์ ์ฌ๋ฌ ๋ฒ ๊ณฑํด์ ํ๊น ๋ฐ์ดํฐ ๋ง๋ฆ
-> ๋ํ์ด np.ones( ), np.zeros( ) ํจ์ ์ด์ฉ!
* np.ones( ), np.zeros( ) : ๊ฐ๊ฐ ์ํ๋ ๊ฐ์์ 1๊ณผ 0์ ์ฑ์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ค
์) print(np.ones(5)) => [1,1,1,1,1]
> ๋ ๋ฐฐ์ด ์ฐ๊ฒฐ
np.ones(), np.zeros() ํจ์ ์ฌ์ฉํด 1์ด 35๊ฐ์ธ ๋ฐฐ์ด๊ณผ 0์ด 14๊ฐ์ธ ๋ฐฐ์ด ๋ง๋ค๊ณ
np.concatenate() ํจ์ ์ฌ์ฉํด ๋ฐฐ์ด ์ฐ๊ฒฐ
* np.concatenate( ) : ์ฒซ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ฐ๊ฒฐ
์ฐ๊ฒฐํ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ํํ๋ก ์ ๋ฌํด์ผ ํจ
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
> np.column_stack( ) vs np.concatenate( )
์ฌ์ดํท๋ฐ์ผ๋ก ํ๋ จ์ธํธ์ ํ ์คํธ ์ธํธ ๋๋๊ธฐ
๋ํ์ด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ์์ด ํ๋ จ ์ธํธ์ ๋ฐ์ดํฐ ์ธํธ ๋๋ ... ๋ฒ๊ฑฐ๋ก์
-> ์ฌ์ดํท๋ฐ train_test_split( ) ํจ์ ์ด์ฉ!
train_test_split ํจ์ ์ํฌํธ
* train_test_split( ) : ์ ๋ฌ๋๋ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ๋น์จ์ ๋ง๊ฒ ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋๋์ด์ค
๋๋๊ธฐ ์ ์ ์์์ ์์
์ฌ์ดํท๋ฐ model_selection ๋ชจ๋ ์๋ ์์
from sklearn.model_selection import train_test_split
fish_data์ fish_target ๋๋๊ธฐ
์ฌ์ฉ๋ฒ : ๋๋๊ณ ์ถ์ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์ํ๋ ๋งํผ ์ ๋ฌ
train_test_split() ํจ์์๋ ์์ฒด์ ์ผ๋ก ๋๋ค ์๋๋ฅผ ์ง์ ํ ์ ์๋ random_state ๋งค๊ฐ๋ณ์ ์์
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, random_state=42)
fish_data์ fish_target 2๊ฐ์ ๋ฐฐ์ด์ ์ ๋ฌ -> 2๊ฐ์ฉ ๋๋์ด ์ด 4๊ฐ์ ๋ฐฐ์ด ๋ฐํ
์ฒ์ 2๊ฐ๋ ์
๋ ฅ๋ฐ์ดํฐ(train_input, test_input) ๋๋จธ์ง 2๊ฐ๋ ํ๊น๋ฐ์ดํฐ(train_target, test_target)
์ด ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 25%๋ฅผ ํ
์คํธ ์ธํธ๋ก ๋ผ์ด๋
์ ๋ ฅ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ถ๋ ฅ
* shape( ) : ๋ฐฐ์ด์ ์ถ ๊ธธ์ด
print(train_input.shape, test_input.shape)
=> (36, 2) (13, 2)
์
๋ ฅ๋ฐ์ดํฐ๋ 2๊ฐ์ ์ด์ด ์๋ 2์ฐจ์ ๋ฐฐ์ด
ํ๊น ๋ฐ์ดํฐ ํฌ๊ธฐ ์ถ๋ ฅ
print(train_target.shape, test_target.shape)
=> (36,) (13,)
ํ๊น ๋ฐ์ดํฐ๋ 1์ฐจ์ ๋ฐฐ์ด
ํ๋ จ ๋ฐ์ดํฐ 36๊ฐ, ํ
์คํธ ๋ฐ์ดํฐ 13๊ฐ๋ก ๋๋
๋ฐ์ดํฐ ์ถ๋ ฅ
print(test_target)
=> [1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
13 ์ธํธ ์ค์์ 10๊ฐ๊ฐ ๋๋ฏธ(1), 3๊ฐ๊ฐ ๋น์ด(3)
์๋ ๋๋ฏธ์ ๋น์ด ๊ฐ์ 35๊ฐ์ 14 -> 2.5:1 ๋น์จ
ํ์ง๋ง ์ด ํ
์คํธ ์ธํธ์ ๋น์จ์ 3.3:1
-> ์ํ๋ง ํธํฅ
ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ ๋๋๊ธฐ
ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ ์ํ์ ํด๋์ค ๋น์จ์ด ์ผ์ ํ์ง ์๋ค๋ฉด ๋ชจ๋ธ์ด ์ผ๋ถ ์ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ตํ ์ ์์
-> train_test_split( ) ํจ์์ stratify ๋งค๊ฐ๋ณ์์ ํ๊น ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๋
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)
print(test_target)
=> [0. 0. 1. 0. 1. 0. 1. 1. 1. 1. 1. 1. 1.]
๋น์ด๊ฐ ํ๋ ๋์ด ํ
์คํธ ์ธํธ์ ๋น์จ์ด 2.25:1์ด ๋จ
๋ฐ์ดํฐ ์ค๋น ์๋ฃ! ๋ฌธ์ ํ์ธ!
์์ํ ๋๋ฏธ ํ ๋ง๋ฆฌ
K-์ต๊ทผ์ ์ด์ ํ๋ จ
์์ ์ค๋นํ ๋ฐ์ดํฐ๋ก k-์ต๊ทผ์ ์ด์ ํ๋ จ
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
๋ชจ๋ธ์ ์ ๋๋ฏธ ๋ฐ์ดํฐ ๋ฃ๊ณ ๊ฒฐ๊ณผ ํ์ธ
๊ธธ์ด๊ฐ 25cm, ๋ฌด๊ฒ๊ฐ 150g ๋ฐ์ดํฐ
print(kn.predict([[25,150]]))
=> [0]
๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์๋๋ฐ ๋น์ด๋ก ์์ธก๋์๋ค ??????
์ฐ์ ๋ ํ์ธ
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
k-์ต๊ทผ์ ์ด์์ ์ฃผ๋ณ ์ํ ์ค์์ ๋ค์์ธ ํด๋์ค๋ฅผ ์์ธก์ผ๋ก ์ฌ์ฉ
* kneighbors( ) : KNeighborsClassifier ํด๋์ค - ์ฃผ์ด์ง ์ํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ฐพ์์ฃผ๋ ๋ฉ์๋
์ด์๊น์ง์ ๊ฑฐ๋ฆฌ์ ์ด์ ์ํ์ ์ธ๋ฑ์ค ๋ฐํ
* n_neighbors( ) : KNeighborsClassifier ํด๋์ค์ ์ด์ ๊ฐ์, ๊ธฐ๋ณธ๊ฐ 5
distances, indexes = kn.kneighbors([[25, 150]])
ํ๋ จ ๋ฐ์ดํฐ ์ค์์ ์ด์ ์ํ์ ๋ฐ๋ก ๊ตฌ๋ถํด ๊ทธ๋ฆฌ๊ธฐ
indexes ๋ฐฐ์ด ์ฌ์ฉ
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
์ผ๊ฐํ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด 5๊ฐ์ ์ํ์ด ์ด๋ก ๋ค์ด์๋ชฌ๋๋ก ํํ
๋ฐ์ดํฐ ํ์ธ
print(train_input[indexes])
=> [[[ 25.4 242. ] [ 15. 19.9] [ 14.3 19.7] [ 13. 12.2] [ 12.2 12.2]]]
ํ๊น ๋ฐ์ดํฐ๋ก ํ์ธ
print(train_target[indexes])
=> [[1. 0. 0. 0. 0.]]
๊ธธ์ด 25cm ๋ฌด๊ฒ 150g์ธ ์์ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ๋น์ด๊ฐ ์๋์ ์ผ๋ก ๋ง์
์ฐ์ ๋๋ฅผ ๋ณด๋ฉด ์ง๊ด์ ์ผ๋ก ๋๋ฏธ๊ฐ ๊ฐ๊น๊ฒ ๋ณด์ด๋๋ฐ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ๋น์ด๋ผ๊ณ ์๊ฐ?????
-> kneighbors() ๋ฉ์๋์์ ๋ฐํํ distances ๋ฐฐ์ด ์ถ๋ ฅ!
์ด์ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
* distances : ์ด์ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ
print(distances)
=> [[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]
๊ธฐ์ค์ ๋ง์ถฐ๋ผ
[[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]
์ผ๊ฐํ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฒซ ๋ฒ์งธ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ 92
๊ทธ ์ธ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ๋ค์ 130, 138
๊ทธ๋ฐ๋ฐ 92์ 130 ๊ทธ๋ํ ๊ฑฐ๋ฆฌ ๋น์จ์ด ์ด์ํ๋ค?????
-> x์ถ์ ๋ฒ์๊ฐ ์ข๊ณ (10~40) y์ถ์ ๋ฒ์๊ฐ ๋์(0~1000)
-> y์ถ์ผ๋ก ์กฐ๊ธ๋ง ๋ฉ์ด์ ธ๋ ๊ฑฐ๋ฆฌ๊ฐ ํฐ ๊ฐ์ผ๋ก ๊ณ์ฐ
-> x์ถ ๋ฒ์๋ฅผ ๋์ผํ๊ฒ 0~1000์ผ๋ก ๋ง์ถ์
x์ถ ๋ฒ์๋ฅผ ๋์ผํ๊ฒ ๋ง์ถ์
* xlim( ) : x์ถ ๋ฒ์ ์ง์
* ylim( ) : y์ถ ๋ฒ์ ์ง์
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25,150, marker='^')
plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
plt.xlim((0,1000))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
x์ถ๊ณผ y์ถ ๋ฒ์ ๋์ผํ๊ฒ ๋ง์ถ์๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ง์ผ๋ก ๋์ด์ ํํ
-> ์์ ๊ธธ์ด(x์ถ)๋ ํฐ ์ํฅ ๋ฏธ์น์ง ๋ชป ํจ, ์์ ๋ฌด๊ฒ(y์ถ)๋ง ๊ณ ๋ ค ๋์
๋ ํน์ฑ(๊ธธ์ด์ ๋ฌด๊ฒ)์ ๊ฐ์ด ๋์ธ ๋ฒ์๊ฐ ๋งค์ฐ ๋ค๋ฆ
์ด๋ฅผ ๋ ํน์ฑ์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ค๊ณ ํจ
๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๊ธฐ์ค์ด ๋ค๋ฅด๋ฉด ์๊ณ ๋ฆฌ์ฆ ์ฌ๋ฐ๋ฅด๊ฒ ์์ธก ๋ถ๊ฐ (ํนํ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ผ ๋)
์ ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ํน์ฑ๊ฐ์ ์ผ์ ํ ๊ธฐ์ค์ผ๋ก ๋ง์ถฐ์ผ ํจ
* ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
ํน์ฑ๊ฐ์ ์ผ์ ํ ๊ธฐ์ค์ผ๋ก ๋ง์ถ๋ ์์
ํ์ค์ ์
๊ฐ ํน์ฑ๊ฐ์ด ํ๊ท ์์ ํ์คํธ์ฐจ์ ๋ช ๋ฐฐ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋
์ด๋ฅผ ํตํด ์ค์ ํน์ฑ๊ฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ๋์ผํ ์กฐ๊ฑด์ผ๋ก ๋น๊ต ๊ฐ๋ฅ
* ๋ถ์ฐ : ๋ฐ์ดํฐ์์ ํ๊ท ์ ๋บ ๊ฐ์ ๋ชจ๋ ์ ๊ณฑํ ๋ค์ ํ๊ท ์ ๋ธ๋ค
* ํ์คํธ์ฐจ : ๋ถ์ฐ์ ์ ๊ณฑ๊ทผ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋ ์ ๋
๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ ์์ ๋ช ํ์คํธ์ฐจ๋งํผ ๋จ์ด์ ธ ์๋์ง ๋ํ๋
๊ณ์ฐ๋ฒ : ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋๊ธฐ
mean= np.mean(train_input, axis=0)
std=np.std(train_input, axis=0)
* np.mean( ) : ํ๊ท
* np.std( ) : ํ์คํธ์ฐจ
* train_input : ํฌ๊ธฐ์ ๋ฐฐ์ด
* aixs : ์ค์ฌ ์ถ
ํน์ฑ๋ง๋ค ๊ฐ์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ฏ๋ก ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ ๊ฐ ํน์ฑ๋ณ๋ก ๊ณ์ฐํด์ผ ํจ
axis=0 : ํ์ ๋ฐ๋ผ ๊ฐ ์ด์ ํต๊ณ ๊ฐ ๊ณ์ฐ
๊ณ์ฐ๋ ํ๊ท , ํ์คํธ์ฐจ ์ถ๋ ฅ
print(mean, std)
=> [ 27.29722222 454.09722222] [ 9.98244253 323.29893931]
๊ฐ ํน์ฑ๋ง๋ค ํ๊ท , ํ์คํธ์ฐจ ๊ตฌํด์ง
ํ์ค์ ์ ๋ฐํ
์๋ณธ ๋ฐ์ดํฐ์์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋์ด ํ์ค์ ์๋ก ๋ฐํ
train_scaled = (train_input - mean) / std
train_input์ ๋ชจ๋ ํ์์ mean์ ์๋ ๋ ํ๊ท ๊ฐ์ ๋บด์ค
๊ทธ ๋ค์ std์ ์๋ ๋ ํ์คํธ์ฐจ๋ฅผ ๋ค์ ๋ชจ๋ ํ์ ์ ์ฉ
* ๋ธ๋ก๋์บ์คํ
: ๋ํ์ด ๋ฐฐ์ด ์ฌ์ด์์ ์ผ์ด๋จ
์ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ๋ จํ๊ธฐ
ํ์ค์ ์๋ก ๋ณํํ ๋ฐ์ดํฐ์ ์ํ ์ฐ์ ๋
ํ์ค์ ์๋ก ๋ณํํ train_sacled์ [25,150] ์ํ๋ก ์ฐ์ ๋
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(25, 150, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
์ค๋ฅธ์ชฝ ๋งจ ๊ผญ๋๊ธฐ์ ์ํ ํ๋๋ง ๋ฉ๊ทธ๋ฌ๋?????
-> ํ๋ จ ์ธํธ๋ฅผ mean์ผ๋ก ๋นผ๊ณ std๋ก ๋๋์ด ์ฃผ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฒ์ ๋ฌ๋ผ์ง
์ํ๋ ํ๋ จ ์ธํธ mean, std ์ด์ฉ ๋ณํ
์ํ [25,150]์ ๋์ผํ ๋น์จ๋ก ๋ณํ
์ค์!! โ
ํ๋ จ ์ธํธ์ mean, std๋ฅผ ์ด์ฉํ์ฌ ๋ณํํด์ผ ํจ โ
new = ([25,150] - mean) / std
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
ํ์คํธ์ฐจ๋ก ๋ณํํ๊ธฐ ์ ์ ์ฐ์ ๋์ ๊ฑฐ์ ๋์ผ
๋ฌ๋ผ์ง ์ : x, y์ถ์ ๋ฒ์๊ฐ -1.5 ~ 1.5 ์ฌ์ด๋ก ๋ฐ๋
ํ๋ จ๋ฐ์ดํฐ์ ๋ ํน์ฑ์ด ๋น์ทํ ๋ฒ์๋ฅผ ์ฐจ์ง
๋ณํํ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ค์ ํ๋ จ
kn.fit(train_scaled, train_target)
ํ
์คํธ ์ธํธ๋ ํ๋ จ ์ธํธ ๊ธฐ์ค์ผ๋ก ๋ณํ
์ฃผ์ ) ํ๋ จ ํ ํ
์คํธ ์ธํธ๋ฅผ ํ๊ฐํ ๋๋
ํ๋ จ ์ธํธ์ ๊ธฐ์ค์ผ๋ก ํ
์คํธ ์ธํธ๋ฅผ ๋ณํํด์ผ ๊ฐ์ ์ค์ผ์ผ๋ก ์ฐ์ ๋๋ฅผ ๊ทธ๋ฆด ์ ์๋ค
test_scaled = (test_input - mean) / std
๋ชจ๋ธ ํ๊ฐ
kn.score(test_scaled, test_target)
๋ชจ๋ธ ์์ธก
print(kn.predict([new]))
=> [1.]
๋๋์ด ๋๋ฏธ๋ก ์์ธก
kneighbors( ) ํจ์๋ก ์ํ k-์ต๊ทผ์ ์ด์ ๊ตฌํ ๋ค์ ์ฐ์ ๋
ํน์ฑ์ ํ์ค์ ์๋ก ๋ฐ๊พธ์๊ธฐ ๋๋ฌธ์ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ฑฐ๋ฆฌ ์ธก์
๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ๋ณํ!
distances, indexes = kn.kneighbors([new])
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.scatter(train_scaled[indexes,0], train_scaled[indexes,1], marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
์ผ๊ฐํ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ ๋ชจ๋ ๋๋ฏธ!
ํน์ฑ๊ฐ์ ์ค์ผ์ผ์ ๋ฏผ๊ฐํ์ง ์๊ณ ์์ ์ ์ธ ์์ธก ๊ฐ๋ฅ!
์ฐธ๊ณ ๋์ : ํผ์๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋ + ๋ฅ๋ฌ๋, ๋ฐํด์ , ํ๋น๋ฏธ๋์ด, 2020๋