๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๊ฒ ์ง๋ ํ์ต(supervisid learning)๊ณผ ๋น์ง๋ ํ์ต(unsupervised learning)์ผ๋ก ๋๋๋ค.
์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ด๋?
- ์ ๋ต(ํ๊น)์ด ์์ผ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ ๋ต์ ๋งํ๋ ๊ฒ์ ํ์ตํ๋ค.
- ํ๋ จํ๊ธฐ ์ํ ๋ฐ์ดํฐ์ ์ ๋ต์ด ํ์ํ๋ค.
๋น์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ด๋? (6์ฅ์์ ๋ค๋ฃธ)
- ํ๊น ์์ด ์
๋ ฅ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ๋ค.
- ๋ฐ๋ผ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋งํ ์ ์์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ ํ์
ํ๊ฑฐ๋ ๋ณํํ๋ ๋ฐ ๋์์ ์ค๋ค.
์ง๋ ํ์ต์์๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ(input), ์ ๋ต์ ํ๊น(target)์ด๋ผ๊ณ ํ๊ณ , ์ด ๋์ ํฉ์ณ ํ๋ จ ๋ฐ์ดํฐ(training data)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ ๋๋ก ํ๊ฐํ๋ ค๋ฉด ํ๋ จ ๋ฐ์ดํฐ์ ํ๊ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ๋ฌ๋ผ์ผ ํ๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ฑฐ๋ ์ด๋ฏธ ์ค๋น๋ ๋ฐ์ดํฐ ์ค์์ ์ผ๋ถ๋ฅผ ๋ผ์ด ๋ด์ด ํ์ฉํ๋ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์์ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ํ๊ฐ๋ฅผ ์ํด ํ
์คํธ ์ธํธ์ ํ๋ จ ์ธํธ๊ฐ ๋ฐ๋ก ์ค๋น๋์ด์ผ ํ๋ค.
- Test Set : ํ๊ฐ์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ
- Train Set : ํ๋ จ์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ
๊ตฌ๊ธ ์ฝ๋ฉ์ผ๋ก ๋จธ์ ๋ฌ๋ ์ค์ตํ๊ธฐ
1์ฅ์ ์ด์ด์ ๋๋ฏธ์ ๋น์ด๋ฅผ ์ด์ฉํด ์ค์ตํ๊ธฐ
1. ์์ ๋ฐ์ดํฐ ์ค๋น
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
์ด๋ ํ๋์ ์์ ๋ฐ์ดํฐ๋ฅผ Sample์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋๋ฏธ 35๋ง๋ฆฌ์ ๋น์ด 14๋ง๋ฆฌ๋ฅผ ํฉํด์ ์ด 49๊ฐ์ ์ํ์ด ๋ฐ์ดํฐ์ ๋ค์ด์๋ค. ์ฌ๊ธฐ์ 35๊ฐ๋ฅผ ํ๋ จ ์ธํธ๋ก, 14๊ฐ๋ฅผ ํ
์คํธ ์ธํธ๋ก ์ฌ์ฉํ๋ค.
โฃ zip() : ๋์ด๋ ๋ฆฌ์คํธ ๊ฐ๊ฐ์์ ์์๋ฅผ ํ๋์ฉ ๊บผ๋ด ๋ฐํํ๋ ํจ์๋ค.
2. ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ
k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ํด๋์ค๋ฅผ ์ํฌํธํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
์ ์ฒด ๋ฐ์ดํฐ์์ 35๊ฐ๋ฅผ ํ๋ จ ์ธํธ๋ก, 14๊ฐ๋ฅผ ํ
์คํธ ์ธํธ๋ก ๋๋ ์ผ ํ๋ค.
๋๋๊ธฐ ์ํด์๋ index๋ฅผ ์ฌ์ฉํ๋ค. -> ์์ : fish_data[4] - 3๋ฒ์งธ ์ํ์ด ์ถ๋ ฅ๋๋ค.
์ธ๋ฑ์ค ์ธ์๋ slicing์ด๋ผ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ธ๋ฑ์ค์์ ์ฐจ์ด๋ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ฌ๋ผ์ด์ฑ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ [์ธ๋ฑ์ค:์ธ๋ฑ์ค] -> fish_data[0:5] - 0๋ฒ์งธ~4๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง 5๊ฐ์ ์ํ์ด ์ถ๋ ฅ๋๋ค.
์ฌ๋ผ์ด์ฑ์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์์๋ ํฌํจ๋์ง ์๋๋ค๋ ๊ฒ์ ์ฃผ์ํ๋ค. ์ฒ์๊ณผ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ ์๋ตํด๋ ๋๋ค.
train_input = fish_data[:35] #ํ๋ จ ์ธํธ๋ก ์
๋ ฅ๊ฐ ์ค 0๋ถํฐ 34๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ์ฌ์ฉ
train_target = fish_target[:35] #ํ๋ จ ์ธํธ๋ก ํ๊น๊ฐ ์ค 0๋ถํฐ 34๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ์ฌ์ฉ
test_input = fish_data[35:] #ํ
์คํธ ์ธํธ๋ก ์
๋ ฅ๊ฐ ์ค 35๋ฒ์งธ๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ์ฌ์ฉ
test_target = fish_target[35:] #ํ
์คํธ ์ธํธ๋ก ํ๊น๊ฐ ์ค 35๋ฒ์งธ๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ์ฌ์ฉ
์ฌ๋ผ์ด์ฑ์ ์ด์ฉํด ํ๋ จ ์ธํธ 35๊ฐ์ ํ
์คํธ ์ธํธ 14๊ฐ๋ก ๋๋ด๋ค.
์ํ๋ ๋๋ก ๋๋ด์ผ๋ ๋ชจ๋ธ์ ํ๋ จํ๊ณ ํ๊ฐํด๋ณด์.
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
โฃ fit() : ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด ๊ท์น์ ํ์ตํ๋ ๊ณผ์ ์ ๋ปํ๋ ํ๋ จ ๋ฉ์๋์ด๋ค. ์ฆ, ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ก ์๊ณ ๋ฆฌ์ฆ์ ํ๋ จํจ.
โฃ score() : ๋ชจ๋ธ์ ํ๊ฐํ๋ ๋ฉ์๋๋ก, 0~1 ์ฌ์ด์ ๊ฐ์ ๋ฐํํ๋ค. 1์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ๋งํ๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ 0.0์ผ๋ก ์ ํ๋๊ฐ 0%์ด๋ค. ์ด๋ป๊ฒ ๋ ๊ฒ์ผ๊น?
์์์ ํ๋ จ ์ธํธ์ ๋๋ฏธ๋ง ํฌํจ์์ผฐ์ผ๋ฏ๋ก ๋น์ด ์์ด ๋ชจ๋ธ์ ํ๋ จํ๋ฉด ๋น์ฐํ๊ฒ ๋น์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฅํ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ๊ณจ๊ณ ๋ฃจ ์์ด๊ฒ ๋ง๋ค์ด์ผ ํ๋ค. ์ด์ฒ๋ผ ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ ์ํ์ด ๊ณจ๊ณ ๋ฃจ ์์ฌ ์์ง ์๊ณ ์ํ๋ง์ด ํ ์ชฝ์ผ๋ก ์น์ฐ์ณค๋ค๋ ๊ฒ์ Sampling Bias, ์ํ๋ง ํธํฅ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์๋ ์ง ์๋๋ฉด ๊ณจ๊ณ ๋ฃจ ์ํ์ ๋ฝ์์ ํ๋ จ ์ธํธ์ ๋ฐ์คํธ ์ธํธ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ฐ ์์
์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด numpy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ์ด : ํ์ด์ฌ์ ๋ํ์ ์ธ ๋ฐฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๊ณ ์ฐจ์์ ๋ฐฐ์ด์ ์์ฝ๊ฒ ๋ง๋ค๊ณ ์กฐ์ํ ์ ์๋ ๊ฐํธํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค.
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr.shape)
โฃ array() : ๋ํ์ด ํจ์์ ํ์ด์ฌ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฌํ๋ค. ์ฆ, ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ๋ค.
โฃ shape ์์ฑ : ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์๋ ค์ค๋ค. ์ด ๋ช
๋ น์ ์ฌ์ฉํ๋ฉด (์ํ ์, ํน์ฑ ์)๋ฅผ ์ถ๋ ฅํ๋ค. ์์ ๊ฒฐ๊ณผ๋ (49, 2)์ด๋ค.
์ด์ ๋ฐ์ดํฐ๋ฅผ ์์!
์ฃผ์ํ ์ ์ ์
๋ ฅ ๋ฐ์ดํฐ์ ํ๊น ๋ฐ์ดํฐ๊ฐ ๊ฐ์ด ์ ํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐฉ๋ฒ์ ์ธ๋ฑ์ค๋ฅผ ์์ ๋ค์ ์
๋ ฅ๊ณผ ํ๊น ๋ฐฐ์ด์์ ์ํ์ ์ ํํ๋ฉด ๋ฌด์์๋ก ํ๋ จ ์ธํธ๋ฅผ ๋๋๋ ์
์ด ๋๋ค.
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
print(index)
โฃ random.seed() : ๋ฌด์์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ํจ์๋ค์ ์คํํ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค. ์ผ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด๊ธฐ์ ๋๋ค์๋๋ฅผ ์ง์ ํ๋ค.
โฃ arange() : ํจ์์ ์ ์ N์ ์ ๋ฌํ๋ฉด 0์์๋ถํฐ N-1๊น์ง 1์ฉ ์ฆ๊ฐํ๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
โฃ shuffle() : ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ฌด์์๋ก ์๋๋ค.

