๋ฐ์ํ
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋?
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ์ฝ๊ฒ ๋งํ์๋ฉด ๋ชจ๋ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ๊ธฐ ์ ์, ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ ์ข๊ฒ ๊ฐ๊ณตํ๋ ๋จ๊ณ๋ฅผ ๋งํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๊ธฐ ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
Numpy๋ก Data ์ค๋นํ๊ธฐ
- ํ๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ค๋น ํด๋ณด๊ฒ ์ต๋๋ค. ์ ์ ์ฌ์ฉํ๋ ๋๋ฏธ, ๋น์ด ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด ๋ณด์์ต๋๋ค.
# ์์ ์ ๊ธธ์ด
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
fish_data = np.column_stack((fish_length, fish_weight))
์ฌ๊ธฐ์ column_stack() ํจ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค. Numpy์ column_stack() ํจ์๋ ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ผ๋ ฌ๋ก ์ธ์ด ๋ค์ ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐํฉ๋๋ค. ํ๋ฒ ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ 2๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๋๋ํ ๋ถ์ฌ์ ํํ(tuple)ํํ๋ก ์ ๋ฌํฉ๋๋ค.
np.column_stack(([1,2,3], [4,5,6]))
array([[1, 4],
[2, 5],
[3, 6]])
- ์ด๋ ๊ฒ ํ๋ฒ fish_length์ fish_weight๋ฅผ ํฉ์ณ๋ณด๊ฒ ์ต๋๋ค. ๋ฐฉ๋ฒ์ ๋์ผํฉ๋๋ค.
# column_stack: ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ผ๋ ฌ๋ก ์ธ์ด ํ, ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐ
fish_data = np.column_stack((fish_length, fish_weight))
print(fish_data[:5])
- ์ดํํด ๋ณด์ จ์ผ๋ฉด ์์๊ฒ ์ง๋ง, Numpy ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ฉด ๋ฆฌ์คํธ์ฒ๋ผ, ํ์ค๋ก ๊ธธ๊ฒ ์ถ๋ ฅ๋์ง ์๊ณ , ํ๊ณผ ์ด์ ๋ง์ถ์ด์ ๊ฐ์ง๋ฐํ ๋ชจ์ต์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
- ์ ์๋ ์์๊ฐ ํ๋์ธ list [1], [0]์ ์ฌ๋ฌ๋ฒ ๊ณฑํด์ Target Data๋ฅผ ๋ง๋ค์๋๋ฐ, Numpy์๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก np.ones() ์ np.zeros() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ ํจ์๋ ๊ฐ๊ฐ ์ํ๋ ๊ฐ์์ 1๊ณผ 0์ ์ฑ์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
print(np.ones(5))
# [1,1,1,1,1]
- ์ด๋ ๊ฒ, ๋ํจ์๋ฅผ ์ฌ์ฉํด 1์ด 35์ธ ๋ฐฐ์ด๊ณผ 0์ด 14์ธ ๋ฐฐ์ด์ ๋ง๋ค์ ์์ต๋๋ค. ์ด์ ์ด ๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ฐ๊ฒฐํ๋ฉด ๋๋๋ฐ, ์ฒซ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ฐ๊ฒฐํ๋ np.concatenate()ํจ์๋ฅผ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
์ด์ , np.concatenate()ํจ์๋ฅผ ์ฌ์ฉํด์ Target data๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐ๊ฒฐํ list๋ array๋ ํํ๋ก ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
# target data ๋ง๋ค๊ธฐ: concatenate ํจ์๋ฅผ ์ด์ฉํ์ฌ 2๊ฐ์ ๋ฐฐ์ด์ ํ๋๋ก ๊ฒฐํฉ
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
print(fish_target)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
- ์ด ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๋ณด์ด์ง๋ ์์ง๋ง, ๋ง์ฝ์ ๋ฐ์ดํฐ๊ฐ ํฐ ๊ฒฝ์ฐ๋ Python list๋ก ์์ ํ๋๊ฑด ๋นํจ์จ์ ์ ๋๋ค. ์ด๋์ Numpy ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Scikit-learn์ผ๋ก Training_set์ Test_set ๋๋๊ธฐ
- ์ ์๋ Numpy ๋ฐฐ์ด์ index๋ฅผ ์ง์ญ ์์ด์ training_set, test_set๋ฅผ ๋๋์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋ฒ๊ฑฐ๋ฌ์ฐ๋ฏ๋ก, ์ข ๋ ์ธ๋ จ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
- Scikit-learn์ ๋จธ์ ๋ฌ๋(ML) ๋ชจ๋ธ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฟ๋ง ์๋๋ผ, ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ์ ์ผ๋ก ์ด์ ์ฌ์ฉํด ๋ณผ train_test_split()ํจ์ ์ ๋๋ค. ์ด ํจ์๋ ์ ๋ฌ๋๋ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ๋น์จ์ ๋ง์ถฐ์ training_set์ test_set๋ก ๋๋์ด ์ค๋๋ค.
# scikit_learn์ผ๋ก data ๋๋๊ธฐ
# fish_data, fish_target data ๋ฅผ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋ถํ
from sklearn.model_selection import train_test_split
# stratify=fish_target: ๋ถํ ์ ํด๋์ค์ ๋น์จ์ ์ ์ง(๋ถ๋ฅ ์์
์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ)
# random_state=42: ๋๋ค์ฑ์ ์ ์ด (๋ฐ์ดํฐ ๋ถํ ์ด ๋์ผํ๊ฒ ์ ์ง)
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)
- ํ๋ฒ Numpy ๋ฐฐ์ด์ shape ์์ฑ์ ์ด์ฉํด์ ์ ๋ ฅ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
print(train_input.shape, test_input.shape)
# (36,2) (13,2)
print(train_target.shape, test_target.shape)
# (36.) (13.)
- ๋ณด๋๊น, ์ด์ ์ ๋ณธ ์ํ๋ง ํธํฅ์ด ์กฐ๊ธ ๋ํ๋ฌ์ต๋๋ค.
- ์ด๋ ๊ฒ ๋ฌด์์๋ก ๋๋์์ ๋, sample์ด ๊ณจ๊ณ ๋ฃจ ์์ด์ง ์์ ์ ์์ต๋๋ค. ํนํ, ์ผ๋ถ ํด๋์ค์ ๊ฐ์๊ฐ ์ ์ ๋, ์ฃผ๋ก ์ด๋ฐ์ผ์ด ์๊น๋๋ค.
- Training_set์ Test_set์ ํด๋์ค ๋น์จ์ด ์ผ์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ธ์ด ์ผ๋ถ ์ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ตํ ์ ์์ต๋๋ค.
- ์ด๋ด๋, stratify ๋งค๊ฐ๋ณ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๋์ ์์ต๋๋ค. ํ๋ฒ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
์์ํ ๋๋ฏธ ํ๋ง๋ฆฌ
- ์์์ ์ค๋นํ ๋ฐ์ดํฐ๋ก K-์ต๊ทผ์ ์ด์์ ํ๋ จํด ๋ณด๊ฒ ์ต๋๋ค. ํ๋ จ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ๋ จํ๊ณ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
# ์์ํ ๋๋ฏธ ์ฐพ๊ธฐ ์์
# k-์ต๊ทผ์ ์ด์
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
- ํ๋ จ์ ์ํค๊ณ , ๋๋ฏธ ๋ฐ์ดํฐ(1)๋ฅผ ๋ฃ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉด ๋น์ฐํ ๋๋ฏธ(1)์ด ๋์์ผ ํฉ๋๋ค. ๊ทผ๋ฐ..?
print(kn.predict([[25, 150]]))
# ๋๋ฏธ ์ฐพ์์ผ ํ๋๋ฐ ๋น์ด๊ฐ ๋์ด(0)
- ํ์ง๋ง, ๋น์ด ๋ฐ์ดํฐ(0)์ด ๋์ต๋๋ค.
๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ์์ ๋ณด๊ธฐ ์ํด์ ํ๋ฒ ์ฐ์ ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^') # marker ๋งค๊ฐ๋ณ์๋ ๋ชจ์์ ์ง์ ํฉ๋๋ค.
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
- ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด, ์ด sample์ ๋ถ๋ช ํ ์ค๋ฅธ์ชฝ ์๋ก ๋ป์ด ์๋ ๋ค๋ฅธ ๋๋ฏธ ๋ฐ์ดํฐ์ ๋ ๊ฐ๊น์ด๊ฑธ ๋ณผ ์ ์์ต๋๋ค. ์ ๊ทธ๋ ๊ฒ ํ๋จ ํ์๊น์?
- K-์ต๊ทผ์ ์ด์์ ์ฃผ๋ณ์ Sample์ค ๋ค์์ธ ํด๋์ค๋ฅผ ์์ธก์ผ๋ก ์ฌ์ฉํฉ๋๋ค. KNeighborsClassifier ํด๋์ค๋ ์ฃผ์ด์ง ์ํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ์ฐพ์ ์ฃผ๋ kneighbors() Method๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด Method๋ ์ด์๊น์ง์ ๊ฑฐ๋ฆฌ์ ์ด์ Sample์ index๋ก ๋ฐํํฉ๋๋ค.
์ด์ , indexes ๋ฐฐ์ด์ ์ฌ์ฉํด ์ด์(Neighbors)์ํ์ ๋ฐ๋ก ๊ตฌ๋ถํด์ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
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') #indexes: ๋ฐฐ์ด indexing
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
๊ธฐ์ค์ ๋ง์ถฐ๋ผ
- ํ๋ฒ ๊ทธ๋ํ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด, ๊ฑฐ๋ฆฌ์์ผ๋ก ๋๋ฏธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ์ 92์ด๊ณ , ๊ทธ์ธ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ๋ค์ ๋ชจ๋ 130, 138์ ๋๋ค. ๊ทผ๋ฐ ์ฝ๊ฐ ๊ฑฐ๋ฆฌ์ ๋น์จ์ด ์ด์ํ์ง ์๋์?
- ์ด์ ๋ x์ถ์ ๋ฒ์๊ฐ ์ข๊ณ (10~40), y์ถ์ ๋ฒ์๊ฐ ๋์ต๋๋ค(0~1000). ๊ทธ๋๊น y์ถ์ผ๋ก ์กฐ๊ธ๋ง ๋ฉ์ด์ ธ๋ ๊ฑฐ๋ฆฌ๊ฐ ์์ฃผ ํฐ ๊ฐ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
- ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด์, x์ถ์ ๋ฒ์๋ฅผ ๋์ผํ๊ฒ 0~1000์ผ๋ก ๋ง์ถ์ด์ ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ค๋ฉด x์ถ ๋ฒ์๋ฅผ ์ง์ ์ ํด์ผ ํ๋๋ฐ, xlim() ํจ์๋ฅผ ์ด์ฉํด์ ํ ์ ์์ต๋๋ค.
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') #indexes: ๋ฐฐ์ด indexing
plt.xlim((0,1000)) # ์ถ์ ๋ฒ์(scale)๋ฅผ ์ง์ ํ ์ ์๋ method
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
# answer: ๋ฌด๊ฒ๊ฐ ์์ ์ ๊ตฌ๋ถํ๋๋ฐ ํฐ ์ํฅ์ ๋ฏธ์นจ, ๊ธธ์ด๋ ๊ฑฐ์ด ๋ฏธ์น๋ ์ํฅ ์์.
# k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฃผ๋ณ sample์ ์ฐพ๊ธฐ ๋๋ฌธ์, ํน์ฑ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ค๋ฅด๋ฉด ๋ฌธ์ ๊ฐ ๋ ์๋. -> ๋ ์ํ์ scale์ ๋ง์ถฐ์ค์ผ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ์์ผํจ.
- ์ฐ์ ๋๊ฐ ๊ฑฐ์ด ์ผ์ง์ ์ผ๋ก ๋ํ๋๋๋ฐ, x์ถ๊ณผ y์ถ์ ๋ฒ์๋ฅผ ๋์ผํ๊ฒ ๋ง์ถ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌ๋ฉด y์ถ(์์ ์ ๋ฌด๊ฒ)๋ง ๊ณ ๋ ค ๋์์ด ๋ฉ๋๋ค.
- ๋ ํน์ฑ(๊ธธ์ด์ ๋ฌด๊ฒ)์ ๊ฐ์ด ๋์ธ ๋ฒ์๊ฐ ๋งค์ฐ ๋ค๋ฅผ๋, ์ด๋ฅผ ๋ ํน์ฑ์ ์ค์ผ์ผ(scale)์ด ๋ค๋ฅด๋ค๊ณ ํฉ๋๋ค.
- ์ด๊ฑด, ์๊ณ ๋ฆฌ์ฆ์ด ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ผ๋, ํนํ ๊ทธ๋ ์ต๋๋ค. ์ฌ๊ธฐ์ K-์ต๊ทผ์ ์ด์๋ ํฌํจ๋ฉ๋๋ค. ์ด๋ฐ ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ํ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ์ํฅ์ ๋ง์ด ๋ฐ์ผ๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ํน์ฑ๊ฐ์ ์ผ์ ํ ๊ธฐ์ค์ผ๋ก ๋ง์ถฐ์ค์ผ ํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ค ํ๋๋ ํ์ค์ ์(Standard Score, ํน์ z ์ ์)๋ผ๊ณ ํ๊ณ , ๊ฐ ํน์ฑ๊ฐ์ด ํ๊ท ์์ ํ์คํธ์ฐจ์ ๋ช ๋ฐฐ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋ ๋๋ค.
- ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ฅผ ๋๋์ด ์ฃผ๋ฉด ๋ฉ๋๋ค. Numpy๋ ํธ๋ฆฌํ๊ฒ ์ด ๋ ํจ์๋ฅผ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค.
# ํ์ค ์ ์๋ก ๋ด๊พธ๋๊ฒ -> ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฐ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
# axis = 0: ์ด๊ฑด ํน์ฑ๋ง๋ค ๊ฐ์ scale์ด ๋ค๋ฅด๋ฏ๋ก, ํ๊ท & ํ์คํธ์ฐจ๋ ๊ฐ ํน์ฑ๋ณ๋ก ๊ณ์ฐ & ์ฐ์ฐ์ด ๊ฐ ์ด์ ๋ํด ์ํ๋์ด์ผ ํจ
# mean: ํ๊ท , std: ํ์คํธ์ฐจ
mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)
- ์ด๋ ๊ฒ ํ๋ฉด, ํ์ ๋ฐ๋ผ ๊ฐ ์ด์ ํต๊ณ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
- ํ๊ท ๊ณผ ํ์ค ํธ์ฐจ๋ฅผ ๊ณ์ฐํ๊ณ , ์๋ณธ ๋ฐ์ดํฐ์์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋์ด์ ํ์ค ์ ์๋ก ๋ฐํ ํ๊ฒ ์ต๋๋ค.
train_scaled = (train_input - mean) / std # ํ์ค ํธ์ฐจ๋ก ๋ฐํ
- ๊ทผ๋ฐ, ์ด ์์ ์ด๋ป๊ฒ ๊ณ์ฐ์ด ๋๋ ๊ฒ์ผ๊น์? ์ด๋ฌํ Numpy์ ๊ธฐ๋ฅ์ Broadcasting(๋ธ๋ก๋์บ์คํ )์ด๋ผ๊ณ ํฉ๋๋ค.
์์ฝํ๋ฉด, ๋ฐฐ์ด ์ฐ์ฐ์ ์ํํ ๋ ๋ฐ์ํ๋ ํน๋ณํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๊ฒ์ ์๋ก ๋ค๋ฅธ shape์ ๋ฐฐ์ด ๊ฐ์ ์ฐ์ฐ์ ์ํํ ๋ ์๋์ผ๋ก ์์ ๋ฐฐ์ด์ ํฐ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋ง์ถฐ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ train_input์ ๋ชจ๋ ํ์์ ํ๊ท (mean)์ ์๋ ๋ ํ๊ท ๊ฐ์ ๋นผ๊ณ ํ์คํธ์ฐจ(std)์ ์๋ ๋ ํ์คํธ์ฐจ๋ฅผ ๋ค์ ๋ชจ๋ ํ์ ์ ์ฉ์ํค๋ ๋ฐฉ์์ ๋๋ค.
์ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ๋ จํ๊ธฐ
- ์์์ ํ์ค์ ์๋ก ๋ณํํ train_scaled๋ฅผ ๋ง๋ค์์ผ๋ฏ๋ก, ํ๋ฒ ๋ค์ ์ฐ์ ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
# Numpy Broadcasting
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 ์ฌ์ด๋ก ๋ด๋์๋ค๋ ๊ฒ์ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ , ํ๋ จ ๋ฐ์ดํฐ์ ๋ ํน์ฑ์ด ๋น์ทํ ๋ฒ์๋ฅผ ์ฐจ์งํ๊ณ ์๋ค๋๊ฒ์ด ํน์ง์ ๋๋ค. ์ด์ , ๋ค์ ์ด Dataset์ผ๋ก K-์ต๊ทผ์ ์ด์ ๋ชจ๋ธ์ ๋ค์ ํ๋ จ์ ์ํค๊ณ ๋ชจ๋ธ์ ํ๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
kn.fit(train_scaled, train_target)
test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)
# ๊ฒฐ๊ณผ๊ฐ: 1.0
- ์ด๋ ๊ฒ ๋ชจ๋ ํ ์คํธ ์ธํธ์ ์ํ์ ์๋ฒฝํ๊ฒ ๋ถ๋ฅํ๊ณ , ์ ํ๋๊ฐ 1.0 (100%)๊ฐ ๋์์ต๋๋ค.
- ํ๋ฒ ์ํ์ ์ฌ์ฉํด์ ๋ชจ๋ธ์ ์์ธก์ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
print(kn.predict([new]))
# [1.]
- 1์ด ๋์ค๋ฉด ๋๋ฏธ(1)๋ก ์์ธกํ์ต๋๋ค. ํ์คํ ๊ธธ์ด๊ฐ 25cm์ด๊ณ ๋ฌด๊ฒ๊ฐ 150g์ธ ์์ ์ ๋๋ฏธ์ผ ๊ฒ์ ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก kneighbors() ํจ์๋ก ํจ์์ k-์ต๊ทผ์ ์ด์์ ๊ตฌํ ๋ค์, ์ฐ์ ๋ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
- ํน์ฑ์ ํ์ค์ ์ํ ํ๊ธฐ ๋๋ฌธ์ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ์ ๊ฒ์ ๋๋ค.
# sample์์ ๊ฐ์ฅ ๊ฐ๊น์ด๊ฑด ๋๋ฏธ
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()
Keywords
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ๊ธฐ ์ ์ ๊ฐ๊ณตํ๋ ๋จ๊ณ๋ฅผ ๋งํฉ๋๋ค. ๋๋ก ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ์ ๋ง์ ์๊ฐ์ด ์๋ชจ๋๊ธฐ๋ ํฉ๋๋ค.
ํ์ค์ ์
- Training_set์ ์ค์ผ์ผ์ ๋ด๊พธ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ค ํ๋์ ๋๋ค. ํ์ค์ ์๋ฅผ ์ป์ผ๋ ค๋ฉด, ํน์ฑ์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋๋๋ค. ๋ฐ๋์ ํ๋ จ์ธํธ์ ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ก ํ ์คํธ ์ธํธ๋ฅผ ๋ด๊ฟ์ผ ํฉ๋๋ค.
๋ธ๋ก๋์บ์คํ
- ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ํ์ด ๋ฐฐ์ด์์ ์๋์ผ๋ก ์ฌ์น ์ฐ์ฐ์ ๋ชจ๋ ํ์ด๋ ์ด๋ก ํ์ฅํ์ฌ ์ํํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
ํต์ฌ ํจํค์ง์ ํจ์
Scikit-learn
- train_test_split()์ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋๋ ํ์์ ๋๋ค. ์ฌ๋ฌ ๊ฐ ์ ๋ฐฐ์ด์ ์ ๋ฌํ ์ ์์ต๋๋ค. ํ ์คํธ ์ธํธ๋ก ๋๋ ๋น์จ์ test_size ๋งค๊ฐ๋ณ์์์ ์ง์ ํ ์ ์์ผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ 0.25(25%)์ ๋๋ค.
- shuffle ๋งค๊ฐ๋ณ์๋ก ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋๊ธฐ ์ ์ ๋ฌด์์๋ก ์์์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ True์ ๋๋ค. stratify ๋งค๊ฐ๋ณ์์ ํด๋์ค ๋ ์ด๋ธ์ด ๋ด๊ธด ๋ฐฐ์ด(์ผ๋ฐ์ ์ผ๋ก ํ๊น ๋ฐ์ดํฐ)์ ์ ๋ฌํ๋ฉด ํด๋์ค ๋น์จ์ ๋ง๊ฒ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ฅผ ๋๋ก๋๋ค.
- kneighbors()๋ k-์ต๊ทผ์ ์ด์ ๊ฐ์ฒด์ ๋ฉ์๋์ ๋๋ค. ์ด ๋ฉ์๋๋ ์ ๋ ฅํ ๋ฐ์ดํฐ์ ๊ฐ ์ฅ ๊ฐ๊น์ด ์ด์์ ์ฐพ์ ๊ฑฐ๋ฆฌ์ ์ด์ ์ํ์ ์ธํ ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์์ ๊ฐ์ ๋ KNeighborsClassifier ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ง์ ํ ๊ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง n_neighbors ๋งค๊ฐ๋ณ์์์ ๋ค๋ฅด๊ฒ ์ง์ ํ ์๋ ์์ต๋๋ค.
- return_distance ๋งค๊ฐ๋ณ์๋ฅผ False๋ก ์ง์ ํ๋ฉด ์ด์ ์ํ์ ์ธํ ์ค๋ง ๋ฐํํ๊ณ ๊ฑฐ๋ฆฌ๋ ๋ฐํ ํ์ง ์์ต๋๋ค. ์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ True์ ๋๋ค.
๋ฐ์ํ
'๐น๏ธ ํผ๊ณต๋จธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ML] ํน์ฑ ๊ณตํ๊ณผ ๊ท์ (0) | 2023.09.24 |
---|---|
[ํผ๊ณต๋จธ์ ] Linear Regression (0) | 2023.09.23 |
[ํผ๊ณต๋จธ์ ] K-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2023.09.22 |
[ํผ๊ณต๋จธ์ ] ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ [๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ] (0) | 2023.09.18 |
[ํผ๊ณต๋จธ์ ] ๋์ ์ฒซ ๋จธ์ ๋ฌ๋ (0) | 2023.09.11 |