- ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ๋์ถ์ ์ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ , ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- ํ์ค์ ์๋ก ํน์ฑ์ ์ค์ผ์ผ์ ๋ณํํ๋ ๋ฐฉ๋ฒ๋ ๋ฐฐ์๋๋ค.
๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
์ ๋ ฅ, ํ๊น ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด๋ด ์๋ค.
# http://bit.ly/bream_smelt
# 49๊ฐ์ ๋ฐ์ดํฐ
# 35๋ง๋ฆฌ ๋๋ฏธ, 14๋ง๋ฆฌ ๋น์ด
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]
๋ํ์ด์ column_stack, concatenate, ones, zeros ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ๋ฐ์ดํฐ์ ํ๊น ๋ฐ์ดํฐ๋ฅผ ๊ฐํธํ๊ฒ ๋ง๋ค์ด๋ด ์๋ค!
๐ ๋ํ์ด์ column_stack, concatenate, ones, zeros
- column_stack : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ฐ ์ผ๋ ฌ๋ก ์ธ์ด ๋ค์, ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐ
- concatenate : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ 1์ฐจ์์ผ๋ก ๋๋ํ ์ฐ๊ฒฐ
- ones : 1๋ก ์ฑ์ด ๋ฐฐ์ด ๋ฆฌํด
- zeros : 0์ผ๋ก ์ฑ์ด ๋ฐฐ์ด ๋ฆฌํด
์ฌ์ฉ ์์)
import numpy as np
print("์๋ ๋ฐ์ดํฐ")
print([1,2,3], [4,5,6])
# column_stack : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ฐ ์ผ๋ ฌ๋ก ์ธ์ด ๋ค์, ์ฐจ๋ก๋๋ก ๋๋ํ ์ฐ๊ฒฐ
print("\ncolumn_stack ๊ฒฐ๊ณผ")
print(np.column_stack(([1,2,3], [4,5,6])))
# concatenate : ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ 1์ฐจ์์ผ๋ก ๋๋ํ ์ฐ๊ฒฐ
print("\nconcatenate ๊ฒฐ๊ณผ")
print(np.concatenate(([1,2,3], [4,5,6])))
# ones : 1๋ก ์ฑ์ด ํฌ๊ธฐ๊ฐ n์ธ ๋ฐฐ์ด ์์ฑ
print(np.ones(5))
# zeros : 0๋ก ์ฑ์ด ํฌ๊ธฐ๊ฐ n์ธ ๋ฐฐ์ด ์์ฑ
print(np.zeros(5))
์ ๋ ฅ, ํ๊น ๋ฐ์ดํฐ.. ์ด์ ์ง์ง ๋ง๋ค์ด๋ณผ๊ฒ์! ๐๐๐
๊ฐ ์ํ๋ง๋ค length, weight๊ฐ ํน์ฑ์ธ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ,
๐ ๋๋ฏธ๋ 1, ๋น์ด๋ 0์ผ๋ก ํ๊น ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ต๋๋ค.
import numpy as np
# ์
๋ ฅ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
fish_data = np.column_stack((fish_length, fish_weight))
# ํ๊น ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
์ ๋ง๋ค์ด์ก๋์ง 5๊ฐ์ฉ ์ถ๋ ฅํด๋ณด์์ต๋๋ค.โจ
์ฌ์ดํท๋ฐ์ผ๋ก ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ ๋๋๊ธฐ
ํ๋ จ ๋ฐ์ดํฐ(์ ๋ ฅ + ํ๊น ๋ฐ์ดํฐ)๋ฅผ ๋ง๋ค์์ผ๋, ์ด๋ฅผ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋์ด์ฃผ๊ฒ ์ต๋๋ค.
ํ ๋ฐฐ์ด์ ํ๋ จ, ํ ์คํธ ์ธํธ๋ก ๋๋๋๊น x 2 ๊ฐ์ฉ ์์ฑ๋๊ฒ ์ฃ ?
๐ ์ฌ์ดํท๋ฐ์ train_test_split()
์ ๋ฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋๋ค์ผ๋ก ์๊ณ , ๋น์จ์ ๋ง๊ฒ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋์ด ์ค
train_test_split() ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 25%๋ฅผ ํ
์คํธ ์ธํธ๋ก ๋ผ์ด๋
๋๋ค.
๐ค ๋ฌธ์ ? ์ผ๋ถ ํด๋์ค ๊ฐ์๊ฐ ์ ์ ๋, ์ํ๋ง ํธํฅ์ด ๋ํ๋ ๋๊ฐ ์์ต๋๋ค. (ํด๋น ์์ ์์๋ ๋น์ด๊ฐ ์ ์ด์ ๋ฐ์)
๐ก ํด๊ฒฐ ! stratify ๋งค๊ฐ๋ณ์์ ํ๊น ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํด๋์ค ๋น์จ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๋๋๋ค.
from sklearn.model_selection import train_test_split
# random_state ๋งค๊ฐ๋ณ์๋ก ๋๋ค ์๋๋ฅผ ์ง์ ํด์ค
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify = fish_target, random_state = 42)
์ ์์๋์ง ํ์ธํ๊ธฐ ์ํด, ํ๋ จ, ํ ์คํธ ์ธํธ ๊ฐ๊ฐ์ ํ๊น ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํด๋ณด์์ต๋๋ค!
ํ์ฌ ๋ฌธ์ ํ์ ํ๊ธฐ
์ค๋นํ ๋ฐ์ดํฐ๋ก k-์ต๊ทผ์ ์ด์์ ํ๋ จํด ๋ณด๊ฒ ์ต๋๋ค.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 1.0
์ ํ๋๊ฐ 1.0์ด๋ค์~!
๊ทธ๋ผ, ์๋ก์ด ๋๋ฏธ ๋ฐ์ดํฐ์ ๋ํด ์์ธกํด๋ณด๊ฒ ์ต๋๋ค.
print(kn.predict([[25, 150]]))
์๋. . . ๐ ๋๋ฏธ๋ 1, ๋น์ด๋ 0์ด๋ผ, 1์ด ๋์์ผ ํ๋๋ฐ ์ ๋น์ด๊ฐ ๋์ฌ๊น์?
์ฐ์ ๋๋ก ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
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()
๐ค ๋ฌธ์ ? ์ฐ์ ๋๋ก ๋ดค์ ๋ ๋๋ฏธ์ชฝ์ ๋ ๊ฐ๊น๊ฒ ๋ณด์ด๋๋ฐ, ์ ๋น์ด ๋ฐ์ดํฐ์ ๊ฐ๊น๋ค๊ณ ํ๋จํ์ฌ 0์ด ์ถ๋ ฅ๋ ๊ฒ์ผ๊น์?
๐ง ๊ณผ์ ... k-์ต๊ทผ์ ์ด์์ ์ฃผ๋ณ์ ์ํ ์ค์์ ๋ค์์ธ ํด๋์ค๋ฅผ ์์ธก์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ฃผ๋ณ ์ํ์ ์์๋ณด๋๋ก ํ์ฃ !
๐ KNeighborsClassifier ํด๋์ค์ kneighbors()
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ํ์ ์ฐพ์์ฃผ๋ ํจ์ (์ด์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ 5)
- ์ด์๊น์ง์ ๊ฑฐ๋ฆฌ์ ์ด์ ์ํ์ ์ธ๋ฑ์ค ๋ฐํ
๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ์ด์ฉํ์ฌ ์ฃผ๋ณ ์ํ์ ์์๋ณด๊ฒ ์ต๋๋ค.
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()
๊ธฐ์ค์ ๋ง์ถ๊ธฐ
๐ค๋ฌธ์ ?
์ด์ ์ํ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ดค์ ๋,,, [[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]
๋๋ฏธ๊น์ง๋ 92, ๋น์ด๊น์ง๋ 130~138 ์ผ๋ก ๋์ค๋ค์.
๊ทธ๋ฐ๋ฐ, ์ฐ์ ๋์์ ๋๋ฏธ๊น์ง 92๋ผ ํ์ ๋, ๋น์ด๊น์ง ๊ฒจ์ฐ 130์ธ๊ฒ ์ข ์ด์ํฉ๋๋ค. ๋น์จ์ด ์ด์ํด์.
๐กํด๊ฒฐ ! x ์ถ์ ๋ฒ์๊ฐ ์ข๊ณ (10~40), y์ถ์ ๋ฒ์๊ฐ ๋์ต๋๋ค(0~1000). ์ฆ, y์ถ์ผ๋ก ์กฐ๊ธ๋ง ๋ฉ์ด์ ธ๋ ํ!! ๋ฉ์ด์ง ๊ฒ์ฒ๋ผ ์์ฃผ ํฐ ๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฒ์ ๋๋ค!
๋ฐ๋ผ์, x์ถ์ ๋ฒ์๋ฅผ y์ถ์ ๋ฒ์์ ๋์ผํ๊ฒ 0~1000์ผ๋ก ๋ง์ถ๋๋ก ํฉ์๋ค!
๐ ๋งทํ๋กฏ๋ฆฝ์ xlim()
- x ์ถ์ ๋ฒ์๋ฅผ ์ง์
- y์ถ ์ง์ ํ๋ ค๋ฉด ylim()
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')
# xlim : x ์ถ์ ๋ฒ์๋ฅผ ์ง์
plt.xlim((0, 1000))
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
์ด๋ ๊ฒ ๋ณด๋, ํ์คํ x์ถ์ ์ด์์ํ๋ก ์ฑํ๋๋ ๋ฐ์ ํฐ ์ํฅ์ ๋ชป ๋ผ์น๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๐ฅ
๐ ์ค์ผ์ผ : ํน์ฑ์ ๊ฐ์ด ๋์ธ ๋ฒ์
์ ์ฒ๋ผ, ๋ ํน์ฑ์ ๋ฒ์๊ฐ ๋ค๋ฅผ ๋ ๋ ํน์ฑ์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ค๊ณ ํํํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๊ธฐ์ค์ด ๋ค๋ฅด๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ์์ธกํ๊ธฐ ํ๋ญ๋๋ค. ๊ธฐ์ค์ ๋ง์ถฐ์ฃผ์ด์ผ๊ฒ ๋ค์. ๐
๐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ํน์ฑ๊ฐ์ ์ผ์ ํ ๊ธฐ์ค์ผ๋ก ๋ง์ถฐ ์ฃผ๋ ์์
- ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค์ํจ
- ํ์ค์ ์ (z์ ์) : ๊ฐ ํน์ฑ๊ฐ์ด ํ๊ท ์์ ํ์คํธ์ฐจ์ ๋ช ๋ฐฐ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋
- ๊ณ์ฐ ๋ฐฉ๋ฒ : ํ๊ท ์ ๋บด๊ณ ํ์คํธ์ฐจ๋ก ๋๋
- ํ์ค์ ์ (z์ ์) : ๊ฐ ํน์ฑ๊ฐ์ด ํ๊ท ์์ ํ์คํธ์ฐจ์ ๋ช ๋ฐฐ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ํ๋
๊ทธ๋ผ, ๊ธฐ์ค์ ๋ง์ถ๊ธฐ ์ํด ํ๋ จ ์ธํธ๋ฅผ ํ์ค ์ ์๋ก ๋ณํํ๊ฒ ์ต๋๋ค.
mean = np.mean(train_input, axis=0) # ํ๊ท
std = np.std(train_input, axis=0) # ํ์ค ํธ์ฐจ
train_scaled = (train_input - mean) / std # ํ์ค ์ ์๋ก ๋ณํ - ๋ํ์ด ๋ธ๋ก๋์บ์คํ
๐ axis = 0 ํ๋ ์ด์ ?
ํน์ฑ๋ง๋ค ๊ฐ์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ฏ๋ก ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ ๊ฐ ํน์ฑ๋ณ๋ก ๊ณ์ฐํด์ผ ํจ
ํ ์ํ(ํ)์ ๋ฐ๋ผ ๊ฐ ์ด(ํน์ฑ)์ ํต๊ณ ๊ฐ์ ๊ณ์ฐํด์ฃผ๊ธฐ ์ํจ!
์ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ๋ จํ๊ธฐ
โจ ํ๋ จ ์ธํธ๋ฅผ ํ์ค ์ ์๋ก ๋ณํํด์ฃผ์๊ธฐ ๋๋ฌธ์, ์์ธกํ ๋๋ฏธ๋ฐ์ดํฐ๋ ํจ๊ป ํ์ค ์ ์๋ก ๋ณํํด์ฃผ์ด์ผ ํฉ๋๋ค!
๐ ๋ํ, ํ๋ จ ์ธํธ์ ํ๊ท ๊ณผ ํ์ค ํธ์ฐจ๋ฅผ ์ด์ฉํ์ฌ ํ์ค ์ ์๋ก ๋ณํํด์ฃผ์ด์ผ ํ๋ค๋ ์ ์ฃผ์!!
์ฐ์ ๋๋ก ํ์ธํด๋ณผ๊น์?
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()
ํ๋ จ ๋ฐ์ดํฐ์ ๋ ํน์ฑ์ด ๋น์ทํ ๋ฒ์๋ฅผ ์ฐจ์งํ๋ ๊ฑธ ํ์ธํ์ผ๋, ํ๋ จ!
๐ ํ ์คํธ ์ธํธ๋ ํ๋ จ ์ธํธ์ ํ๊ท ๊ณผ ํ์ค ํธ์ฐจ๋ฅผ ์ด์ฉํ์ฌ ํ์ค ์ ์๋ก ๋ณํํด์ฃผ์ด์ผ ํ๋ค๋ ์ ์ฃผ์!!
๐ค ์? ๋ฐ์ดํฐ์ ์ค์ผ์ผ์ด ๊ฐ์์ง์ง ์์ผ๋ฏ๋ก
# ์ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ก ํ๋ จ
kn.fit(train_scaled, train_target)
# ํ
์คํธ ์ธํธ๋ฅผ ํ๋ จ ์ธํธ์ ํ๊ท ๊ณผ ํ์คํธ์ฐจ ์ด์ฉํ์ฌ ํ์ค์ ์๋ก ๋ณํ
test_scaled = (test_input - mean) / std
# ํ๊ฐ
kn.score(test_scaled, test_target)
# 1.0
์ ํ๋๋ 1.0~~!!
์์ธก๋ ํด๋ณด๊ฒ ์ต๋๋ค!
# ์์ธก
print(kn.predict([new]))
์ฐ์ ๋๋ก๋ ํ์ธํด๋ณด์ฃ !
์ด์ ์ํ๋ก ๋ชจ๋ ๋๋ฏธ๊ฐ ์กํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๐
'๐ป My Work > ๐ง AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-2. ์ ํ ํ๊ท (0) | 2022.12.05 |
---|---|
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2022.12.05 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 02-1. ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ (2) | 2022.12.03 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 01-3. ๋ง์ผ๊ณผ ๋จธ์ ๋ฌ๋ - K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.11.20 |
[์ธ๊ณต์ง๋ฅ] Google Colab (์ฝ๋ฉ) ์ฌ์ฉํ๊ธฐ (0) | 2022.11.18 |