์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋๋ ๋ณด์!
๋ํ์ด๋ ์ฌ๋ผ์ด์ฑ ์ธ์ Array Indexing์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. 1๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์๋ ์ฌ๋ฌ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์์๋ฅผ ์ ํํ ์ ์๋ค.
print(input_arr[[1,3]]) #2๋ฒ์งธ์ 4๋ฒ์งธ ์ํ์ ์ถ๋ ฅ
train_input = input_arr[index[:35]] #์ฒ์๋ถํฐ 35๊ฐ๋ฅผ ์ ํ
train_target = target_arr[index[:35]] #์ฒ์๋ถํฐ 35๊ฐ๋ฅผ ์ ํ
๋๋คํ๊ฒ ์์ ์ธ๋ฑ์ค์์ 35๊ฐ์ ์ํ์ ์ ํํด ํ๋ จ ์ธํธ๋ก ๋ง๋ค์๋ค.
print(input_arr[13], train_input[0])
train_input์ ์ฒซ ๋ฒ์งธ ์์๋ input_arr์ ์ด ๋ค ๋ฒ์งธ ์์๊ฐ ๋ค์ด ์๋ค.
๋๋จธ์ง ํ
์คํธ ์ธํธ๋ ๋ง๋ค์ด๋ณด์!
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
์ด์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ค. ๊ทธ๋ผ ์ฐ์ ๋๋ก ํ์ธํด๋ณด์.
3. ์ฐ์ ๋๋ก ํ์ธ
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()
โป 2์ฐจ์ ๋ฐฐ์ด์ ํ๊ณผ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฝค๋ง๋ก ๋๋์ด ์ง์ ํ๋ค.

