
ํ๊ท ๋ฐ์ดํฐ ๊ฐ์ด ํ๊ท ๊ณผ ๊ฐ์ ์ผ์ ํ ๊ฐ์ผ๋ก ๋์๊ฐ๋ ค๋ ๊ฒฝํฅ์ ์ด์ฉํ ํต๊ณํ ๊ธฐ๋ฒ
Y = W1*X+W2*X+W3*X ... +Wn*X
Y๋ ์ข ์ ๋ณ์, X๋ ๋ ๋ฆฝ ๋ณ์, W๋ ํ๊ท ๊ณ์
๋ ๋ฆฝ ๋ณ์๋ ํผ์ฒ, ์ข ์๋ณ์๋ ๊ฒฐ์ ๊ฐ
๋จธ์ ๋ฌ๋ ํ๊ท ์์ธก์ ํต์ฌ์ ์ฃผ์ด์ง ํผ์ฒ์ ๊ฒฐ์ ๊ฐ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์์ ํ์ต์ ํตํด ์ต์ ์ ํ๊ท ๊ณ์๋ฅผ ์ฐพ์๋ด๋ ๊ฒ

์ง๋ํ์ต์ ๋ถ๋ฅ์ ํ๊ท๋ก ๋๋จ. ๋ถ๋ฅ๋ ์์ธก๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ์ ๊ฐ์ ์ด์ฐํ ํด๋์ค ๊ฐ์ด๊ณ , ํ๊ท๋ ์ฐ์ํ ์ซ์ ๊ฐ
์ ํ ํ๊ท ๋ชจ๋ธ ์ข ๋ฅ
- ์ผ๋ฐ ์ ํ ํ๊ท
์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ RSS๋ฅผ ์ต์ํ ํ ์ ์๋๋ก ํ๊ท ๊ณ์๋ฅผ ์ต์ ํํ๋ฉฐ, ๊ท์ ๋ฅผ ์ ์ฉํ์ง ์์ ๋ชจ๋ธ- ๋ฆฟ์ง
์ ํํ๊ท์ L2 ๊ท์ ๋ฅผ ์ถ๊ฐํ ํ๊ท ๋ชจ๋ธ. ๋ฆฟ์ง ํ๊ท๋ L2๊ท์ ๋ฅผ ์ ์ฉํ๋๋ฐ, L2 ๊ท์ ๋ ์๋์ ์ผ๋ก ํฐ ํ๊ท ๊ณ์๊ฐ์ ์์ธก์ํฅ๋๋ฅผ ๊ฐ์์ํค๊ธฐ ์ํด์ ํ๊ท ๊ณ์๊ฐ์ ๋ ์๊ฒ ๋ง๋๋ ๊ท์ ๋ชจ๋ธ- ๋ผ์
๋ผ์ ํ๊ท๋ ์ ํํ๊ท์ L1 ๊ท์ ๋ฅผ ์ ์ฉํ ๋ฐฉ์. L2 ๊ท์ ๊ฐ ํ๊ท ๊ณ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐํด L1 ๊ท์ ๋ ์์ธก ์ํฅ๋ ฅ์ด ์์ ํผ์ฒ์ ํ๊ท ๊ณ์๋ฅผ 0์ผ๋ก ๋ง๋ค์ด ํ๊ท ์์ธก ์ ํผ์ฒ๊ฐ ์ ํ๋์ง ์๊ฒ ํ๋ ๊ฒ.- ์๋ผ์คํฑ๋ท
L2, L1 ๊ท์ ๋ฅผ ํจ๊ป ๊ฒฐํฉํ ๋ชจ๋ธ- ๋ก์ง์คํฑ ํ๊ท
์ฌ์ค์ ๋ถ๋ฅ์ ์ฌ์ฉ๋๋ ์ ํ๋ชจ๋ธ๋ก ๋งค์ฐ ๊ฐ๋ ฅํ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ. ์ด์ง ๋ถ๋ฅ๋ฟ๋ง์ด ์๋๋ผ ํฌ์ ์์ญ์ ๋ถ๋ฅ, ํ ์คํธ ๋ถ๋ฅ์ ๊ฐ์ ์์ญ์์ ๋ฐ์ด๋ ์์ธก ์ฑ๋ฅ์ ๋ณด์.
ํ๊ท ๋ชจ๋ธ์ 1์ฐจ ํจ์๋ก ๋ชจ๋ธ๋ง ํ๋ค๋ฉด ํจ์ ๊ฐ์์ ์ค์ ๊ฐ๋งํผ์ ์ค๋ฅ๊ฐ์ ๋ณด์ ํ๋งํผ์ด ์ค์ ๊ฐ.
์ค์ ๊ฐ๊ณผ ํ๊ท ๋ชจ๋ธ์ ์ฐจ์ด์ ๋ฐ๋ฅธ ์ค๋ฅ ๊ฐ์ ์์ฐจ๋ผ ๋ถ๋ฆ. ์ต์ ์ ํ๊ท ๋ชจ๋ธ์ ๋ง๋ ๋ค๋ ๊ฒ์ ๋ฐ๋ก ์ ์ฒด ๋ฐ์ดํฐ์ ์์ฐจ ํฉ์ด ์ต์๊ฐ ๋๋ ๋ชจ๋ธ์ ๋ง๋ ๋ค๋ ์๋ฏธ
์ค๋ฅ ๊ฐ์ ๋ณด์ ํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง๋ Mean Absolute Error(์ ๋๊ฐ์ ์ทจํด์ ๋ํ๊ฑฐ๋), RSS(์ค๋ฅ ๊ฐ์ ์ ๊ณฑ์ ๊ตฌํด์ ๋ํ๋ ๋ฐฉ์) . ์ผ๋ฐ์ ์ผ๋ก RSS๋ฅผ ์ฌ์ฉํ๋ค.

