์ฐ์ ๋ฐ์ดํฐ ์ค๋น ํ ํ๋ จ๊น์ง.. (03-1 ๋ด์ฉ ์ฐธ๊ณ )
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท
์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฅ์ ํ๊ท๋ก ๋๋ฉ๋๋ค. ์ด ๊ธ์ ํ๊ท์ ๋ํด ์์ฑํ์ต๋๋ค. ํ๊ท ์์์ ์ซ์๋ฅผ ์์ธก ์์์ ์ซ์ = ํ๊น๊ฐ k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋ธ ๊ฐ๊น์ด k๊ฐ์ ์ด์ ์ฐพ๊ธฐ ์ด์ ์ํ์
avoc-o-d.tistory.com
# http://bit.ly/perch_data
# ์ฐ์ , ํ๋ จ, ํ
์คํธ ์ธํธ๋ก ๋๋๊ณ
# ํน์ฑ ๋ฐ์ดํฐ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํ
import numpy as np
perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
44.0])
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
1000.0])
from sklearn.model_selection import train_test_split
# ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋๋๊ธฐ
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42)
# 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํ
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)
# KNeighborsRegressor
from sklearn.neighbors import KNeighborsRegressor
# ์ด์ ๊ฐ์๋ฅผ 3๊ฐ๋ก ํ๋ ๋ชจ๋ธ
knr=KNeighborsRegressor(n_neighbors=3)
# ํ๋ จ
knr.fit(train_input, train_target)
k-์ต๊ทผ์ ์ด์์ ํ๊ณ
์ด ๋ชจ๋ธ์ ์ฌ์ฉํด์ ๊ธธ์ด๊ฐ 50cm์ธ ๋์ด์ ๋ฌด๊ฒ๋ฅผ ์์ธกํ๊ฒ ์ต๋๋ค.
# ๊ธธ์ด 50cm ์ธ ๋์ด ๋ฌด๊ฒ ์์ธกํ๊ธฐ
print(knr.predict([[50]]))

ํด๋น ๋ชจ๋ธ์ 1033g ์ ๋๋ก ์์ธกํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ค์ ๋์ด์ ๋ฌด๊ฒ๋ ์ด๋ณด๋ค ํจ์ฌ ๋ ๋ง์ด ๋๊ฐ์ผ ํ๋ค๊ณ ํฉ๋๋ค.
๋ฌธ์ ๊ฐ ์๊ฒผ๋ค์...^^
ํ๋ จ ์ธํธ๋ ํ๋์ ์ , ํ๋ จ ์ธํธ ์ค ์์ธก๊ฐ์ ์ด์ ์ํ์ ์ฃผํฉ์ ์ , ์์ธก๊ฐ(50cm, 1033g)์ ์ด๋ก์ ์ ์ผ๋ก ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.

์ฐ์ ๋๋ฅผ ํ์ธํ์ ๋, ๋น์ฐํ๊ฒ๋ ๊ธธ์ด๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋ฌด๊ฒ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์์ธก๊ฐ(50cm, 1033g)์ 45cm๋ณด๋ค ๊ธธ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฒ๋ ์ปค์ผ ํ๋๋ฐ, ํฌ์ง ์์ต๋๋ค..?
์ฐ์ , ๋ชจ๋ธ์ 50cm์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ด๋ผ๊ณค 45cm ๊ทผ๋ฐฉ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ 45cm ๊ทผ๋ฐฉ ์ํ๋ค์ ์ด์ฉํ์ฌ ํ๊ท ์ ๊ตฌํ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ, 45cm ๊ทผ๋ฐฉ ์ํ๋ค์ ํ๊ท ์ ์ง์ ๊ตฌํด์ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๊ฐ๊ณผ ๊ฐ์์ง ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
print(np.mean(train_target[indexes]))