ํ๋์์ ํ๋ จ ์ธํธ, ์ฃผํฉ์์ ํ
์คํธ ์ธํธ์ด๋ค. ์๋ํ ๋๋ก ์ ์์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
4. k-Nearest Neighbors ๋ชจ๋ธ์ ํ๋ จ์์ผ ํ๊ฐํ๊ธฐ
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
๊ฒฐ๊ณผ๋ 1.0์ด๋ค. ํ
์คํธ ์ธํธ์ ์๋ ๋ชจ๋ ์์ฑ์ ๋งํ๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ผ ์ด์ ํ
์คํธ ์ธํธ์ ์์ธก ๊ฒฐ๊ณผ์ ์ค์ ํ๊น์ ํ์ธํด๋ณด์!
kn.predict(test_input)
test_target #๊ตฌ๊ธ ์ฝ๋ฉ์ ๋ง์ง๋ง ์ฝ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ์ถ๋ ฅํด์ค์ print()ํจ์๋ฅผ ์ฌ์ฉ ์ ํจ
โฃ predict() : ์๋ก์ด ๋ฐ์ดํฐ์ ์ ๋ต์ ์์ธกํ๋ ๋ฉ์๋์ด๋ค. 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.

ํ ์คํธ ์ธํธ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๊ฐ ์ ๋ต๊ณผ ์ผ์นํ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฌธ์ ์
๊ทธ๋ฌ๋ ์์ ๋ชจ๋ธ์์ ๊ธธ์ด๊ฐ 25cm, ๋ฌด๊ฒ๊ฐ 150g์ธ ๋๋ฏธ๋ฅผ ๋ฃ์ด๋ณด๋ฉด ๋น์ด๋ผ๊ณ ์์ธกํ๋ค. ๋ชจ๋ธ์ ๋ค์ ํ์ธํด๋ณด์.
1. ๋๋ฏธ์ ๋น์ด ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
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๊ฐ์ ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ ๋ค. ์ฐ๊ฒฐํ 2๊ฐ์ ๋ฆฌ์คํธ๋ ํ์ด์ฌ ํํ๋ก ์ ๋ฌํ๋ค.
โป ํ์ด์ฌ ํํ์ ๋ฆฌ์คํธ์ ๋งค์ฐ ๋น์ทํ๋ฐ, ์ฐจ์ด์ ์ ํ ๋ฒ ๋ง๋ค์ด์ง ํํ์ ์์ ํ ์ ์๋ค.
fish_data = np.column_stack((fish_length, fish_weight))
print(fish_data[:5]) #2๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์ ์ฐ๊ฒฐ๋์๋์ง 5๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธ
โฃ column_stack() : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ผ๋ ฌ๋ก ์ธ์ด ํ ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐํ๋ ๋ํ์ด ํจ์์ด๋ค.

๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํ๊น ๋ฐ์ดํฐ๋ ๋ง๋ ๋ค. ์์์๋ ์ฌ๋ฌ ๋ฒ ๊ณฑํด์ ๋ง๋ค์์ง๋ง, ๋ํ์ด๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๋ค.
โป ๋ฐ์ดํฐ๊ฐ ํด์๋ก ํ์ด์ฌ ๋ฆฌ์คํธ๋ณด๋ค๋ ๋ํ์ด ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ ํจ์จ์ ์ด๋ค.
fish_target = np.concatenate((np.ones(35),np.zeros(14)))
print(fish_target)
โฃ ones(), zeros() : ๊ฐ๊ฐ ์ํ๋ ๊ฐ์์ 1๊ณผ 0์ ์ฑ์ด ๋ฐฐ์ด์ ๋ง๋ ๋ค.
โฃ concatenate() : ์ฒซ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ฐ๊ฒฐํ๋ ํจ์๋ค.
โป concatenate() vs column_stack() : ๋ฐฐ์ด์ด ์์ฑ๋ ๋ ์ฐจ์์ ์ฐจ์ด๊ฐ ์๋ค.

2. ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ ๋๋๊ธฐ
์์์๋ ๋ํ์ด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ์์ด์ ๋๋์์ง๋ง, ์ฌ์ดํท๋ฐ์์ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์ ๊ณต๋๋ค. ์๊ณ ๋ฆฌ์ฆ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ์ ํธ๋ฆฌํฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์ค๋ค.
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target=train_test_split(fish_data,fish_target,random_state=42)
print(train_input.shape, test_input.shape)
print(train_target.shape, test_target.shape)
โฃ shape : ๋ํ์ด ๋ฐฐ์ด์ ์์ฑ์ผ๋ก ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
โฃ train_test_split() : ์ ๋ฌ๋๋ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ๋น์จ์ ๋ง๊ฒ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋์ด ์ฃผ๋ ํจ์๋ค. ๋๋๊ธฐ ์ ์ ์์์ ์์ด ์ค๋ค. ๋๋๊ณ ์ถ์ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์ํ๋ ๋งํผ ์ ๋ฌํ๋ฉด ๋๋ค. ์ด ํจ์ ๋ด์ ์์ฒด์ ์ผ๋ก ๋๋ค ์๋๋ฅผ ์ง์ ํ ์ ์๋ random_state ๋งค๊ฐ๋ณ์๊ฐ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 25%๋ฅผ ํ ์คํธ ์ธํธ๋ก ๋ผ์ด ๋ธ๋ค.

๋๋ฏธ์ ๋น์ด๊ฐ ์ ์์๋์ง ํ์ธํด๋ณด์.
print(test_target)

13๊ฐ์ ํ ์คํธ ์ธํธ ์ค 10๊ฐ ๋๋ฏธ, 3๊ฐ๊ฐ ๋น์ด๋ค. ๊ทธ๋ฌ๋ ์๋ ๋ ์์ ์ ๋น์จ์ด 2.5:1์ธ๋ฐ, ์์ ๊ฒฐ๊ณผ๋ 3.3:1๋ก ๋น์ด์ ๋น์จ์ด ๋ชจ์๋ผ๋ค. ์ํ๋ง ํธํฅ์ด ๋ํ๋ฌ๋ค. ์ํ๋ง ํธํฅ์ด ์ผ์ด๋๋ฉด ๋ชจ๋ธ์ด ์ผ๋ถ ์ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ตํ ์ ์๋ ๋ฌธ์ ์ ์ด ์๊ธด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๋๋๋ก ํด์ผ ํ๋ค.
train_input, test_input, train_target, test_target =
train_test_split(fish_data, fish_target, stratify=fish_target,random_state=42)
print(test_target)
โฃ stratify : ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๋งค๊ฐ๋ณ์์ด๋ค. ํ๋ จ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ํน์ ํด๋์ค์ ์ํ ๊ฐ์๊ฐ ์ ์ ๋ ์ ์ฉํ๋ค.