RSS ๋น์ฉ์ด๋ฉฐ w ๋ณ์๋ก ๊ตฌ์ฑ๋๋ RSS๋ฅผ ๋น์ฉ ํจ์
๋น์ฉ ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ ์ง์ํด์ ๊ฐ์์ํค๊ณ ์ต์ข
์ ์ผ๋ก ๋ ์ด์ ๊ฐ์ํ์ง ์๋ ์ต์์ ์ค๋ฅ ๊ฐ์ ๊ตฌํ๋ ๊ฒ
๋ฐ๋ณต์ ์ผ๋ก ๋น์ฉ ํจ์์ ๋ฐํ ๊ฐ, ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๊ฐ ์์์ง๋ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๊ณ W ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ํด์ ๋ณด์ ํด ๋๊ฐ
์ค๋ฅ ๊ฐ์ด ๋ ์ด์ ์์์ง์ง ์์ผ๋ฉด ๊ทธ ์ค๋ฅ ๊ฐ์ ์ต์ ๋น์ฉ์ผ๋ก ํ๋จํ๊ณ ๊ทธ๋์ W ๊ฐ์ ์ต์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐํํจ.
- w1, w0๋ฅผ ์์์ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์ฒซ ๋น์ฉ ํจ์์ ๊ฐ์ ๊ณ์ฐ
- w1์ w1+ํ์ต๊ฐ, w0์ w0+ํ์ต๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํ ํ ๋ค์ ๋น์ฉํจ์์ ๊ฐ์ ๊ณ์ฐ
- ๋น์ฉ ํจ์๊ฐ ๊ฐ์ํ๋ ๋ฐฉํฅ์ฑ์ผ๋ก ์ฃผ์ด์ง ํ์๋งํผ Step 2๋ฅผ ๋ฐ๋ณตํ๋ฉด์ w1, w0๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ
(ํ์ต๊ฐ)

def get_cost(y, y_pred):
N = len(y)
cost = np.sum(np.square(y-y_pred))/N
return cost
w1, w0 = gradient_descent_steps(X, y, iters=1000)
print("w1:{0:.3f} w0:{1:.3f}".format(w1[0,0], w0[0,0]))
y_pred = w1[0,0]*X + w0
print('Gradient Descent Total Cost:{0:.4f}'.format(get_cost(y, y_pred)))

def get_cost(y, y_pred):
N = len(y)
cost = np.sum(np.square(y-y_pred))/N
return cost
์๋ก์ด w1๊ณผ w0์ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฉํ๋ฉด์ w1๊ณผ w0์ ์ ๋ฐ์ดํธ, ndarray์ด๋ฏ๋ก ํ๋ ฌ ์์ค์์ ๋ด์ ์ฐ์ฐ ํ์
# ์
๋ ฅ ์ธ์ iters๋ก ์ฃผ์ด์ง ํ์๋งํผ ๋ฐ๋ณต์ ์ผ๋ก w1๊ณผ w0๋ฅผ ์
๋ฐ์ดํธ ์ ์ฉํจ
def gradient_descent_steps(X, y, iters=10000):
# w0์ w1์ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ
w0 = np.zeros((1,1))
w1 = np.zeros((1,1))
#์ธ์๋ก ์ฃผ์ด์ง iters ๋งํผ ๋ฐ๋ณต์ ์ผ๋ก get_weight_updates() ํธ์ถํด w1, w0 ์
๋ฐ์ดํธ ์ํ
for ind in range(iters):
w1_update, w0_update = get_weight_updates(w1, w0, X, y, learning_rate=0.01)
w1 = w1 - w1_update
w0 = w0 - w0_update
return w1, w0
์ผ๋ฐ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ํ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ค์ ์์๋ ๋๋ถ๋ถ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ ์ฌ์ฉ. ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ด์ฉํด w๊ฐ ์
๋ฐ์ดํธ๋๋ ๊ฐ์ ๊ณ์ฐ
์ ์ฒด X, y ๋ฐ์ดํฐ์์ ๋๋คํ๊ฒ batch_size๋งํผ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
def stochastic_gradient_descent_steps(X, y, batch_size=10, iters=1000):
w0 = np.zeros((1,1))
w1 = np.zeros((1,1))
for ind in range(iters):
np.random.seed(ind)
#์ ์ฒด X,y ๋ฐ์ดํฐ์์ ๋๋คํ๊ฒ batch_size๋งํผ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํด sample_X, sample_y๋ก ์ ์ฅ
stochastic_random_index = np.random.permutation(X.shape[0])
sample_X = X[stochastic_random_index[0:batch_size]]
sample_y = y[stochastic_random_index[0:batch_size]]
#๋๋คํ๊ฒ batch_size๋งํผ ์ถ์ถ๋ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก w1_ypdate, w0_update ๊ณ์ฐ ํ ์
๋ฐ์ดํธ
w1_update, w0_update = get_weight_updates(w1, w0, sample_X, sample_y, learning_rate=0.01)
w1= w1 - w1_update
w0= w0 - w0_update
return w1, w0
ํผ์ฒ๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ ํ์ฅํ๊ฒ ์ ์ฌํ๊ฒ ๋์ถ
ํผ์ฒ๊ฐ M๊ฐ๋ผ๋ฉด ๊ทธ์ ๋ฐ๋ฅธ ํ๊ท ๊ณ์๋ M+1๊ฐ๋ก ๋์ถ(1๊ฐ๋ w_0)

์์ธก ํ๊ท์(1๋ฒ์งธ ์ค)์ ์์ธก ํ๋ ฌ (2๋ฒ์งธ ์ค)๋ก ๊ตฌํ ์ ์์

์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ RSS๋ฅผ ์ต์ํํด OLS ์ถ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ํด๋์ค

