[ํผ๊ณต๋จธ์ ] 03. ํ๊ท ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ชจ๋ธ ๊ท์
์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ
- ๋ถ๋ฅ : ์ํ์ ๋ช ๊ฐ์ ํด๋์ค ์ค ํ๋๋ก ๋ถ๋ฅ
- ํ๊ท : ์ ํด์ง ํด๋์ค๊ฐ ์๊ณ ์์์ ์ด๋ค ์์น๋ฅผ ์์ธกํ๋ ๋ฌธ์
๋์ด(perch) ๋ฌด๊ฒ ์์ธก
๋์ด์ ๊ธธ์ด, ๋์ด, ๋๊ป ๋ฐ์ดํฐ ์์ ~ ๋์ด ๋ฌด๊ฒ ์์ธก ๋ชจ๋ธ ๋ง๋ค๊ณ ์ถ๋ค!
03-1. K-์ต๊ทผ์ ์ด์ ํ๊ท
k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ
์์ธกํ๋ ค๋ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ k๊ฐ๋ฅผ ์ ํ -> ์ํ๋ค์ ํด๋์ค๋ฅผ ํ์ธ
-> ๋ค์ ํด๋์ค๋ฅผ ์๋ก์ด ์ํ์ ํด๋์ค๋ก ์์ธก
k=3 (์ํ์ด 3๊ฐ)๋ผ๊ณ ๊ฐ์ ํ๋ฉด, ์ฌ๊ฐํ์ด 2๊ฐ๋ก ๋ค์์ด๊ธฐ ๋๋ฌธ์ ์ํ x์ ํด๋์ค๋ ์ฌ๊ฐํ
k-์ต๊ทผ์ ์ด์ ํ๊ท
๋ถ๋ฅ์ ๋๊ฐ์ด ์์ธกํ๋ ค๋ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ k๊ฐ๋ฅผ ์ ํ
์ด์ํ ์ํ์ ํ๊น์ ์ด๋ค ํด๋์ค๊ฐ ์๋๋ผ ์์์ ์์น
ํ๊น ์์ธก ๊ฐ๋จํ ๋ฐฉ๋ฒ = ์ด์์์น๋ค์ ํ๊ท
์ด์ํ ์ํ์ ํ๊น๊ฐ์ด 100, 80, 60 ์ด๋ฅผ ํ๊ท ํ๋ฉด ์ํ x์ ์์ธก ํ๊น๊ฐ์ 80
๋ฐ์ดํฐ ์ค๋น
๋์ด์ ๊ธธ์ด = ํน์ฑ, ๋ฌด๊ฒ = ํ๊น
import numpy as np # numpy ์ซ์ ํ์ด์ฌ -> ์ฐ์ฐ์ ํ์ํ ํจ์ ํจํค์งํ ๋์ด ์ ์ฅ๋์ด ์์
# numpy๋ฅผ 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])
์ฐ์ ๋
ํ๋์ ํน์ฑ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
ํน์ฑ ๋ฐ์ดํฐ x์ถ, ํ๊น ๋ฐ์ดํฐ y์ถ
import matplotlib.pyplot as plt # ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํํ๋ฅผ ๋ ๋์ง ์ฐ์ ๋๋ก ํ์!
plt.scatter(perch_length, perch_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
๋์ด์ ๊ธธ์ด๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋ฌด๊ฒ๋ ๋์ด๋จ
ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋๊ธฐ
train_test_split( ) ํจ์ ์ฌ์ฉ
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์ฐจ์ ๋ฐฐ์ด์ด์ด์ผ ํจ
perch_length๊ฐ 1์ฐจ์ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋๋ train_input๊ณผ test_input๋ 1์ฐจ์ ๋ฐฐ์ด
1์ฐจ์ ๋ฐฐ์ด์ 1๊ฐ์ ์ด์ด ์๋ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ค์ผ ํจ
1์ฐจ์ ๋ฐฐ์ด์ ํฌ๊ธฐ = ์์๊ฐ 1๊ฐ์ธ ํํ
-> ํฌ๊ธฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ reshape( ) ์ฌ์ฉ!
ex) [1,2,3] ํฌ๊ธฐ(3, ) -> [[1],[2],[3]] ํฌ๊ธฐ(3,1)
๋ฐฐ์ด ํฌ๊ธฐ ๋ณ๊ฒฝ
* reshape( ) : ๋ฐ๊พธ๋ ค๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์
ํฌ๊ธฐ๊ฐ ๋ฐ๋ ์๋ก์ด ๋ฐฐ์ด ๋ฐํํ ๋ ์ง์ ํ ํฌ๊ธฐ๊ฐ ์๋ณธ ๋ฐฐ์ด์ ์๋ ์์์ ๊ฐ์์ ๋ค๋ฅด๋ฉด ์๋ฌ
ex) (4, ) -> (2,3) ์๋ฌ / ์๋ณธ ์์ 4๊ฐ์ธ๋ฐ 2x3=6๊ฐ๋ก ๋ฐ๊พธ๋ ค๊ณ ํด์
ํฌ๊ธฐ์ -1 : ๋๋จธ์ง ์์ ๊ฐ์๋ก ๋ชจ๋ ์ฑ์ฐ๊ธฐ (ํฌ๊ธฐ ์๋ ์ง์ )
ex) ์ฒซ ๋ฒ์งธ ํฌ๊ธฐ๋ฅผ ๋๋จธ์ง ์์ ๊ฐ์๋ก ์ฑ์ฐ๊ณ , ๋ ๋ฒ์ฌ ํฌ๊ธฐ๋ฅผ 1
train_input.reshape(-1,1)
# ์ฌ์ดํท๋ฐ์์ ์ฌ์ฉํ ํ๋ จ์ธํธ๋ 2์ฐจ์ ๋ฐฐ์ด, ํ์ฌ ํ๋ จ,ํ
์คํธ ์ธํธ๋ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก ๋ณ๊ฒฝ
train_input = train_input.reshape(-1, 1) # reshape( )๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์ , ํฌ๊ธฐ์ -1์ ์ง์ ํ๋ฉด ๋๋จธ์ง ์์ ๊ฐ์๋ก ๋ชจ๋ ์ฑ์๋ผ!!
test_input = test_input.reshape(-1, 1)
print(train_input.shape, test_input.shape)
(42, 1) (14, 1)
reshape(-1, 1) ๋ฐฐ์ด์ ์ ์ฒด ์์ ๊ฐ์๋ฅผ ๋งค๋ฒ ์ธ์ฐ์ง ์์๋ ๋๋ฏ๋ก ํธ๋ฆฌ
๊ฒฐ์ ๊ณ์(R์ ๊ณฑ)
K-์ต๊ทผ์ ์ด์ ํ๊ท ์๊ณ ๋ฆฌ์ฆ ํด๋์ค = KNeighborsRegressor
์ฌ์ฉ๋ฒ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ fit( ) ๋ฉ์๋๋ก ํ๊ท ๋ชจ๋ธ ํ๋ จ
๊ฐ์ฒด ์์ฑ ํ๊ท ๋ชจ๋ธ ํ๋ จ
# ์ฌ์ดํท๋ฐ์์ k-์ต๊ทผ์ ์ด์ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ํด๋์ค_KNeighborsRegressor
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
# k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋ธ์ ํ๋ จ
knr.fit(train_input, train_target)
ํ ์คํธ ์ธํธ ์ ์ ํ์ธ
print(knr.score(test_input, test_target)
0.992809406101064
์ด ์ ์๋ ๋ฌด์์ผ๊น์??
๋ถ๋ฅ : ํ ์คํธ ์ธํธ์ ์๋ ์ํ์ ์ ํํ๊ฒ ๋ถ๋ฅํ ๊ฐ์์ ๋น์จ = ์ ํ๋ = ์ ๋ต์ ๋งํ ๊ฐ์์ ๋น์จ
ํ๊ท : ์์ธกํ๋ ๊ฐ์ด๋ ํ๊น ๋ชจ๋ ์์์ ์์น -> ์ ํํ ์ซ์ ๋งํ๊ธฐ ๋ถ๊ฐ๋ฅ
ํ๊ท๋ ๊ฒฐ์ ๊ณ์(R์ ๊ณฑ)์ผ๋ก ๊ฐ์ ํ๊ฐ
> ๊ฒฐ์ ๊ณ์(R์ ๊ณฑ) ๊ณ์ฐ ๋ฐฉ๋ฒ
1. ๊ฐ ์ํ์ ํ๊น๊ณผ ์์ธกํ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ์ฌ ๋ํ๋ค
2. ํ๊น๊ณผ ํ๊น ํ๊ท ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ์ฌ ๋ํ ๊ฐ์ผ๋ก ๋๋๋ค
ํ๊น์ ํ๊ท ์ ๋๋ฅผ ์์ธกํ๋ ์์ค์ด๋ผ๋ฉด R์ ๊ณฑ์ 0์ ๊ฐ๊น์์ง๊ณ
์์ธก์ด ํ๊น์ ๊ฐ๊น์์ง๋ฉด 1์ ๊ฐ๊น์ด ๊ฐ
ํ๊น๊ณผ ์์ธกํ ๊ฐ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๊ตฌํด ๋ณด๋ฉด ์ด๋ ์ ๋ ์์ธก์ด ๋ฒ์ด๋ฌ๋์ง ๊ฐ๋ ๊ฐ๋ฅ
-> mean_absolute_error ์ด์ฉ
* mean_absolute_errror : ํ๊น๊ณผ ์์ธก์ ์ ๋๊ฐ ์ค์ฐจ๋ฅผ ํ๊ท ํ์ฌ ๋ฐํ
mean_absolute_error (MAE)
# ํ๊น๊ณผ ์์ธกํ ๊ฐ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๊ตฌํด ๋ณด๋ฉด ์์ธก์ ์ผ๋ง๋ ๋ฒ์ด๋ฌ๋์ง ๊ฐ๋ ํ๊ธฐ ์ข๋ค!
# ๊ฒฐ๊ณผ๋ ํ๊น๊ฐ๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ ์ ์๋ค.
from sklearn.metrics import mean_absolute_error
# ํ
์คํธ ์ธํธ์ ๋ํ ์์ธก์ ๋ง๋ฆ
test_prediction = knr.predict(test_input)
# ํ
์คํธ ์ธํธ์ ๋ํ ํ๊ท ์ ๋๊ฐ ์ค์ฐจ๋ฅผ ๊ณ์ฐํจ
mae = mean_absolute_error(test_target, test_prediction)
print(mae)
19.157142857142862
๊ฒฐ๊ณผ์์ ์์ธก์ด ํ๊ท ์ ์ผ๋ก 19 ์ ๋ ํ๊น๊ฐ๊ณผ ๋ค๋ฅด๋ค
ํ๋ จ ์ธํธ ์ ์ ํ์ธ
print(knr.score(train_input, train_target))
0.9698823289099254
ํ ์คํธ ์ธํธ 0.992809406101064
ํ๋ จ ์ธํธ 0.9698823289099254
๊ณผ๋์ ํฉ VS ๊ณผ์์ ํฉ
๊ณผ๋์ ํฉ
ํ๋ จ ์ธํธ์์ ์ ์๊ฐ ์ข์๋๋ฐ, ํ ์คํธ ์ธํธ์์๋ ์ ์๊ฐ ๋์๋ค
- ํ๋ จ์ธํธ์๋ง ์ ๋ง๋ ๋ชจ๋ธ์ด๋ผ ํ ์คํธ ์ธํธ์ ์๋ก์ด ์ํ์ ๋ํ ์์ธก์ ๋ง๋ค ๋ ์ ๋์ X
๊ณผ์์ ํฉ
ํ๋ จ ์ธํธ๋ณด๋ค ํ ์คํธ ์ธํธ์ ์ ์๊ฐ ๋๊ฑฐ๋, ๋ ์ ์๊ฐ ๋ชจ๋ ๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ
- ๋ชจ๋ธ์ด ๋๋ฌด ๋จ์ํ์ฌ ํ๋ จ์ธํธ์ ์ ์ ํ ํ๋ จ๋์ง ์์ ๊ฒฝ์ฐ
ํ ์คํธ ์ธํธ 0.992809406101064 > ํ๋ จ ์ธํธ 0.9698823289099254 -> ๊ณผ์์ ํฉ
ํ๋ จ ์ธํธ์ ๋ ์ ๋ง๊ฒ ๋ง๋ค๋ฉด ํ ์คํธ ์ธํธ์ ์ ์ ์กฐ๊ธ ๋ฎ์์ง
K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ชจ๋ธ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ : ์ด์์ ๊ฐ์ K๋ฅผ ์ค์ด๋ ๊ฒ
์ด์ ๊ฐ์ ์ค์ด๋ฉด - ํ๋ จ์ธํธ์ ์๋ ๊ตญ์ง์ ์ธ ํจํด์ ๋ฏผ๊ฐ
์ด์ ๊ฐ์ ๋๋ฆฌ๋ฉด - ๋ฐ์ดํฐ ์ ๋ฐ์ ์๋ ์ผ๋ฐ์ ์ด๋ ํจํด ๋ฐ๋ฆ
์ด์ k ๊ฐ์ 3์ผ๋ก ๋ณ๊ฒฝ
K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ K ๊ฐ์ 5 -> 3์ผ๋ก ๋ฎ์ถฐ๋ณด์
-> n_neighbors ์์ฑ๊ฐ ๋ณ๊ฒฝ
# ๊ณผ์์ ํฉ์ ๋ชจ๋ธ์ ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๋ฉด ํด๊ฒฐ์ด ๋ฉ๋๋ค!
# k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ด์์ ๊ฐ์ k๋ฅผ ์ค์ด๊ธฐ
# ์ด์์ ๊ฐ์๋ ๊ธฐ๋ณธ 5๋ก ์ค์ ๋์ด์๋๋ฐ 3์ผ๋ก ๋ณ๊ฒฝ
knr.n_neighbors = 3
# ๋ชจ๋ธ์ ๋ค์ ํ๋ จ
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
0.9804899950518966
k ๊ฐ์ ์ค์๋๋ ํ๋ จ ์ธํธ์ R์ ๊ณฑ ์ ์๊ฐ ๋์์ง
ํ ์คํธ ์ธํธ ์ ์ ํ์ธ
print(knr.score(test_input, test_target))
0.9746459963987609
๊ณผ์์ ํฉ ํด๊ฒฐ
03-2. ์ ํ ํ๊ท
k-์ต๊ทผ์ ์ด์์ ํ๊ณ
๋ฐ์ดํฐ, ๋ชจ๋ธ ์ค๋น -> ํ๋ จ ์ธํธ, ํ ์คํธ ์ธํธ๋ก ๋๋๊ธฐ -> ์ต๊ทผ์ ์ด์ ๊ฐ์ 3 ๋ชจ๋ธ
# ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋๋
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)
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor(n_neighbors=3)
# k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํจ
knr.fit(train_input, train_target)
๊ธธ์ด๊ฐ 50cm์ธ ๋์ด ๋ฌด๊ฒ ์์ธก
print(knr.predict([[50]]))
[1033.33333333]
์ค์ ๋์ด ๋ฌด๊ฒ๋ ๋ ๋๊ฐ ๋ญ๊ฐ ๋ฌธ์ ????
์ฐ์ ๋
ํ๋ จ ์ธํธ, 50cm ๋์ด, ์ด ๋์ด์ ์ต๊ทผ์ ์ด์ ํ์
k-์ต๊ทผ์ ์ด์ ๋ชจ๋ธ kneighbors( ) ๋ฉ์๋ ์ฌ์ฉ - ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์๊น์ง์ ๊ฑฐ๋ฆฌ์ ์ด์ ์ํ ์ธ๋ฑ์ค get
import matplotlib.pyplot as plt
# 50cm ๋์ด์ ์ด์์ ๊ตฌํ๊ธฐ
distances, indexes = knr.kneighbors([[50]])
# ํ๋ จ ์ธํธ์ ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
plt.scatter(train_input, train_target)
# ํ๋ จ ์ธํธ ์ค์์ ์ด์ ์ํ๋ง ๋ค์ ๊ทธ๋ฆฌ๊ธฐ
plt.scatter(train_input[indexes], train_target[indexes], marker='D')
# 50cm ๋์ด ๋ฐ์ดํฐ
plt.scatter(50, 1033, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show() # 50cm ๋์ด์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ 45cm ๊ทผ๋ฐฉ์ด๊ธฐ ๋๋ฌธ์ ์ฃผ๋ณ ์ํ๋ค์ ๋ฌด๊ฒ๋ฅผ ํ๊ท ํ๋ฉด ์ค์ ๊ฐ๊ณผ ์ฐจ์ด ์กด์ฌ
๊ธธ์ด๊ฐ 50cm ๋ฌด๊ฒ๊ฐ 1033g ๋์ด๋ โฒ(marker='^')๋ก ํ์ ๊ทธ ์ฃผ๋ณ์ ์ํ์ โ(marker='D')
50cm ๋์ด์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ 45cm ๊ทผ๋ฐฉ - k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์ด ์ํ๋ค ๋ฌด๊ฒ ํ๊ท
์ด์ ์ํ์ ํ๊น ํ๊ท
# ์ด์์ํ์ ํ๊น์ ํ๊ท ์ ๊ตฌํด๋ณด์!
print(np.mean(train_target[indexes])) # ๋ชจ๋ธ์ด ์์ธกํ ๊ฐ๊ณผ ์ผ์น. ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ์ ์ฐพ์ ํ๊น์ ์์ธกํ๋ฉด ์๋ฑํ ๊ฐ์ ์์ธกํ ์ ์์
1033.3333333333333
๋ชจ๋ธ์ด ์์ธกํ ๊ฐ๊ณผ ์ผ์น
k-์ต๊ทผ์ ์ด์ ํ๊ท๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ์ ์ฐพ์ ํ๊น์ ํ๊ท ํจ
-> ์๋ก์ด ์ํ์ด ํ๋ จ ์ธํธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋ฑํ ๊ฐ ์์ธก
๊ธธ์ด 100cm ์์ธก
# ์๋ฅผ ๋ค์ด ๊ธธ์ด๊ฐ 100cm ๋์ด๋ ์๋ง๋ 1,033g์ผ๋ก ์์ธกํ ๊ฒ์ผ๋ก ์ถ์ธก๋จ
print(knr.predict([[100]]))
[1033.33333333]
์ฐ์ ๋
# ๊ทธ๋ํ๋ก ๊ทธ๋ ค์ ํ์ธํด๋ณด์
distances, indexes = knr.kneighbors([[100]])
# ํ๋ จ ์ธํธ์ ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
plt.scatter(train_input, train_target)
# ํ๋ จ ์ธํธ ์ค์์ ์ด์ ์ํ๋ง ๋ค์ ๊ทธ๋ฆฌ๊ธฐ
plt.scatter(train_input[indexes], train_target[indexes], marker='D')
# 100cm ๋์ด ๋ฐ์ดํฐ
plt.scatter(100, 1033, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show() # ์ด๋ฐ ์์ด๋ฉด ๋์ด๊ฐ ์๋ฌด๋ฆฌ ์ปค๋ ๋ฌด๊ฒ๊ฐ ๋ ๋์ด๋์ง ์๋๋ค!
์ด๋ฐ ์์ด๋ฉด ๋์ด๊ฐ ์๋ฌด๋ฆฌ ์ปค๋ ๋ฌด๊ฒ๊ฐ ๋ ๋์ด๋์ง ์์
-> ๋ค๋ฅธ ๋ชจ๋ธ ์ฐพ์๋ณด์
์ ํ ํ๊ท
ํน์ฑ์ด ํ๋์ธ ๊ฒฝ์ฐ ์ด๋ค ์ง์ ์ ํ์ตํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ทธ ํน์ฑ์ ๊ฐ์ฅ ์ ๋ํ๋ผ ์ ์๋ ์ง์ ์ฐพ๊ธฐ
sklearn.linear_model ํจํค์ง ์๋ LinearRegression ํด๋์ค๋ก ์ ํ ํ๊ท ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
( ์ฌ์ดํท๋ฐ ๋ชจ๋ธ ํด๋์ค๋ fit( ) ํ๋ จ, score( ) ํ๊ฐ, predict( ) ์์ธก ๋ฉ์๋ ์ด๋ฆ ๋ชจ๋ ๋์ผ)
## ์ ํ ํ๊ท_ ์ง์ ์ ํ์ตํ๋ ์๊ณ ๋ฆฌ์ฆ
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
# ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ๋ จ
lr.fit(train_input, train_target)
# 50cm ๋์ด์ ๋ํด ์์ธก
print(lr.predict([[50]]))
[1241.83860323]
k-์ต๊ทผ์ ์ด์ ํ๊ท๋ณด๋ค ์ ํ ํ๊ท๊ฐ ๋์ด์ ๋ฌด๊ฒ๋ฅผ ์์ฃผ ๋๊ฒ ์์ธก
-> ์ ํ ํ๊ท๊ฐ ํ์ตํ ์ง์ ๊ทธ๋ ค ๋ณด์
ํ๋์ ์ง์ ์ ๊ทธ๋ฆฌ๋ ค๋ฉด ๊ธฐ์ธ๊ธฐ์ ์ ํธ์ด ์์ด์ผ ํจ
y = a * x + b
x๋ฅผ ๋์ด์ ๊ธธ์ด, y๋ฅผ ๋์ด์ ๋ฌด๊ฒ๋ก ๋ฐ๊พธ๋ฉด ์์ ๊ฐ์ ๊ทธ๋ํ
lr๊ฐ์ฒด ๊ธฐ์ธ๊ธฐ ์ ํธ
LinearRegression ํด๋์ค๊ฐ ์ฐพ์ a(๊ธฐ์ธ๊ธฐ), b(์ ํธ)๋ lr ๊ฐ์ฒด์ coef_ (๊ธฐ์ธ๊ธฐ) ์ intercept_ (์ ํธ) ์์ฑ์ ์ ์ฅ
print(lr.coef_, lr.intercept_)
[39.01714496] -709.0186449535477
-> ๊ธฐ์ธ๊ธฐ 39.0174496 ์ ํธ -709.0186449535477
* ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ : coef_ intercept_ ์ฒ๋ผ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ฐพ์ ๊ฐ
ํ๋ จ ์ธํธ์ ์ฐ์ ๋, ์ง์ ๊ทธ๋ฆฌ๊ธฐ
๋์ด ๊ธธ์ด 15์์ 50๊น์ง ์ง์
(15, 15*39 -709)์ (50, 50*39 -709) ๋ ์ ์ ์ด์ผ๋ฉด ๋จ
๋์ด์ ๊ธธ์ด 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์ ๊ณฑ ์ ์ ํ์ธ
# ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ ๋ํ R^2์ ์๋ฅผ ํ์ธ
print(lr.score(train_input, train_target)) # ํ๋ จ ์ธํธ
print(lr.score(test_input, test_target)) # ํ
์คํธ ์ธํธ
ํ๋ จ, ํ ์คํธ ์ธํธ ์ ์ ๋์ง ์์... ๊ณผ์์ ํฉ
๋คํญ ํ๊ท
์ ํ ํ๊ท๊ฐ ๋ง๋ ์ง์ ์ ์ผ์ชฝ ์๋๋ก ์ญ ๋ป์ด ์์
์ด ์ง์ ๋๋ก๋ผ๋ฉด ๋์ด์ ๋ฌด๊ฒ๊ฐ 0g ์ดํ๋ก ๋ด๋ ค๊ฐ .. ์์ ์ ์๋์ผ!
๋์ด ๊ธธ์ด์ ๋ฌด๊ฒ์ ๋ํ ์ฐ์ ๋๋ฅผ ๋ณด๋ฉด ์ผ์ง์ ์ด๋ผ๊ธฐ๋ณด๋ค ์ผ์ชฝ ์๋ก ์กฐ๊ธ ๊ตฌ๋ถ๋ฌ์ง ๊ณก์
2์ฐจ ๋ฐฉ์ ์์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ๊ธธ์ด๋ฅผ ์ ๊ณฑํ ํญ์ด ํ๋ จ ์ธํธ์ ์ถ๊ฐ๋์ด์ผ ํจ
๋์ด์ ๊ธธ์ด๋ฅผ ์ ๊ณฑํด์ ์๋ ๋ฐ์ดํฐ ์์ ๋ถ์ด๊ธฐ
* column_stack( ) : 1์ฐจ์์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด์ ์ด๋ก ์๋๋ค
train_input์ ์ ๊ณฑํ ๊ฒ๊ณผ train_input ๋ ๋ฐฐ์ด์ ๋๋ํ ๋ถ์ด๊ธฐ test_input๋ ๋ง์ฐฌ๊ฐ์ง
# ์ง์ ๋๋ก ์์ธกํ๋ฉด ๋์ด์ ๋ฌด๊ฒ๊ฐ 0g ์ดํ์ธ -๊น์ง ๋ด๋ ค๊ฐํ
๋ฐ ํ์ค์์๋ ์์์ ์๋ค!
# -๊ฐ ์๋ ๊ณก์ ์ ๊ฐ๊น์ฐ๋ฏ๋ก ์ต์ ์ ๊ณก์ ์ ์ฐพ๋๊ฒ ๋ณด๋ค ํ์ค์ ์ด๋ค!
## ๋คํญ ํ๊ท_ 2์ฐจ๋ฐฉ์ ์์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ์ ๊ณฑํ ํญ์ด ํ๋ จ์ธํธ์ ์ถ๊ฐ
# ๋์ด์ ๊ธธ์ด๋ฅผ ์ ๊ณฑํ์ฌ ๋ฐ์ดํฐ ์์ ์ถ๊ฐ
train_poly = np.column_stack((train_input ** 2, train_input))
test_poly = np.column_stack((test_input ** 2, test_input))
train_input **2 ์์๋ ๋ํ์ด ๋ธ๋ก๋์บ์คํ ์ ์ฉ
= train_input์ ์๋ ๋ชจ๋ ์์๋ฅผ ์ ๊ณฑํ๋ค
์๋กญ๊ฒ ๋ง๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ํ์ธ
# ๋ชจ๋ ์์๋ฅผ ์ ๊ณฑํ์ฌ ๋ฐ์ดํฐ ์
์ ํฌ๊ธฐ๋ฅผ ํ์ธ
print(train_poly.shape, test_poly.shape)
(42, 2) (14, 2)
์๋ ํน์ฑ์ธ ๊ธธ์ด๋ฅผ ์ ๊ณฑํ์ฌ ์ผ์ชฝ ์ด์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ํ๋ จ ์ธํธ, ํ ์คํธ ์ธํธ ๋ชจ๋ ์ด์ด 2๊ฐ๋ก ๋์ด๋จ
train_poly ์ฌ์ฉ ์ ํ ํ๊ท ๋ชจ๋ธ ๋ค์ ํ๋ จ
2์ฐจ ๋ฐฉ์ ์ ๊ทธ๋ํ๋ฅผ ์ฐพ๊ธฐ ์ํด ํ๋ จ ์ธํธ ์ ๊ณฑ ํญ์ ์ถ๊ฐํ์ง๋ง, ํ๊น๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉ
๋ชฉํํ๋ ๊ฐ์ ์ด๋ค ๊ทธ๋ํ๋ฅผ ํ๋ จํ๋ ๋ฐ๊ฟ ํ์ X
ํ ์คํธํ ๋๋ ์ด ๋ชจ๋ธ์ ๋์ด ๊ธธ์ด์ ์ ๊ณฑ๊ณผ ์๋ ๊ธธ์ด๋ฅผ ํจ๊ป ๋ฃ์ด์ผ ํจ
# ์ ํํ๊ท ๋ชจ๋ธ์ ํ๋ จํ ๋ค์ 50cm ๋์ด์ ๋ํด ๋ฌด๊ฒ ์์ธก
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.predict([[50**2, 50]])) # ์์ ํ๋ จํ ๋ชจ๋ธ๋ณด๋ค ๋ ๋์ ๊ฐ์ ์์ธกํจ
[1573.98423528]
๋ชจ๋ธ์ด ํ๋ จํ ๊ณ์์ ์ ํธ ์ถ๋ ฅ
print(lr.coef_, lr.intercept_)
[ 1.01433211 -21.55792498] 116.0502107827827
๋ฌด๊ฒ = 1.01 * ๊ธธ์ด์ ๊ณฑ - 21.6 * ๊ธธ์ด + 116.05
์ด๋ฐ ๋ฐฉ์ ์์ ๋คํญ์์ด๋ผ ๋ถ๋ฅด๋ฉฐ, ๋คํญ์์ ์ฌ์ฉํ ์ ํ ํ๊ท๋ฅผ ๋คํญ ํ๊ท๋ผ ํจ
ํ๋ จ ์ธํธ์ ์ฐ์ ๋์ ๊ทธ๋ํ
์งง์ ์ง์ ์ ์ด์ด์ ๊ทธ๋ฆฌ๋ฉด ๋ง์น ๊ณก์ ์ฒ๋ผ ํํ ๊ฐ๋ฅ1์ฉ ์งง๊ฒ ๋์ด์ ๊ทธ๋ฆฌ๊ธฐ
#๋คํญํ๊ท์ ์ฐ์ ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค์ ๋์ผ๋ก ํ์ธํด๋ณด์!
# ๊ตฌ๊ฐ๋ณ ์ง์ ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด 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()
ํ๋ จ ์ธํธ์ ๊ฒฝํฅ์ ์ ๋ฐ๋ฅด๊ณ , ๋ฌด๊ฒ๊ฐ ์์๋ก ๋์ค์ง X
ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ์ R์ ๊ณฑ ์ ์ ํ๊ฐ
# ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ R^2 ์ ์๋ฅผ ํ๊ฐํด๋ณด์
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target)) # ๊ณผ์์ ํฉ์ด ๋จ์์์ผ๋ฏ๋ก ์กฐ๊ธ ๋ ๋ณต์กํ ๋ชจ๋ธ์ด ํ์ํจ.
0.9706807451768623
0.9775935108325122
๊ณผ์์ ํฉ์ด ๋จ์ ์์ -> ์กฐ๊ธ ๋ ๋ณต์กํ ๋ชจ๋ธ ํ์
3-3. ํน์ฑ ๊ณตํ๊ณผ ๊ท์
๋ค์ค ํ๊ท
์ฌ๋ฌ ๊ฐ์ ํน์ฑ์ ์ฌ์ฉํ ์ ํ ํ๊ท
ํน์ฑ 1๊ฐ - ์ง์ ํ์ต
ํน์ฑ 2๊ฐ - ํ๋ฉด ํ์ต
ํ๊น = a * ํน์ฑ1 + b * ํน์ฑ2 + ์ ํธ
ํน์ฑ๊ณตํ : ๊ธฐ์กด์ ํน์ฑ์ ์ฌ์ฉํด ์๋ก์ด ํน์ฑ์ ๋ฝ์๋ด๋ ์์
๋ฐ์ดํฐ ์ค๋น
* ํ๋ค์ค : ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ๋ฐ์ดํฐํ๋ ์์ ํ๋ค์ค์ ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ
# ์กฐ๊ธ๋ ๋ณต์กํ ๋ชจ๋ธ์ ๋ง๋๋ ค๋ฉด ์ ๊ณฑ๋ณด๋ค ๋ ๊ณ ์ฐจํญ์ ๋ฃ์ด์ผ ํ๋๋ฐ ํน์ง์ ์ถ๊ฐํด์ ๊ณ ์ฐจํญ์ผ๋ก ๋ง๋ค์
# ํน์ฑ ๊ณตํ - ๊ธฐ์กด์ ํน์ฑ์ ์ฌ์ฉํด ์๋ก์ด ํน์ฑ์ ๋ฝ์๋ด ํน์ง์ ์ถ๊ฐ
## ๋ฐ์ดํฐ ์ค๋น
import pandas as pd # pd๋ ๊ด๋ก์ ์ผ๋ก ์ฌ์ฉํ๋ ํ๋ค์ค์ ๋ณ์นญ
df = pd.read_csv('http://bit.ly/perch_csv')
perch_full = df.to_numpy()
print(perch_full)
read.csv() ํจ์๋ก ๋ฐ์ดํฐํ๋ ์ ๋ง๋ ๋ค์ to_numpy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ํ์ด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝ
ํ๊น ๋ฐ์ดํฐ ์ค๋น
import numpy as np
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])
ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ
perch_full๊ณผ perch_weight๋ฅผ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋๋ค
# ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋๋๊ธฐ
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(perch_full, perch_weight, random_state=42)
์ฌ์ดํท๋ฐ ๋ณํ๊ธฐ
์ฌ์ดํท๋ฐ์ ํน์ฑ์ ๋ง๋ค๊ฑฐ๋ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ค์ํ ํด๋์ค ์ ๊ณต. ์ด๋ฐ ํด๋์ค๋ฅผ ๋ณํ๊ธฐ๋ผ๊ณ ํจ
๋ชจ๋ธ ํด๋์ค - fit( ), score( ), predict( )
๋ณํ๊ธฐ ํด๋์ค - fit( ), transform( )
์ฌ์ฉํ ๋ณํ๊ธฐ๋ polynomialfeatures ํด๋์ค
sklearn.preprocessing ํจํค์ง์ ํฌํจ๋์ด ์์
## ์ฌ์ดํท๋ฐ์ ๋ณํ๊ธฐ_ ํน์ฑ์ ๋ง๋ค๊ฑฐ๋ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ค์ํ ํด๋์ค ์ ๊ณต
from sklearn.preprocessing import PolynomialFeatures
ํด๋์ค ๊ฐ์ฒด -> fit() -> transform()
ํ๋ จ(fit)์ ํด์ผ ๋ณํ(transform) ๊ฐ๋ฅ
# ์์1
poly = PolynomialFeatures()
poly.fit([[2, 3]]) # ํ๋ จ fit์ ํด์ผ ๋ณํ transform์ด ๊ฐ๋ฅํจ
print(poly.transform([[2, 3]])) # 1์ ์ ํธ์ ๊ณฑํด์ง ์
[[1. 2. 3. 4. 6. 9.]]
fit( ) ๋ฉ์๋ ์๋กญ๊ฒ ๋ง๋ค ํน์ฑ ์กฐํฉ ์ฐพ๊ณ transform( ) ๋ฉ์๋๋ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํ
๋ณํ๊ธฐ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๋ฐ ํ๊น ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์์
๋ชจ๋ธ ํด๋์ค์ ๋ค๋ฅด๊ฒ fit( ) ๋ฉ์๋์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ง ์ ๋ฌ
PolynomialFeatures ๊ฐ ํน์ฑ์ ์ ๊ณฑํ ํญ์ ์ถ๊ฐํ๊ณ ํน์ฑ๋ผ๋ฆฌ ์๋ก ๊ณฑํ ํญ ์ถ๊ฐ
[[1 , 2 , 3 , 2*2, 2*3, 3*3 ]]
1์ด ์ถ๊ฐ๋ ์ด์ ?
๋ฌด๊ฒ = a*๊ธธ์ด + b*๋์ด + c*๋๊ป +d*1
์ ํ ๋ฐฉ์ ์์ ์ ํธ์ ํญ์ ๊ฐ์ด 1์ธ ํน์ฑ๊ณผ ๊ณฑํด์ง๋ ๊ณ์
ํน์ฑ์ (๊ธธ์ด, ๋์ด, ๋๊ป, 1)์ด ๋จ
ํ์ง๋ง ์ฌ์ดํท๋ฐ ์ ํ ๋ชจ๋ธ์ ์๋์ผ๋ก ์ ํธ์ถ๊ฐ ํ๋ฏ๋ก ๊ตณ์ด 1 ํน์ฑ ๋ง๋คํ์ x
include_bias=False ์ง์ 1 ์ ๊ฑฐ
# ์์2
poly = PolynomialFeatures(include_bias=False) # ์ฌ์ดํท ๋ฐ ์ ํ๋ชจ๋ธ์ ์๋ ์ ํธ์ ์ถ๊ฐํ๋ฏ๋ก ์ ๊ฑฐ
poly.fit([[2,3]])
print(poly.transform([[2, 3]]))
[[2. 3. 4. 6. 9.]]
์ ํธ์ ์ํ ํญ์ด ์ ๊ฑฐ๋๊ณ ํน์ฑ์ ์ ๊ณฑ๊ณผ ํน์ฑ๋ผ๋ฆฌ ๊ณฑํ ํญ๋ง ์ถ๊ฐ๋จ
์ด ๋ฐฉ์์ผ๋ก train_input ์ ์ฉ
train_input์ ๋ณํํ ๋ฐ์ดํฐ train_poly ์ ์ฅ, ๋ฐฐ์ด ํฌ๊ธฐ ํ์ธ
# ํน์ฑ ๋ง๋ค๊ธฐ๋ฅผ ์ ์ฉ, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ํ์ธ_9๊ฐ์ ํน์ฑ
poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape)
(42, 9)
ํน์ฑ ์กฐํฉ
* get_feature_names_out( ) : ํน์ฑ์ด ๊ฐ๊ฐ ์ด๋ค ์ ๋ ฅ์ ์กฐํฉ์ ๋ง๋ค์ด์ก๋์ง ์๋ ค์ค
# 9๊ฐ์ ํน์ฑ์ด ๊ฐ๊ฐ ์ด๋ค ์
๋ ฅ์ ์กฐํฉ์ผ๋ก ๋ง๋ค์ด์ก๋๊ฐ
poly.get_feature_names()
['x0', 'x1', 'x2', 'x0^2', 'x0 x1', 'x0 x2', 'x1^2', 'x1 x2', 'x2^2']
x0 ์ฒซ๋ฒ์งธ ํน์ฑ
x0^2 ์ฒซ๋ฒ์งธ ํน์ฑ์ ์ ๊ณฑ
x0 x1 ์ฒซ๋ฒ์งธ ํน์ฑ๊ณผ ๋๋ฒ์จฐ ํน์ฑ์ ๊ณฑ
ํ ์คํธ ์ธํธ ๋ณํ
# ํ
์คํธ ์ธํธ๋ก ๋ณํํ์ฌ ๋ค์ค ํ๊ท ๋ชจ๋ธ์ ํ๋ จํ์
test_poly = poly.transform(test_input)
๋ค์ค ํ๊ท ๋ชจ๋ธ ํ๋ จํ๊ธฐ
LinearRegression ํด๋์ค ์ํฌํธ, train_ploy ์ฌ์ฉ ๋ชจ๋ธ ํ๋ จ
## ๋ค์ค ํ๊ท ๋ชจ๋ธ ํ๋ จํ๊ธฐ
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target)) # ํน์ฑ์ด ๋์ด๋๋ฉด ์ ํ ํ๊ท์ ๋ฅ๋ ฅ์ ์์ฃผ ๊ฐ๋ ฅํ๋ค
0.9903183436982124
ํ ์คํธ ์ธํธ ์ ์ ํ์ธ
#ํ
์คํธ ์ธํธ์ ๋ํ ์ ์๋ ํ์ธ
print(lr.score(test_poly, test_target)) # ์์ ๊ณผ์์ ํฉ ๋ฌธ์ ๋ ๋์ด์ ๋ํ๋์ง ์์
ํน์ฑ ์ถ๊ฐ
* degree : ํ์ํ ๊ณ ์ฐจํญ์ ์ต๋ ์ฐจ์ ์ง์
#ํน์ฑ์ ๋ ๋ง์ด ์ถ๊ฐํ๋ฉด ์ด๋จ๊น? 5์ ๊ณฑ๊น์ง ํน์ฑ์ ๋ง๋ค์ด ์ถ๋ ฅํด๋ณด์
poly = PolynomialFeatures(degree=5, include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)
print(train_poly.shape) # ๋ง๋ค์ด์ง ํน์ฑ์ ๊ฐ์๊ฐ 55๊ฐ๋ ๋๋ค!
(42, 55)
train_poly ๋ฐฐ์ด์ ์ด์ ๊ฐ์๊ฐ ํน์ฑ์ ๊ฐ์
ํน์ฑ 55๊ฐ
์ ํ ํ๊ท ๋ชจ๋ธ ๋ค์ ํ๋ จ
# 5์ ๊ณฑ ํน์ฑ์ ์ ์ฉํ ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ค์ ํ๋ จํด๋ณด์
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target)) # ๊ฑฐ์ ์๋ฒฝ์ ๊ฐ๊น์ด ์ ์๊ฐ ๋ํ๋จ!
0.9999999999991097
ํ ์คํธ ์ธํธ ์ ์ ํ์ธ
# 5์ ๊ณฑ ํน์ฑ์ ์ ์ฉํ ํ
์คํธ ์ธํธ์ ๋ํ ์ ์๋ฅผ ์์๋ณด์
print(lr.score(test_poly, test_target)) # ๊ณผ๋์ ํฉ๋์ด ํ
์คํธ ์ ์์์๋ ํํธ์๋ ์ ์๋ฅผ ๋ํ๋
ํน์ฑ์ ๊ฐ์๋ฅผ ํฌ๊ฒ ๋๋ฆฌ๋ฉด ์ ํ ๋ชจ๋ธ์ ์์ฃผ ๊ฐ๋ ฅํด์ง
ํ๋ จ ์ธํธ์ ๋ํด ๊ฑฐ์ ์๋ฒฝํ๊ฒ ํ์ต
ํ์ง๋ง ์ด๋ฐ ๋ชจ๋ธ์ ํ๋ จ ์ธํธ์ ๋๋ฌด ๊ณผ๋์ ํฉ - ํ ์คํธ ์ธํธ์์๋ ํํธ์๋ ์ ์
๊ท์
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ๋ จ ์ธํธ๋ฅผ ๋๋ฌด ๊ณผ๋ํ๊ฒ ํ์ตํ์ง ๋ชปํ๋๋ก ํผ๋ฐฉํ๋ ๊ฒ
ํน์ฑ์ ์ค์ผ์ผ์ด ์ ๊ทํ๋์ง ์์ผ๋ฉด ์ฌ๊ธฐ์ ๊ณฑํด์ง๋ ๊ณ์ ๊ฐ๋ ์ฐจ์ด ๋๊ฒ ๋จ
์ ํ ํ๊ท ๋ชจ๋ธ์ ๊ท์ ๋ฅผ ์ ์ฉํ ๋ ๊ณ์ ๊ฐ์ ํฌ๊ธฐ๊ฐ ์๋ก ๋ง์ด ๋ค๋ฅด๋ฉด ๊ณต์ ํ๊ฒ ์ ์ด X
๋จผ์ ์ ๊ทํ ! StandafdScaler ํด๋์ค ์ฌ์ฉ
## ๊ท์ _๋๋ฌด ๊ณผ๋ํ๊ฒ ํ์ตํ์ง ์๋๋ก ํผ๋ฐฉํ์!
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_poly)
train_scaled = ss.transform(train_poly) # training set๊ณผ ๊ฐ์ ๊ธฐ์ค์ ์ ์ฉ
test_scaled = ss.transform(test_poly)
StandadScaler ํด๋์ค์ ๊ฐ์ฒด ss๋ฅผ ์ด๊ธฐํํ ํ PoltnomialFeatures ํด๋์ค๋ก ๋ง๋ train_poly ์ฌ์ฉํด ๊ฐ์ฒด ํ๋ จ
ํ๋ จ ์ธํธ๋ก ํ์ตํ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํด ํ ์คํธ ์ธํธ๊น์ง ๋ณํ
์ฐธ๊ณ ๋์ : ํผ์๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋ + ๋ฅ๋ฌ๋, ๋ฐํด์ , ํ๋น๋ฏธ๋์ด, 2020๋
'Ability ๐ฑ > ML' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํผ๊ณต๋จธ์ ] 04. ๋ค์ํ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ - ๋ก์ง์คํฑ ํ๊ท, ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (0) | 2022.06.19 |
---|---|
[ํผ๊ณต๋จธ์ ] 03. ์ ๋ฆฌ (0) | 2022.04.26 |
[ํผ๊ณต๋จธ์ ] 02. ์ ๋ฆฌ (0) | 2022.04.24 |
[ํผ๊ณต๋จธ์ ] 02. ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ - ํ๋ จ์ธํธ & ํ ์คํธ ์ธํธ, ์ํ๋ง ํธํฅ, ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (0) | 2022.04.24 |
[ํผ๊ณต๋จธ์ ] 01. ์ ๋ฆฌ (0) | 2022.04.23 |