์ฐ์ ๋๊ฐ๋ค์^^
๊ทธ๋ฌ๋๊น, ์๋ก์ด ์ํ์ด ํ๋ จ ์ธํธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋ฑํ ๊ฐ์ ์์ธกํ ์ ๋ฐ์ ์๋ ๊ฒ์ด์ฃ .
์ฆ, ํ๋ จ ์ธํธ ๋ฒ์ ๋ฐ์ ์ํ์ ์์ธกํ ์ ์๋ค๋ ํ๊ณ๊ฐ ์๋ ๊ฒ์ ํ์ ํ์ต๋๋ค.
๊ทน๋จ์ ์ผ๋ก, ์ด ๋ชจ๋ธ์ ๊ธธ์ด๊ฐ 1000cm ์ด์ด๋ 1033g ์ผ๋ก ์์ธกํฉ๋๋ค.๐ฅฒ
๐์ ํ ํ๊ท
- ํ๊ท ์๊ณ ๋ฆฌ์ฆ
- ํน์ฑ์ด ํ๋์ผ ๋, ๋ถ์ํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๊ด๊ณ์ฑ์ด ์ง์ ์ธ ๊ฒฝ์ฐ
- y = ax + b
๐ LinearRegression : ์ ํ ํ๊ท ์๊ณ ๋ฆฌ์ฆ ๊ตฌํํ ํด๋์ค
์ ํ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํ์ฌ ์์ธกํด๋ณด๊ฒ ์ต๋๋ค.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
# ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ๋ จ
lr.fit(train_input, train_target)
# 50cm ๋์ด ์์ธก
print(lr.predict([[50]]))

๐๋ชจ๋ธ ํ๋ผ๋ฏธํฐ
y = ax + b
- a(๊ธฐ์ธ๊ธฐ) : coef_
- b(์ ํธ) : intercept_
coef_, intercept_๋ฅผ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ฐพ์ ๊ฐ์ด๋ผ๋ ์๋ฏธ๋ก ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ผ๊ณ ๋ถ๋ฆ
๋ชจ๋ธ ๊ธฐ๋ฐ ํ์ต - ์ต์ ์ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ๋ ํ๋ จ ๊ณผ์
# y = ax + b
# a : coef ๊ธฐ์ธ๊ธฐ (coefficient ๊ณ์ ํน์ ๊ฐ์ค์น)
# b : intercept ์ ํธ
print(lr.coef_, lr.intercept_)

๋ฌด๊ฒ = 39.02 x ๊ธธ์ด - 709.02 ๋ฅผ ํ์ตํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋์ด์ ๊ธธ์ด 15 ~ 50๊น์ง๋ฅผ ์ง์ ์ผ๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
plt.scatter(train_input, train_target)
# 15~ 50 1์ฐจ ๋ฐฉ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.plot([15, 50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])
# 50cm ๋์ด ๋ฐ์ดํฐ
plt.scatter(50, 1241.8, marker="^")
plt.xlabel("length")
plt.ylabel("weight")
plt.show()

์ค! ์ง์ ์ ์ฐ์ฅ์ ์ 50cm ๋์ด์ ๋ํ ์์ธก์ด ์์ด์!
๊ทธ๋ผ, R^2 ์ ์๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.

