Prepreperation
- train set์ ์๋์ ๊ฐ์ด ์ธํ ํ๊ณ ํ๋ จํฉ๋๋ค
Train Set
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] )
Train Set๊ณผ Test Set์ผ๋ก ๋๋๊ธฐ
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)
Train
from sklearn.neighbors import KNeighborsRegressor knr = KNeighborsRegressor(n_neighbors=3) # k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค knr.fit(train_input, train_target)
score
print(knr.score(test_input,test_target))
output : 0.992809406101064
k-NN์ ํ๊ณ
- k-NN ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๊ธธ์ด๊ฐ 50cm์ธ ๋์ด์ ๋ฌด๊ฒ ์์ธก
prediction
print(knr.predict([[50]]))
output : 1033.33333333
- Train Set๊ณผ ์์ธก๊ฐ ์๊ฐํ
# 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()
output :
- ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก k-NN ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๊ธธ์ด๊ฐ 100cm์ธ ๋์ด์ ๋ฌด๊ฒ ์์ธก
k-NN์ ํ๊ณ
- k-NN(k-์ต๊ทผ์ ์๊ณ ๋ฆฌ์ฆ) ์ input ๊ฐ๊ณผ ๊ฐ์ฅ ์ต๊ทผ์ ํ๋ ์ด์ n๊ฐ์ ํ๊ท ํจ์ผ๋ก์จ ์์ธกํ๋ ๋ชจ๋ธ์(n = n_neighbor)
- rain set์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์ธก์ ํ์ง ๋ชปํจ
Linear Regression (์ ํ ํ๊ท)
- ์์ ๊ฐ์ ํ๊ณ์ ์ ๊ทน๋ณตํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ํ ํจ์๋ฅผ ์ด์ฉํ์ฌ(์ง์ ) ์์ธก์ ์ํ
- ๊ฐ๋จํ๋ฉฐ ์ง๊ด์ ์ด๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋จ
Train
from sklearn.linear_model import LinearRegression lr = LinearRegression() # ์ ํ ํ๊ท ๋ชจ๋ธ ํ๋ จ lr.fit(train_input, train_target)
output : LinearRegression()
prediction
# 50cm ๋์ด์ ๋ํ ์์ธก print(lr.predict([[50]]))
output : [1241.83860323]
- ์ง์ (y = ax + b)์ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ ๊ธฐ์ธ๊ธฐ์ ์ ํธ, ์ฆ a์ b๊ฐ์ด ์์ด์ผํจ
- ์ ํ ํ๊ท ๋ถ์์ ๋ชฉ์ -> ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ์ ์ค๋ช ํ ์ ์๋ a, b๊ฐ์ ์ฐพ๋ ๊ฒ
- LinearRegression ํด๋์ค๊ฐ ์ฐพ์ a, b๊ฐ์ lr ๊ฐ์ฒด์ coef_์ intercept_์ ์ ์ฅ๋์ด ์์
LinearRegression
print(lr.coef_, lr.intercept_)
output.: [39.01714496] -709.0186449535477
- ์ฐพ์ a,b๊ฐ์ ์ด์ฉํ์ฌ ์ ํํจ์๋ฅผ ๊ทธ๋ฆฐ๋ค
# ํ๋ จ ์ธํธ์ ์ฐ์ ๋๋ฅผ ๊ทธ๋ฆฝ๋๋ค plt.scatter(train_input, train_target)
output :
# 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()
output :
- lr score ํ์ธ
print(lr.score(train_input, train_target)) print(lr.score(test_input , test_target))
output :
0.9398463339976041
0.8247503123313559
Loss - ์ ํ ํ๊ท์์ ๋ฐ์ํ๋ ์ค์ฐจ, ์์ค (added by emma)
- ๋ฐ์ดํฐ๋ค์ ์ ์ผ๋ก ํํํ๋ ๊ฒ์ ์ค์ ๋ฐ์ดํฐ์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ๋ฐ์
- ์ค์ฐจ, ์์ค(Loss)
- ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด A๋ 3, B ๋ 1๋งํผ์ ์์ค์ด ๋ฐ์ํจ
- ์๋ฐํ ๋ณด๋ฉด +, -๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ด์ผ๊ธฐ ํ ๊ฒ์
- ์ ๊ณผ ์ค์ ๋ฐ์ดํฐ ์ฌ์ด์ ์ผ๋ง๋ ์ค์ฐจ๊ฐ ์๋์ง ๊ตฌํ๋ ค๋ฉด ์์,์์ ๊ด๊ณ์์ด ๋์ผํ๊ฒ ๋ฐ์๋๋๋ก
- ๋ชจ๋ ์์ค์ ์ ๊ณฑ์ ํด์ฃผ๋๊ฒ ์ข์ (์ ๊ทธ๋ฆผ์ ์ค์ฐจ๋ฅผ ์ ๊ณฑ๊ฐ์ผ๋ก ์ค๋ช ํ๋ฉด A๋ 9, B๋ 1์ด๋ผ๊ณ ๋ณผ ์ ์์)
- ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ค์ ๊ตฌํ๋ ๊ฑธ ํ๊ท ์ ๊ณฑ ์ค์ฐจ(mean squared error, MSE)
- ์์ค์ ๊ตฌํ ๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์
- ์ ๊ณฑํ์ง ์๊ณ ์ ๋๊ฐ์ผ๋ก ํ๊ท ์ ๊ตฌํ๋ ํ๊ท ์ ๋ ์ค์ฐจ(mean absolute error, MAE)
- MSE์ MAE๋ฅผ ์ ์ถฉํ ํ๋ฒ ์์ค(Huber loss), 1-MSE/VAR์ผ๋ก ๊ตฌํ๋ ๊ฒฐ์ ๊ณ์(coefficient of determination) ๋ฑ์ด ์์
- ๊ฒฐ๊ตญ ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ชฉํ : ๋ชจ๋ ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ํ๋๋ ์ค์ฐจ์ ํ๊ท ์ ์ต์ํํ ์ ์๋ ์ต์ ์ ๊ธฐ์ธ๊ธฐ์ ์ ํธ์ ์ฐพ๋ ๊ฒ
- ์์ค์ ์ต์ํ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ : ๊ฒฝ์ฌํ๊ฐ๋ฒ (Gradient Descent)
Linear Regression ์ ํ๊ณ
- ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด lr์ ์ฌ์ฉํ์ฌ ๊ธธ์ด๊ฐ 5cm์ธ ๋์ด๋ฅผ ์์ธกํ์ ๊ฒฝ์ฐ ๋ฌด๊ฒ๊ฐ ์์๊ฐ์ด ๋์ด
- ์ด๋ ํ์ค์์๋ ๋์ฌ ์ ์๋ ๊ฒฝ์ฐ์
Polynomial Regression (๋คํญ์ ํ๊ท)
- ์ด๋ฌํ ํ๊ณ์ ์ ๊ทน๋ณตํ๊ณ ๊ณก์ ์ผ๋ก ์ ํ์ ๊ทธ๋ ค, ๋ณด๋ค ์ต์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ์ ์ ์์
-
์ด์ฐจํจ์๋ฅผ ์ด์ฉ (y = ax^2 + bx + c)
- train set ์์ฑ
๋ํ์ด๋ฅผ ์ด์ฉํ์ฌ x์ ์ ๊ณฑ๊ฐ๊ณผ x๊ฐ์ผ๋ก train set๊ณผ test set ์์ฑ
train_poly = np.column_stack((train_input ** 2, train_input)) test_poly = np.column_stack((test_input ** 2, test_input)) print(train_poly.shape, test_poly.shape)
output : (42, 2) (14, 2)
- train_poly๋ง ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด array๊ฐ ์์ฑ๋จ
train_poly
output:
array([[ 384.16, 19.6 ], [ 484. , 22. ], [ 349.69, 18.7 ], [ 302.76, 17.4 ], [1296. , 36. ], [ 625. , 25. ], [1600. , 40. ], [1521. , 39. ], [1849. , 43. ], [ 484. , 22. ], [ 400. , 20. ], [ 484. , 22. ], [ 576. , 24. ], [ 756.25, 27.5 ], [1849. , 43. ], [1600. , 40. ], [ 576. , 24. ] โฆ
- ๊ธธ์ด๊ฐ 50cm์ธ ๋์ด์ ๋ฌด๊ฒ ์์ธก
prediction
lr = LinearRegression() lr.fit(train_poly, train_target) print(lr.predict([[50**2, 50]]))
output : [1573.98423528]
- y = ax^2 + bx + c ์ ๊ฐ์ ๊ณก์ ํจ์๋ฅผ ๋ง๋ค๊ธฐ ์ํ์ฌ, LinearRegression ํด๋์ค ์ด์ฉํด์ a,b,c ๊ฐ์ ์ฐพ์ ์ ์์
print(lr.coef_, lr.intercept_)
output : [ 1.01433211 -21.55792498] 116.0502107827827
- ์ฐพ์ a,b,c ๊ฐ์ ์ด์ฉํ์ฌ ๋คํญํจ์๋ฅผ ๊ทธ๋ฆฐ๋ค
# ๊ตฌ๊ฐ๋ณ ์ง์ ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด 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()
output :