๊ทธ ๊ฒฐ๊ณผ ํ ์คํธ ์ธํธ์ ๋น์จ์ด 2.25:1์ด ๋๋ค. ๋น์จ์ ๋์ผํ๊ฒ ๋ง์ถ ์ ์์ง๋ง ๊ทผ์ ํ ๋น์จ์ด ๋๋ค.
3. k-Nearest Neighbors ๋ชจ๋ธ์ ํ๋ จ์์ผ ํ๊ฐํ๊ธฐ
โป k-์ต๊ทผ์ ์ด์์ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ํ๋ จ์ ์ ๋ถ๋ค.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
๊ฒฐ๊ณผ๋ 1.0์ผ๋ก, ํ
์คํธ ์ธํธ์ ๋๋ฏธ์ ๋น์ด๋ฅผ ์๋ฒฝํ๊ฒ ๋ถ๋ฅํ๋ค.
์ด์ ์ฒ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ ์๋ก์ด ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์.
print(kn.predict([[25,150]]))
๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ [0.]์ด ์ถ๋ ฅ๋๋ค. ์๋๋ 1์ด ๋์์ผ ์ ์์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋์ ๋ฌธ์ ๊ฐ ์๊ธด๊ฑด์ง ์ฐ์ ๋๋ก ํ์ธํด๋ณด์.
import matplotlib.pyplot as plt
distances, indexes = kn.kneighbors([[25,150]])
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๊ฐ์ ์ํ์ด๋ค. ์ง๊ด์ ์ผ๋ก ๋ดค์ ๋ 1๊ฐ๋ ๋๋ฏธ์ ๋ฐ์ดํฐ์ ๋ ๊ฐ๊น๋ค. ๊ทธ๋ฌ๋ ๋๋จธ์ง ์ํ 4๊ฐ๋ ๋ชจ๋ ๋น์ด๋ก ํ์๋๋ค. ํ์คํ๊ฒ ์๊ธฐ ์ํด ๊ฑฐ๋ฆฌ๋ฅผ ํ์ธํด๋ณด์.
print(distances)
โฃ distances : ์ด์ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๋ด๊ฒจ ์๋ ๋ฐฐ์ด์ด๋ค. ์์์ kneighbors()๋ฉ์๋์ ๋ฐํํ๋ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒ์งธ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ 92์ด๊ณ , ๋๋จธ์ง 4๊ฐ๋ ๊ทธ๊ฒ๋ณด๋ค ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ผ ์ง๊ด์ ์ผ๋ก ๋ดค์ ๋ ์ ์์ด๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์๋ค. ๊ฑฐ๋ฆฌ ๋น์จ์ด ์ด์ํ ๊ฑธ ๋ณผ ์ ์๋ค. ์ด์ ๋ ๋ฌด๊ฒ์ ๊ธธ์ด ๋น์จ์ด ์ฒ์๋ถํฐ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. x์ถ์ ๋ฒ์๊ฐ ์ข๊ณ , ๊ทธ์ ๋นํด 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()
โฃ xlim(), ylim() : x์ถ๊ณผ y์ถ ๋น์จ์ ์ง์ ํ ์ ์๋ ํจ์๋ค.