์,, ๋ ์ธํธ ๋ชจ๋ ๊ฒฐ์ ๊ณ์๊ฐ ๋ฎ๋ค์! ๊ณผ์์ ํฉ ๋์๋ค๊ณ ๋ณผ ์ ์์ด์.๐
๐ค ๋ฌธ์ ? ์ฐ์ ์ ํ ํ๊ท๋ก ๋ง๋ ์ง์ ์ ๋ฌด๊ฒ๊ฐ 0g ์ดํ๋ก ๋ด๋ ค๊ฐ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
์ฆ, ๋ฌด๊ฒ๊ฐ ์์๋ก ๋์ฌ ์ ์๋ ๋ฌธ์ ์ ์ด ์๋ ๊ฒ์ ํ์ ํ์ต๋๋ค.
๐กํด๊ฒฐ ! ์ฐ์ ๋๋ก๋ ์ผ์ง์ ๋ณด๋จ ๊ณก์ ์ ๋ชจ์์ ๊ฐ๊น์ฃ . ๋คํญ์์ ์ฌ์ฉํ ์ ํ ํ๊ท๋ฅผ ํฉ๋๋ค.
๐๋คํญ ํ๊ท
- ๋คํญ์์ ์ฌ์ฉํ ์ ํ ํ๊ท
- ํน์ฑ์ด ํ๋์ผ ๋, ๋ถ์ํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๊ด๊ณ์ฑ์ด ์ง์ ์ด ์๋ ๊ฒฝ์ฐ
- y = axยฒ + bx + c ...
- ํด๋น ์์ ๋ 2์ฐจ ๋ฐฉ์ ์์ผ๋ก, ์ ๊ณฑํ ํญ์ด ํ๋ จ ์ธํธ์ ์ถ๊ฐ๋์ด์ผ ํจ
๐ ๋คํญ ํ๊ท๋ ์ ํ ํ๊ท๋ผ๊ณ ํ ์ ์์ต๋๋ค.
xยฒ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ค๋ฅธ ๋ณ์๋ก ์นํํ๊ฒ ๋๋ฉด, y = aA + bx +c ์ ๊ฐ์ด ์ธ ์ ์๊ธฐ ๋๋ฌธ์, y๋ A์ x์ ์ ํ ๊ด๊ณ๋ก ํํํ ์ ์๋ค.
๐์ฃผ์ ! ๋ฐ์ดํฐ ์ ์ 2์ฐจ ๋ฐฉ์ ์์ ๋ง๊ฒ ์ค๋นํ๋๋ผ๋ ํ๊น๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
ํ๊น๊ฐ์ ์ด๋ค ๊ทธ๋ํ๋ฅผ ํ๋ จํ๋ ์ง๊ฐ์ ๋ฐ๊ฟ ํ์๊ฐ ์์ด์!
# ์ ๊ณฑํ ํญ์ด ํ๋ จ์ธํธ์ ์ถ๊ฐ๋์ด์ผ ํ๋๊น..(๋ฐ์ดํฐ ์
๊ฐ์, 2) ์ธ ๋ฐฐ์ด ๋ง๋ค์ด์ผ ํจ!
# ๊ฐ ์ ๊ณฑํ ๊ฑธ ๋๋ํ ๋ถ์ด๊ธฐ~!
train_poly = np.column_stack((train_input ** 2 , train_input))
test_poly = np.column_stack((test_input ** 2 , test_input))

๋ฐ์ดํฐ๊ฐ ์ค๋น ๋์์ต๋๋ค! ๊ทธ๋ผ ๋ค์ ํ๋ จํด๋ณด๊ฒ ์ต๋๋ค.
lr = LinearRegression()
# ๋ค์ ํ๋ จ ํ, ๋ ๋์ ๋ฌด๊ฒ๊ฐ์ ์์ธก!
lr.fit(train_poly, train_target)
lr.predict([[50**2, 50]])

๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.

๋ฌด๊ฒ = 1.01 x ๊ธธ์ดยฒ - 21.6 x ๊ธธ์ด + 116.05 ๋ฅผ ํ์ตํ์ต๋๋ค.
์ฐ์ ๋๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
# ๊ตฌ๊ฐ๋ณ ์ง์ ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด 15~49 ์ ์ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
point = np.arange(15, 50)
# ํ๋ จ ์ธํธ ์ฐ์ ๋
plt.scatter(train_input, train_target)
# 15~ 49 2์ฐจ ๋ฐฉ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.plot(point, 1.01*point**2 - 21.6*point + 116.05)
# 50cm ๋์ด ๋ฐ์ดํฐ
plt.scatter(50, 1574, marker="^")
plt.xlabel("length")
plt.ylabel("weight")
plt.show()

๊ณก์ ์ผ๋ก ์์๊ฒ ์ ๊ทธ๋ ค์ก๋ค์ฅ๐
๊ฒฐ์ ๊ณ์๋ ์ดํด๋ณผ๊น์?

์์ฃผ ์ ํ๋ จ๋์์ต๋๋ค~!
๊ทธ๋ ์ง๋ง, ์์ง ํ ์คํธ ์ธํธ์ ์ ์๊ฐ ์กฐ์ค๊ธ ๋ ๋์ต๋๋ค. ๊ณผ์์ ํฉ์ด ์์ง ๋จ์๋ค๋ ๊ฒ์ด์ฃ ..
์กฐ๊ธ ๋ ๋ณต์กํ ๋ชจ๋ธ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๐ค๐ค
'๐ป My Work > ๐ง AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 04-1. ๋ก์ง์คํฑ ํ๊ท (2) | 2022.12.08 |
---|---|
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-3. ํน์ฑ ๊ณตํ๊ณผ ๊ท์ (0) | 2022.12.07 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2022.12.05 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 02-2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (2) | 2022.12.04 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 02-1. ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ (2) | 2022.12.03 |