ํ๊ท ํ๊ฐ ์งํ
์ฌ์ดํท๋ฐ์ RMSE๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก RMSE๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ MSE์ ์ ๊ณฑ๊ทผ์ ์์์ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ง์ ๋ง๋ค์ด์ผ ํจ.
neg_mean_absolute_errorโ ๏ธ ๋ณด์คํด ๋ฐ์ดํฐ์
์ ์ค๋ฆฌ์ ์ธ ๋ฌธ์ ๋ก load_boston() ์ ๊ทผ ๋ถ๊ฐ
(๊ฐ ํผ์ฒ์ ์ ํ ๊ธฐ์ค๋ ๋น๋๋์ ์ด๋ฉฐ ๊ฐ ํผ์ฒ์ ์ฃผํ ๊ฐ๊ฒฉ์ ๊ด๊ณ๋ฅผ ์ ํ์ฑ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ๋ ์ฌ๋ฐ๋ฅด์ง ๋ชปํจ.)
์์ ์ฝ๋ ์คํX ๊ฒฐ๊ณผ๋ง ์ฐธ๊ณ
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from scipy import stats
from sklearn.datasets import load_boston
import warnings
warnings.filterwarnings('ignore') #์ฌ์ดํท๋ฐ 1.2 ๋ถํฐ๋ ๋ณด์คํด ์ฃผํ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๊ฐ ์์ด์ง๋ค๋ warning ๋ฉ์์ง ์ถ๋ ฅ ์ ๊ฑฐ
%matplotlib inline
# boston ๋ฐ์ดํ์
๋ก๋
boston = load_boston()
# boston ๋ฐ์ดํ์
DataFrame ๋ณํ
bostonDF = pd.DataFrame(boston.data , columns = boston.feature_names)
# boston dataset์ target array๋ ์ฃผํ ๊ฐ๊ฒฉ์. ์ด๋ฅผ PRICE ์ปฌ๋ผ์ผ๋ก DataFrame์ ์ถ๊ฐํจ.
bostonDF['PRICE'] = boston.target
print('Boston ๋ฐ์ดํ์
ํฌ๊ธฐ :',bostonDF.shape)
bostonDF.head()
์นผ๋ผ๊ณผ PRICE์ ์๊ด๊ด๊ณ ํ์

RM์ ์ ๋ฐฉํฅ์ ์ ํ์ฑ์ด ๊ฐ์ฅ ํฌ๊ณ LSAT๋ ์ ๋ฐฉํฅ์ ์ ํ์ฑ์ด ๊ฐ์ฅ ํผ.
LinearRegression ํด๋์ค๋ฅผ ์ด์ฉํด ๋ณด์คํด ์ฃผํ ๊ฐ๊ฒฉ์ ํ๊ท ๋ชจ๋ธ์ ์์ฑ.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
y_target = bostonDF['PRICE']
X_data = bostonDF.drop(['PRICE'],axis=1,inplace=False)
X_train , X_test , y_train , y_test = train_test_split(X_data , y_target ,test_size=0.3, random_state=156)
# Linear Regression OLS๋ก ํ์ต/์์ธก/ํ๊ฐ ์ํ.
lr = LinearRegression()
lr.fit(X_train ,y_train )
y_preds = lr.predict(X_test)
mse = mean_squared_error(y_test, y_preds)
rmse = np.sqrt(mse)
print('MSE : {0:.3f} , RMSE : {1:.3F}'.format(mse , rmse))
print('Variance score : {0:.3f}'.format(r2_score(y_test, y_preds)))
์ ํธ์ LinearRegression ๊ฐ์ฒด์ intercept_ ์์ฑ์, ํ๊ท ๊ณ์๋ coef_์์ฑ์ ์ ์ฅ๋ผ ์์.
๊ต์ฐจ ๊ฒ์ฆ์ผ๋ก MSE์ RMSE๋ฅผ ์ธก์
from sklearn.model_selection import cross_val_score
y_target = bostonDF['PRICE']
X_data = bostonDF.drop(['PRICE'],axis=1,inplace=False)
lr = LinearRegression()
# cross_val_score( )๋ก 5 Fold ์
์ผ๋ก MSE ๋ฅผ ๊ตฌํ ๋ค ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ RMSE ๊ตฌํจ.
neg_mse_scores = cross_val_score(lr, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
rmse_scores = np.sqrt(-1 * neg_mse_scores)
avg_rmse = np.mean(rmse_scores)
# cross_val_score(scoring="neg_mean_squared_error")๋ก ๋ฐํ๋ ๊ฐ์ ๋ชจ๋ ์์
print(' 5 folds ์ ๊ฐ๋ณ Negative MSE scores: ', np.round(neg_mse_scores, 2))
print(' 5 folds ์ ๊ฐ๋ณ RMSE scores : ', np.round(rmse_scores, 2))
print(' 5 folds ์ ํ๊ท RMSE : {0:.3f} '.format(avg_rmse))
๊ณ์ฐ๋ MSE(neg_mean_squared_error)์ -1์ ๊ณฑํด์ ๋ฐํ (๊ทธ๋์ผ ์์ ๊ฐ)
๋คํญํ๊ท
๋คํญํ๊ท๋ ์ ํํ๊ท ํจ์์ด๋ค.

๋คํญ ํ๊ท ์ญ์ ์ ํํ๊ท์ด๊ธฐ ๋๋ฌธ์ ๋น์ ํ ํจ์๋ฅผ ์ ํ ๋ชจ๋ธ์ ์ ์ฉ์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๊ตฌํ
1. PolynomialFeature ํด๋์ค๋ฅผ ํตํด ํผ์ฒ๋ฅผ Polynomial ํผ์ฒ๋ก ๋ณํ
๋จํญ์ ํผ์ฒ๋ฅผ degree์ ํด๋นํ๋ ๋คํญ์ ํผ์ฒ๋ก ๋ณํ
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
# ๋คํญ์์ผ๋ก ๋ณํํ ๋จํญ์ ์์ฑ, [[0,1],[2,3]]์ 2X2 ํ๋ ฌ ์์ฑ
X = np.arange(4).reshape(2,2)
print('์ผ์ฐจ ๋จํญ์ ๊ณ์ feature:\n',X )
# degree = 2 ์ธ 2์ฐจ ๋คํญ์์ผ๋ก ๋ณํํ๊ธฐ ์ํด PolynomialFeatures๋ฅผ ์ด์ฉํ์ฌ ๋ณํ
poly = PolynomialFeatures(degree=2)
poly.fit(X)
poly_ftr = poly.transform(X)
print('๋ณํ๋ 2์ฐจ ๋คํญ์ ๊ณ์ feature:\n', poly_ftr)
[Output]
์ผ์ฐจ ๋จํญ์ ๊ณ์ feature:
[[0 1]
[2 3]]
๋ณํ๋ 2์ฐจ ๋คํญ์ ๊ณ์ feature:
[[1. 0. 1. 0. 0. 1.]
[1. 2. 3. 4. 6. 9.]]
์ ๋ ฅ๋ x1=0, x2=1์ ๋ํ 2์ฐจ ๋คํญ ๊ณ์ [1, x_1, x_2, x_1^2, x_1*x_2, x_2^2]๋ฅผ return
2. ๋คํญ์ ๊ณ์ feature์ ๋คํญ์ ๊ฒฐ์ ๊ฐ์ผ๋ก Linear Regression ํ์ต
๋คํญ์ ๊ณ์ feature์ ์์์ PolynomialFeature๋ก ๊ตฌํ ๊ณ์
๋คํญ์ ๊ฒฐ์ ๊ฐ์ ์๋ ํจ์ ๋์
๊ฐ (์์ธก๊ฐ์ด ์๋ ์ค์ ํจ์์ ๋์
ํ ์ค์ ๊ฐ)
์ฌ์ดํท๋ฐ์ PolynomialFeatures๋ก ํผ์ฒ๋ฅผ ๋ณํํ ํ์ LinearRegression ํด๋์ค๋ก ๋คํญํ๊ท๋ฅผ ๊ตฌํ
์ผ๋ฐ์ ์ผ๋ก Pipeline ๊ฐ์ฒด๋ฅผ ์ด์ฉํด 1 & 2๋จ๊ณ๋ฅผ ํ๋ฒ์ ๊ตฌํ
# Pipeline ๊ฐ์ฒด๋ก Streamline ํ๊ฒ Polynomial Feature๋ณํ๊ณผ Linear Regression์ ์ฐ๊ฒฐ
model = Pipeline([('poly', PolynomialFeatures(degree=3)),
('linear', LinearRegression())])
๋คํญ ํ๊ท์ ์ฐจ์๋ฅผ ๋์ผ ์๋ก ํ์ต๋ฐ์ดํฐ์๋ง ๋๋ฌด ๋ง์ถ ํ์ต์ด ์ด๋ค์ ธ์ ๊ณผ์ ํฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์
ํผ์ฒ X์ target y๊ฐ ์ก์์ด ํฌํจ๋ ์ฝ์ฌ์ธ ๊ทธ๋ํ ๊ด๊ณ๋ฅผ ๊ฐ์ง. ๋คํญํ๊ท์ ์ฐธ์๋ฅผ ๋ณํ์ํค๋ฉด์ ๊ทธ์ ๋ฐ๋ฅธ ํ๊ท ์์ธก ๊ณก์ ๊ณผ ์์ธก ์ ํ๋๋ฅผ ๋น๊ตํ๋ ์์
target y = X์ ์ฝ์ฌ์ธ ๊ฐ + ์ฝ๊ฐ์ ์ก์ ๋ณ๋
# ์์์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ X๊ฐ์ ๋ํด ์ฝ์ฌ์ธ ๋ณํ ๊ฐ์ ๋ฐํ.
def true_fun(X):
return np.cos(1.5 * np.pi * X)
# X๋ 0๋ถํฐ 1๊น์ง 30๊ฐ์ ์์์ ๊ฐ์ ์์๋๋ก ์ํ๋งํ ๋ฐ์ดํฐ์
๋๋ค.
np.random.seed(0)
n_samples = 30
X = np.sort(np.random.rand(n_samples))
# y ๊ฐ์ ์ฝ์ฌ์ธ ๊ธฐ๋ฐ์ true_fun()์์ ์ฝ๊ฐ์ ๋
ธ์ด์ฆ ๋ณ๋ ๊ฐ์ ๋ํ ๊ฐ์
๋๋ค.
y = true_fun(X) + np.random.randn(n_samples) * 0.1
cross_val_score()๋ก MSE ๊ฐ ๊ตฌํด ์ฐจ์๋ณ ์์ธก ์ฑ๋ฅ ๋น๊ต
(์ค์ ์ด ๋คํญํ๊ท ์์ธก ๊ณก์ / ์ ์ ์ด ์ค์ ๋ฐ์ดํฐ ์ธํธ X, Y์ ์ฝ์ฌ์ธ ๊ณก์ )
- Degree1 (MSE=0.41)
๋๋ฌด ๋จ์ํ ์ง์ ๋ชจ๋ธ. ์์ธก ๊ณก์ ์ด ํ์ต ๋ฐ์ดํฐ์ ํจํด์ ์ ๋๋ก ๋ฐ์ํ์ง ๋ชปํ๊ณ ์๋ ๊ณผ์์ ํฉ ๋ชจ๋ธ- Degree4 (MSE=0.04)
ํ์ต ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋น๊ต์ ์ ๋ฐ์ํด ์ฝ์ฌ์ธ ๊ณก์ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์์ธกํ ๊ณก์ ์ ๊ฐ์ง ๋ชจ๋ธ์ด ๋จ- Degree (MSE=182581084.83)
์์ธก ๊ณก์ ์ด ํ์ต ๋ฐ์ดํฐ ์ธํธ๋ง ์ ํํ ์์ธกํ๊ณ , ํ ์คํธ ๊ฐ์ ์ค์ ๊ณก์ ๊ณผ๋ ์์ ํ ๋ค๋ฅธ ํํ์ ์์ธก ๊ณก์ ์ด ๋ง๋ค์ด์ง
๊ณ ํธํฅ - ๋งค์ฐ ๋จ์ํ๋ ๋ชจ๋ธ๋ก ์ง๋์น๊ฒ ํ ๋ฐฉํฅ์ฑ์ผ๋ก ์น์ฐ์น ๊ฒฝํฅ ์กด์ฌ
๊ณ ๋ถ์ฐ - ๋งค์ฐ ๋ณต์กํ ๋ชจ๋ธ๋ก ์ง๋์น๊ฒ ๋์ ๋ณ๋์ฑ์ ๊ฐ์ง


ํธํฅ๊ณผ ๋ถ์ฐ์ด ์๋ก ํธ๋ ์ด๋ ์คํ๋ฅผ ์ด๋ฃจ๋ฉด์ ์ค๋ฅ Cost ๊ฐ์ด ์ต๋๋ก ๋ฎ์์ง๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ ๋จธ์ ๋ฌ๋ ์์ธก ๋ชจ๋ธ์ ๋ง๋๋ ๋ฐฉ๋ฒ
์ด๋๋์์ RSS๋ฅผ ์ต์ํํ๋ ๊ฒ๋ง ๊ณ ๋ ค. ํ์ต ๋ฐ์ดํฐ์ ์ง๋์น๊ฒ ๋ง์ถ๊ฒ ๋๊ณ , ํ๊ท ๊ณ์๊ฐ ์ฝ๊ฒ ์ปค์ง.
RSS ์ต์ํ ๋ฐฉ๋ฒ๊ณผ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๊ท ๊ณ์ ๊ฐ์ด ์ปค์ง์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ ์ฌ์ด ๊ท ํ ํ์

alpha๋ ํ์ต ๋ฐ์ดํฐ ์ ํฉ ์ ๋์ ํ๊ท ๊ณ์ ๊ฐ์ ํฌ๊ธฐ ์ ์ด๋ฅผ ์ํํ๋ ํ๋ ํ๋ผ๋ฏธํฐ
alpha๊ฐ 0์ด๋ผ๋ฉด ๊ธฐ์กด๊ณผ ๋์ผํ ์ (๊ท์ ๋ฅผ ์ ์ฉํ์ง ์์ ์)
alpha๊ฐ ๋ฌดํ๋๋ผ๋ฉด ๋น์ฉํจ์ ์์์ W ๊ท์ ๋ ๋งค์ฐ ์ปค์ ธ 0์ผ๋ก ์๋ ด
๋น์ฉํจ์์ alpha ๊ฐ์ผ๋ก ํจ๋ํฐ๋ฅผ ๋ถ์ฌํด ํ๊ท ๊ณ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์์์ผ ๊ณผ์ ํฉ์ ๊ฐ์ ํ๋ ๋ฐฉ์์ ๊ท์ (Regularization)๋ผ๊ณ ๋ถ๋ฆ
alpha L2 ๊ท์ ๊ณ์ - L2 ๊ท์ ํ๋ ํน์ alpha ์ ์

๋ฆฟ์ง ํ๊ท๋ alpha ๊ฐ์ด ์ปค์ง ์๋ก ํ๊ท ๊ณ์ ๊ฐ์ ์๊ฒ ๋ง๋ฆ
๊ฐ ํผ์ฒ์ ๋ํ ๊ฐ๋ก๋ง๋๋ ํ๊ท ๊ณ์ ์๋ฏธ
# ๊ฐ alpha์ ๋ฐ๋ฅธ ํ๊ท ๊ณ์ ๊ฐ์ ์๊ฐํํ๊ธฐ ์ํด 5๊ฐ์ ์ด๋ก ๋ ๋งทํ๋กฏ๋ฆฝ ์ถ ์์ฑ
fig , axs = plt.subplots(figsize=(18,6) , nrows=1 , ncols=5)
# ๊ฐ alpha์ ๋ฐ๋ฅธ ํ๊ท ๊ณ์ ๊ฐ์ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ธฐ ์ํ DataFrame ์์ฑ
coeff_df = pd.DataFrame()
# alphas ๋ฆฌ์คํธ ๊ฐ์ ์ฐจ๋ก๋ก ์
๋ ฅํด ํ๊ท ๊ณ์ ๊ฐ ์๊ฐํ ๋ฐ ๋ฐ์ดํฐ ์ ์ฅ. pos๋ axis์ ์์น ์ง์
for pos , alpha in enumerate(alphas) :
ridge = Ridge(alpha = alpha)
ridge.fit(X_data , y_target)
# alpha์ ๋ฐ๋ฅธ ํผ์ฒ๋ณ ํ๊ท ๊ณ์๋ฅผ Series๋ก ๋ณํํ๊ณ ์ด๋ฅผ DataFrame์ ์ปฌ๋ผ์ผ๋ก ์ถ๊ฐ.
coeff = pd.Series(data=ridge.coef_ , index=X_data.columns )
colname='alpha:'+str(alpha)
coeff_df[colname] = coeff
# ๋ง๋ ๊ทธ๋ํ๋ก ๊ฐ alpha ๊ฐ์์์ ํ๊ท ๊ณ์๋ฅผ ์๊ฐํ. ํ๊ท ๊ณ์๊ฐ์ด ๋์ ์์ผ๋ก ํํ
coeff = coeff.sort_values(ascending=False)
axs[pos].set_title(colname)
axs[pos].set_xlim(-3,6)
sns.barplot(x=coeff.values , y=coeff.index, ax=axs[pos])
# for ๋ฌธ ๋ฐ๊นฅ์์ ๋งทํ๋กฏ๋ฆฝ์ show ํธ์ถ ๋ฐ alpha์ ๋ฐ๋ฅธ ํผ์ฒ๋ณ ํ๊ท ๊ณ์๋ฅผ DataFrame์ผ๋ก ํ์
plt.show()

alpha๊ฐ ์ปค์ง์๋ก ํ๊ท ๊ณ์๊ฐ ๊ฐ์ํจ์ ํ์ธ ๊ฐ๋ฅ

(์ฌ์ง ์ถ์ฒ : ํฐ์คํ ๋ฆฌ)

L1 ๊ท์ ๋ alpha *||W|| ์๋ฏธ. ์ ์ ํ ํผ์ฒ๋ง ํ๊ท์ ํฌํจ์ํค๋ ํผ์ฒ ์ ํ์ ํน์ฑ ๊ฐ์ง
L1 ๊ท์ ์ L2 ๊ท์ ์ ์ฐจ์ด์
L2 ๊ท์ ๊ฐ ํ๊ท ๊ณ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์์ํค๋ ๋ฐํด L1 ๊ท์ ๋ ๋ถํ์ํ ํ๊ท ๊ณ์๋ฅผ ๊ธ๊ฒฉํ๊ฒ ๊ฐ์์์ผ 0์ผ๋ก ๋ง๋ค๊ณ ์ ๊ฑฐ
๋ผ์ ํ๊ท์ ๊ฒฝ์ฐ ์ต์ ๊ฐ์ ๋ชจ์๋ฆฌ ๋ถ๋ถ์์ ๋ํ๋ ํ๋ฅ ์ด ๋ฆฟ์ง์ ๋นํด ๋๊ธฐ ๋๋ฌธ์ ๋ช๋ช ์ ์๋ฏธํ์ง ์์ ๋ณ์๋ค์ ๋ํด ๊ณ์๋ฅผ 0์ ๊ฐ๊น๊ฒ (๋๋ 0) ์ผ๋ก ์ถ์ ํด feature selection์ ํจ๊ณผ ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ผ์๋ ํ๋ผ๋ฏธํฐ์ ํฌ๊ธฐ์ ๊ด๊ณ ์์ด ๊ฐ์ ์์ค์ reularizaton ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ 0์ผ๋ก ๋ง๋ค์ด ํด๋น ๋ณ์๋ฅผ ๋ชจ๋ธ์์ ์ญ์ ํ๊ณ , ๋ฐ๋ผ์ ๋ชจ๋ธ์ ๋จ์ํ๊ฒ ๋ง๋ค์ด์ฃผ๊ณ ํด์์ ์ฉ์ดํ๊ฒ ํ๋ค. (์ถ์ฒ : velog)
from sklearn.linear_model import Lasso, ElasticNet
# alpha๊ฐ์ ๋ฐ๋ฅธ ํ๊ท ๋ชจ๋ธ์ ํด๋ ํ๊ท RMSE๋ฅผ ์ถ๋ ฅํ๊ณ ํ๊ท ๊ณ์๊ฐ๋ค์ DataFrame์ผ๋ก ๋ฐํ
def get_linear_reg_eval(model_name, params=None, X_data_n=None, y_target_n=None,
verbose=True, return_coeff=True):
coeff_df = pd.DataFrame()
if verbose : print('####### ', model_name , '#######')
for param in params:
if model_name =='Ridge': model = Ridge(alpha=param)
elif model_name =='Lasso': model = Lasso(alpha=param)
elif model_name =='ElasticNet': model = ElasticNet(alpha=param, l1_ratio=0.7)
neg_mse_scores = cross_val_score(model, X_data_n,
y_target_n, scoring="neg_mean_squared_error", cv = 5)
avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
print('alpha {0}์ผ ๋ 5 ํด๋ ์ธํธ์ ํ๊ท RMSE: {1:.3f} '.format(param, avg_rmse))
# cross_val_score๋ evaluation metric๋ง ๋ฐํํ๋ฏ๋ก ๋ชจ๋ธ์ ๋ค์ ํ์ตํ์ฌ ํ๊ท ๊ณ์ ์ถ์ถ
model.fit(X_data_n , y_target_n)
if return_coeff:
# alpha์ ๋ฐ๋ฅธ ํผ์ฒ๋ณ ํ๊ท ๊ณ์๋ฅผ Series๋ก ๋ณํํ๊ณ ์ด๋ฅผ DataFrame์ ์ปฌ๋ผ์ผ๋ก ์ถ๊ฐ.
coeff = pd.Series(data=model.coef_ , index=X_data_n.columns )
colname='alpha:'+str(param)
coeff_df[colname] = coeff
return coeff_df
# end of get_linear_regre_eval

(์ฌ์ง ์ถ์ฒ : ํฐ์คํ ๋ฆฌ)
์ผ๋ถ ํผ์ฒ์ ํ๊ท ๊ณ์๋ ์์ 0์ผ๋ก ๋ฐ๋๊ณ ์์
L1 ๊ท์ ์ L2 ๊ท์ ๋ฅผ ๊ฒฐํฉํ ํ๊ท
RSS(W) + alpha2 ||W|| + alpha1 ||W|| ์ ์ต์ํ ํ๋ W ์ฐพ๊ธฐ
(๋ผ์์ ๋ฆฟ์ง์ alpha ๊ฐ์ ๋ค๋ฆ!)
๋ผ์ ํ๊ท์์ ์ค์ ํผ์ฒ๋ฅผ ๊ณ ๋ฅด๊ณ ๋ค๋ฅธ ํผ์ฒ๋ฅผ ๋ชจ๋ ํ๊ท ๊ณ์๋ฅผ 0์ผ๋ก ๋ง๋๋ ์ฑํฅ์ด ๊ฐํจ. ๊ธ๊ฒฉํ ๋ณ๋ํ ์๋ ์๋๋ฐ, ์๋ผ์คํฑ ํ๊ท๋ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด L2 ๊ท์ ๋ฅผ ๋ผ์ ํ๊ท์ ์ถ๊ฐํ ๊ฒ
๋จ์ ์ ์ํ์๊ฐ์ด ์๋์ ์ผ๋ก ์ค๋ ๊ฑธ๋ฆผ
์๋ผ์คํฑ๋ท ๊ท์ a * L1 + b * L2
a = L1 ๊ท์ ์ alpha๊ฐ
b = L2 ๊ท์ ์ alpha๊ฐ
Elastic alpha ํ๋ผ๋ฏธํฐ ๊ฐ = a+b
l1_ratio ํ๋ผ๋ฏธํฐ ๊ฐ = a / (a+b)
์๋ผ์คํฑ๋ท์ ์ฌ์ฉ๋ alpha ํ๋ผ๋ฏธํฐ์ ๊ฐ๋ค์ ์ ์ํ๊ณ get_linear_reg_eval() ํจ์ ํธ์ถ
# l1_ratio๋ 0.7๋ก ๊ณ ์
elastic_alphas = [ 0.07, 0.1, 0.5, 1, 3]
coeff_elastic_df =get_linear_reg_eval('ElasticNet', params=elastic_alphas,
X_data_n=X_data, y_target_n=y_target)

(์ฌ์ง ์ถ์ฒ : ํฐ์คํ ๋ฆฌ)
์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๊ฐ ์ค์ํ๋ค
์ ํ ํ๊ท ๋ชจ๋ธ์ ํผ์ฒ๊ฐ๊ณผ ํ๊น๊ฐ์ ๋ถํฌ๊ฐ ์ ๊ท๋ถํฌ ํํ๋ฅผ ๋งค์ฐ ์ ํธ. ์ ํ ํ๊ท ๋ชจ๋ธ์ ์ ์ฉํ๊ธฐ ์ ์ ๋จผ์ ๋ฐ์ดํฐ์ ๋ํ ์ค์ผ์ผ๋ง/์ ๊ทํ ์์ ์ ์ํํ๋ ๊ฒ์ด ์ผ๋ฐ์
์ ํ ํ๊ท ๋ชจ๋ธ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ ์ข ๋ฅ
1. ์ ๊ทํ ๋ฐฉ๋ฒ 2๊ฐ์ง
StandardScaler ํด๋์ค๋ฅผ ์ด์ฉํด ์ ๊ท๋ถํฌ ๋ฐ์ดํฐ ์ธํธ๋ก ๋ณํํ๊ฑฐ๋ MinMaxScaler ํด๋์ค๋ฅผ ์ด์ฉํด ์ ๊ทํ๋ฅผ ์ํ
2. ์ค์ผ์ผ๋ง/์ ๊ทํ๋ฅผ ์ํํ ๋ฐ์ดํฐ ์ธํธ์ ๋ค์ ๋คํญ ํน์ฑ์ ์ ์ฉํ์ฌ ๋ณํํ๋ ๋ฐฉ๋ฒ
3. ๋ก๊ทธ ๋ณํ
์๋ ๊ฐ์ log ํจ์๋ฅผ ์ ์ฉํ๋ฉด ๋ณด๋ค ์ ๊ท๋ถํฌ์ ๊ฐ๊น์ด ํํ๋ก ๊ฐ์ด ๋ถํฌ
ํ๊น๊ฐ์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ ๋ณํ ์ ์ฉ
from sklearn.preprocessing import StandardScaler, MinMaxScaler, PolynomialFeatures
# method๋ ํ์ค ์ ๊ท ๋ถํฌ ๋ณํ(Standard), ์ต๋๊ฐ/์ต์๊ฐ ์ ๊ทํ(MinMax), ๋ก๊ทธ๋ณํ(Log) ๊ฒฐ์
# p_degree๋ ๋คํฅ์ ํน์ฑ์ ์ถ๊ฐํ ๋ ์ ์ฉ. p_degree๋ 2์ด์ ๋ถ์ฌํ์ง ์์.
def get_scaled_data(method='None', p_degree=None, input_data=None):
if method == 'Standard':
scaled_data = StandardScaler().fit_transform(input_data)
elif method == 'MinMax':
scaled_data = MinMaxScaler().fit_transform(input_data)
elif method == 'Log':
scaled_data = np.log1p(input_data)
else:
scaled_data = input_data
if p_degree != None:
scaled_data = PolynomialFeatures(degree=p_degree,
include_bias=False).fit_transform(scaled_data)
return scaled_data
์ผ๋ฐ์ ์ผ๋ก log()ํจ์๋ณด๋ค 1+log() ํจ์np.log1p() ํจ์ ์ ์ฉ
scale_methods=[(None, None), ('Standard', None), ('Standard', 2),
('MinMax', None), ('MinMax',
[์๋ณธ ๋ฐ์ดํฐ,
ํ์ค ์ ๊ท๋ถํฌ,
ํ์ค ์ ๊ท๋ถํฌ๋ฅผ ๋ค์ 2์ฐจ ๋คํญ์ ๋ณํ,
์ต์๊ฐ/์ต๋๊ฐ ์ ๊ทํ,
์ต์๊ฐ/์ต๋๊ฐ ์ ๊ทํ๋ฅผ ๋ค์ 2์ฐจ ๋คํญ์ ๋ณํ,
๋ก๊ทธ ๋ณํ]
2์ฐจ ๋คํญ์ ๋ณํ - LinearRegression ํ๋ จ ์ 1์ฐจ๊ฐ ์๋ 2์ฐจ๋ก ๋ณํ (์ง๊ธ ์ ๊ณผ์ ์ด 1์ฐจ ์ ํ ํจ์๋ก ์งํ๋๋ ์ค)
[Output]
## ๋ณํ ์ ํ:None, Polynomial Degree:None
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
## ๋ณํ ์ ํ:Standard, Polynomial Degree:None
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
## ๋ณํ ์ ํ:Standard, Polynomial Degree:2
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
## ๋ณํ ์ ํ:MinMax, Polynomial Degree:None
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
## ๋ณํ ์ ํ:MinMax, Polynomial Degree:2
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
## ๋ณํ ์ ํ:Log, Polynomial Degree:None
##### Ridge #####
alpha: 0.1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.788
alpha: 1 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.653
alpha: 10 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.518
alpha: 100 ์ผ ๋ 5 folds์ ํ๊ท RMSE: 5.330
์ผ๋ฐ์ ์ผ๋ก ์ ํ ํ๊ท ์ ์ฉ ๋ฐ์ดํฐ ์ธํธ์ ๋ฐ์ดํฐ ๊ฐ ๋ถํฌ๊ฐ ์ฌํ๊ฒ ์๊ณก๋ ๊ฒฝ์ฐ ๋ก๊ทธ ๋ณํ์ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒฐ๊ณผ ๊ธฐ๋ ๊ฐ๋ฅ
์ ๋ถ๋ฅ๊ฐ ์๋ ํ๊ท์๋ง ๊ท์ ์ ์ฉ?
๋ก์ง์คํฑ ํ๊ท๋ ์ ํ ํ๊ท๋ฐฉ์์ ๋ถ๋ฅ์ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ. ํ์ต์ ํตํด ์ ํ ํจ์์ ์ต์ ์ ์ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ์๊ทธ๋ชจ์ด๋ ํจ์ ์ต์ ์ ์ ์ฐพ๊ณ ์ด ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฐํ ๊ฐ์ ํ๋ฅ ๋ก ๊ฐ์ฃผํด ํ๋ฅ ์ ๋ฐ๋ผ ๋ถ๋ฅ๋ฅผ ๊ฒฐ์ ํ๋ค๋ ๊ฒ (ํ๊ท ๊ฒฐ๊ณผ๊ฐ์ ๋ถ๋ฅ์ ์ฌ์ฉํ๋ค)


๋ก์ง์คํฑ ํ๊ท๋ ํ๊ท ๋ฌธ์ ๊ฐ ์๋ ๋ถ๋ฅ ๋ฌธ์ ์ ์ ํฉ

์ ํํ๊ท ๋ผ์ธ์ 0๊ณผ 1์ ์ ๋๋ก ๋ถ๋ฅํ์ง ๋ชปํ๊ณ ์์ง๋ง ๋ก์ง์คํฑ ํ๊ท๋ ์ ํ ํ๊ท ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋กํ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ์ด์ฉํด ์ฑ๋ฅ์ด ์ข์ ๋ถ๋ฅ๋ฅผ ๋ณด์ด๊ณ ์์. (์ด์ง ๋ถ๋ฅ์ ์ ํ ํ๊ท๋ผ์ธ๋ณด๋ค ์๊ทธ๋ชจ์ด๋ ํจ์ ๋ผ์ธ์ด ์ ํฉ)
- solver ํ๋ผ๋ฏธํฐ
(๋๋ถ๋ถ ์ฌ์ฉ๋๋ 2๊ฐ์ง) :lbfgs,liblinear,
๊ธฐ๋ณธ solver ๊ฐ์ธ lbfgs ๋ณด๋ค๋ liblinear๊ฐ ์ข ๋ ๋น ๋ฅด๊ฒ ์ํ๋๋ฉฐ ์ํ์ฑ๋ฅ์ด ๋ ๋์ ๊ฒฐ๊ณผ ๋ณด์.
newton-cg,sag(๊ฒฝ์ฌ ํ๊ฐ๋ฒ ๊ธฐ๋ฐ์ ์ต์ ํ๋ฅผ ์ ์ฉ),saga(L1 ์ ๊ทํ)- ์ฃผ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ
penalty- ๊ท์ ์ ์ ํ์ ์ค์ (default=l2, 'l2'= L2๊ท์ , 'l1' = L1 ๊ท์ )
C- 1/alpha (C๊ฐ์ด ์์ ์๋ก ๊ท์ ๊ฐ๋๊ฐ ํผ)
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# StandardScaler( )๋ก ํ๊ท ์ด 0, ๋ถ์ฐ 1๋ก ๋ฐ์ดํฐ ๋ถํฌ๋ ๋ณํ
scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer.data)
X_train , X_test, y_train , y_test = train_test_split(data_scaled, cancer.target, test_size=0.3, random_state=0)
๋ก์ง์คํฑ ํ๊ท ํ์ต ๋ฐ ์์ธก ์ํ
์๊ทธ๋ชจ์ด๋ ํจ์๋ก 2๊ฐ ํด๋์ค๋ก ์๋ ๋ถ๋ฅ
์ ํ๋์ ROC-AUC ๊ฐ ๊ณ์ฐ
from sklearn.metrics import accuracy_score, roc_auc_score
# ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ด์ฉํ์ฌ ํ์ต ๋ฐ ์์ธก ์ํ.
# solver์ธ์๊ฐ์ ์์ฑ์๋ก ์
๋ ฅํ์ง ์์ผ๋ฉด solver='lbfgs'
lr_clf = LogisticRegression() # solver='lbfgs'
lr_clf.fit(X_train, y_train)
lr_preds = lr_clf.predict(X_test)
lr_preds_proba = lr_clf.predict_proba(X_test)[:, 1]
# accuracy์ roc_auc ์ธก์
print('accuracy: {0:.3f}, roc_auc:{1:.3f}'.format(accuracy_score(y_test, lr_preds),
roc_auc_score(y_test , lr_preds_proba)))
[Output]
accuracy: 0.977, roc_auc:0.995
๋ก์ง์คํฑ ํ๊ท๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด์ง๋ง, ์ด์ง ๋ถ๋ฅ ์์ธก ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ด์ง ๋ถ๋ฅ์ ๊ธฐ๋ณธ๋ชจ๋ธ๋ก ์ฃผ๋ก ์ฌ์ฉ
(์ด์ ๊น์ง๋...)
์ ํ ํ๊ท๋ ํ๊ท ๊ณ์๋ฅผ ์ ํ์ผ๋ก ๊ฒฐํฉํ๋ ํ๊ท ํจ์๋ฅผ ๊ตฌํด, ์ฌ๊ธฐ์ ๋ ๋ฆฝ๋ณ์๋ฅผ ์ ๋ ฅํด ๊ฒฐ๊ด๊ฐ์ ์์ธกํ๋ ๊ฒ. ๋น์ ํ ํ๊ท๋ ๋น์ ํ์ผ๋ก ํ๊ท ๊ณ์๋ฅผ ๊ฒฐํฉํด ๊ฒฐ๊ด๊ฐ์ ์์ธก
๋ถ๋ฅ ํธ๋ฆฌ๊ฐ ํน์ ํด๋์ค ๋ ์ด๋ธ์ ๊ฒฐ์ ํ๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ ํ๊ท ํธ๋ฆฌ๋ ๋ฆฌํ ๋ ธ๋์ ์ํ ๋ฐ์ดํฐ ๊ฐ์ ํ๊ท ๊ฐ์ ๊ตฌํด ํ๊ท ์์ธก๊ฐ์ ๊ณ์ฐ


๊ฒฐ์ ํธ๋ฆฌ, ๋๋ค ํฌ๋ ์คํธ, GBM, XGBoost, LightGBM ๋ฑ ๋ถ๋ฅ์์ ์ฌ์ฉํ ํธ๋ฆฌ ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฅ๋ฟ๋ง ์๋๋ผ ํ๊ท๋ ๊ฐ๋ฅ (CART ์๊ณ ๋ฆฌ์ฆ, Classification And Regression Trees)

def get_model_cv_prediction(model, X_data, y_target):
neg_mse_scores = cross_val_score(model, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
rmse_scores = np.sqrt(-1 * neg_mse_scores)
avg_rmse = np.mean(rmse_scores)
print('##### ',model.__class__.__name__ , ' #####')
print(' 5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : {0:.3f} '.format(avg_rmse))
์ ๋ ฅ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ต์ฐจ๊ฒ์ฆ์ผ๋ก RMSE ๊ณ์ฐ
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import GradientBoostingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
dt_reg = DecisionTreeRegressor(random_state=0, max_depth=4)
rf_reg = RandomForestRegressor(random_state=0, n_estimators=1000)
gb_reg = GradientBoostingRegressor(random_state=0, n_estimators=1000)
xgb_reg = XGBRegressor(n_estimators=1000)
lgb_reg = LGBMRegressor(n_estimators=1000)
# ํธ๋ฆฌ ๊ธฐ๋ฐ์ ํ๊ท ๋ชจ๋ธ์ ๋ฐ๋ณตํ๋ฉด์ ํ๊ฐ ์ํ
models = [dt_reg, rf_reg, gb_reg, xgb_reg, lgb_reg]
for model in models:
get_model_cv_prediction(model, X_data, y_target)
[Output]
##### DecisionTreeRegressor #####
5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : 5.978
##### RandomForestRegressor #####
5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : 4.423
##### GradientBoostingRegressor #####
5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : 4.269
##### XGBRegressor #####
5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : 4.251
##### LGBMRegressor #####
5 ๊ต์ฐจ ๊ฒ์ฆ์ ํ๊ท RMSE : 4.646
ํ๊ท ํธ๋ฆฌ Regressor๊ฐ ์ด๋ป๊ฒ ์์ธก๊ฐ์ ํ๋จํ๋ ์ง ์ ํํ๊ท์ ๋น๊ตํด ์๊ฐํ
import numpy as np
from sklearn.linear_model import LinearRegression
# ์ ํ ํ๊ท์ ๊ฒฐ์ ํธ๋ฆฌ ๊ธฐ๋ฐ์ Regressor ์์ฑ. DecisionTreeRegressor์ max_depth๋ ๊ฐ๊ฐ 2, 7
lr_reg = LinearRegression()
rf_reg2 = DecisionTreeRegressor(max_depth=2)
rf_reg7 = DecisionTreeRegressor(max_depth=7)
# ์ค์ ์์ธก์ ์ ์ฉํ ํ
์คํธ์ฉ ๋ฐ์ดํฐ ์
์ 4.5 ~ 8.5 ๊น์ง 100๊ฐ ๋ฐ์ดํฐ ์
์์ฑ.
X_test = np.arange(4.5, 8.5, 0.04).reshape(-1, 1)
# ๋ณด์คํด ์ฃผํ๊ฐ๊ฒฉ ๋ฐ์ดํฐ์์ ์๊ฐํ๋ฅผ ์ํด ํผ์ฒ๋ RM๋ง, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ๋ฐ์ดํฐ์ธ PRICE ์ถ์ถ
X_feature = bostonDF_sample['RM'].values.reshape(-1,1)
y_target = bostonDF_sample['PRICE'].values.reshape(-1,1)
# ํ์ต๊ณผ ์์ธก ์ํ.
lr_reg.fit(X_feature, y_target)
rf_reg2.fit(X_feature, y_target)
rf_reg7.fit(X_feature, y_target)
pred_lr = lr_reg.predict(X_test)
pred_rf2 = rf_reg2.predict(X_test)
pred_rf7 = rf_reg7.predict(X_test)
๊ฒฐ์ ํธ๋ฆฌ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ์ธ max_depth ์์ธก๊ฐ ํ์ธ

ํ๊ทํธ๋ฆฌ์ ๊ฒฝ์ฐ ๋ถํ ๋๋ ๋ฐ์ดํฐ ์ง์ ์ ๋ฐ๋ผ ๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด์ ๊ณ๋จ ํํ๋ก ํ๊ท์ ์ ์์ฑ