๊ทธ ๊ฒฐ๊ณผ, ์ฐ์ ๋๊ฐ ์์ง์ ์ผ๋ก ๋ํ๋ฌ๋ค. ์ด์ฒ๋ผ ๋ ํน์ฑ(๊ธธ์ด,๋ฌด๊ฒ)์ ๊ฐ์ด ๋์ธ ๋ฒ์๊ฐ ๋ค๋ฅธ๋ฐ, ์ด๋ฅผ ๋ ํน์ฑ์ ์ค์ผ์ผ(scale)์ด ๋ค๋ฅด๋ค๊ณ ๋ ๋งํ๋ค. ๋ฐ๋ผ์ ํน์ฑ๊ฐ์ ์ผ์ ํ ๊ธฐ์ค์ผ๋ก ๋ง์ถฐ ์ค์ผ ํ๋๋ฐ ์ด๋ฅผ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(data processing)๋ผ๊ณ ํ๋ค.
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉํ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ ์ค ํ๋๋ ํ์ค์ ์์ด๋ค.(z ์ ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.) ํ์ค์ ์๋ ๊ฐ ํน์ฑ๊ฐ์ด ํ๊ท ์์ ํ์คํธ์ฐจ์ ๋ช ๋ฐฐ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋ธ๋ค. ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ฅผ ๋๋๋ค.
โ ๋ถ์ฐ์ ๋ฐ์ดํฐ์์ ํ๊ท ์ ๋บ ๊ฐ์ ๋ชจ๋ ์ ๊ณฑํ ๋ค์ ํ๊ท ์ ๋ด์ด ๊ตฌํ๋ค.
โ ํ์คํธ์ฐจ๋ ๋ถ์ฐ์ ์ ๊ณฑ๊ทผ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋ ์ ๋๋ฅผ ๋ํ๋ธ๋ค.
โ ํ์ค์ ์๋ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ ์์ ๋ช ํ์คํธ์ฐจ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis=0)
โฃ mean() : ํ๊ท ์ ๊ณ์ฐํ๋ ํจ์๋ก, ๋ํ์ด์์ ์ ๊ณตํ๋ค.
โฃ std() : ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ก, ๋ํ์ด์์ ์ ๊ณตํ๋ค.
ํน์ฑ๋ง๋ค ๊ฐ์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ฏ๋ก ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ ๊ฐ ํน์ฑ๋ณ๋ก ๊ณ์ฐํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด axis = 0์ผ๋ก ์ง์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ํ์ ๋ฐ๋ผ ๊ฐ ์ด์ ํต๊ณ ๊ฐ์ ๊ณ์ฐํ๊ฒ ๋๋ค.
๊ฐ ํน์ฑ๋ง๋ค ํ๊ท ์ [ 27.29722222 454.09722222]์ด๊ณ , ํ์คํธ์ฐจ๋ [ 9.98244253 323.29893931]์ด๋ค.
์ด์ ์๋ณธ ๋ฐ์ดํฐ์์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋ ํ์ค์ ์๋ก ๋ณํํด๋ณด์.
train_scaled = (train_input - mean) / std
๋ํ์ด๋ ์๋ณธ ๋ฐ์ดํฐ์ ๋ชจ๋ ํ์์ ๋ ํ๊ท ๊ฐ์ ๋นผ์ฃผ๊ณ , ๋ ํ์คํธ์ฐจ๋ฅผ ๋ค์ ๋ชจ๋ ํ์ ์ ์ฉํ๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ ๋ธ๋ก๋์บ์คํ
์ด๋ผ๊ณ ํ๋ค.
broadcasting : ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ชจ์์ด ๋ค๋ฅธ ๋ฐฐ์ด ๊ฐ์ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํด ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
4. ์ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ๋ จํ๊ธฐ
ํ์ค์ ์๋ก ๋ณํํ์ผ๋ ์ํ์ ๋ค์ ์ฐ์ ๋๋ก ๊ทธ๋ ค๋ณด์!
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()
โป new = ([25,150]- mean)/std ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ด์ ๋ x์ถ๊ณผ y์ถ ๋ฒ์๋ฅผ ๋์ผํ๊ฒ ๋ง์ถ๊ธฐ ์ํด์์ด๋ค.

kn.fit(train_scaled, train_target)
test_scaled = (test_input - mean)/std
kn.score(test_scaled, test_target)
print(kn.predict([new]))
๋ชจ๋ธ์ ํ๊ฐ ๊ฒฐ๊ณผ๋ 1์ด๊ณ , ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ํ
์คํธํ ๊ฒฐ๊ณผ 1์ด ๋์ถ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฐ์ ๋๋ฅผ ๊ทธ๋ ค๋ณด์.
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()

๊ทธ ๊ฒฐ๊ณผ, ๋๋ฏธ ์ํ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด 5๊ฐ ์ํ์ด ๋ชจ๋ ๋๋ฏธ์ด๋ค. ์ด์ฒ๋ผ ์ค์ผ์ผ์ด ๋ค๋ฅธ ํน์ฑ์ ์ ์ฒ๋ฆฌํด์ผ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋์ถํ ์ ์๋ค.
'๐ฌ Explore > ๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 3์ฅ ํ๊ท ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ชจ๋ธ ๊ท์ (0) | 2022.08.13 |
|---|---|
| 1์ฅ ๋จธ์ ๋ฌ๋์ด๋? (0) | 2022.07.08 |