๐ ํ๊ท๋ถ์
- ๋ฐ์ดํฐ ๊ฐ์ด ํ๊ท ๊ณผ ๊ฐ์ ์ผ์ ํ ๊ฐ์ผ๋ก ๋์๊ฐ๋ ค๋ ๊ฒฝํฅ์ ์ด์ฉํ ํต๊ณํ ๊ธฐ๋ฒ
- ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ณ์์ ํ ๊ฐ์ ์ข ์๋ณ์ ๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋ง ํ๋ ๊ธฐ๋ฒ์ ํต์นญํ๋ค.
- ์ข ์๋ณ์๋ ์ซ์๊ฐ(์ฐ์๊ฐ) ์ด๋ค.
- ๋จธ์ ๋ฌ๋ ํ๊ท ์์ธก์ ํต์ฌ์ '์ต์ ์ ํ๊ท๊ณ์' ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ!
๋ ๋ฆฝ๋ณ์์ ๊ฐ์ | ํ๊ท ๊ณ์์ ๊ฒฐํฉ |
1๊ฐ : ๋จ์ผํ๊ท | ์ ํ : ์ ํ ํ๊ท |
์ฌ๋ฌ๊ฐ : ๋ค์ค ํ๊ท | ๋น์ ํ : ๋น์ ํ ํ๊ท |
- ํ๊ท ๋ถ์์ objective : RSS (์ค์ฐจ์ ๊ณฑํฉ) ์ ์ต์๋กํ๋ ํ๊ท ๋ณ์ (w) ์ฐพ๊ธฐ
03. ๊ฒฝ์ฌํ๊ฐ๋ฒ
๐ ๊ฐ์
๐ก ๊ฒฝ์ฌํ๊ฐ๋ฒ
- ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ด ์ค์ค๋ก ํ์ตํ๋ค๋ ๊ฐ๋ ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค ํต์ฌ ๊ธฐ๋ฒ
- ์ ์ง์ ์ผ๋ก ๋ฐ๋ณต์ ์ธ ๊ณ์ฐ์ ํตํด W ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ฉด์ ์ค๋ฅ ๊ฐ์ด ์ต์๊ฐ ๋๋ W ํ๋ผ๋ฏธํฐ๋ฅผ ๊ตฌํ๋ ๋ฐฉ์
np.random.seed(0)
# y = 4X + 6 ์ ๊ทผ์ฌ(w1=4, w0=6). ์์์ ๊ฐ์ ๋
ธ์ด์ฆ๋ฅผ ์ํด ๋ง๋ฆ
X = 2*np.random.rand(100,1)
y = 6 + 4*X + np.random.randn(100,1)
# ๋น์ฉํจ์ ๋ง๋ค๊ธฐ
def get_cost(y, y_pred) :
N = len(y)
cost = np.sum(np.square(y-y_pred))/N
return cost
# ๊ฐ์ค์น ์
๋ฐ์ดํธ
def get_weight_updates(w1, w0, X, y, learning_rate=0.01) :
N = len(y)
w1_update = np.zeros_like(w1)
w0_update = np.zeros_like(w0)
y_pred = np.dot(X, w1.T) + w0
diff = y - y_pred
# dot ํ๋ ฌ ์ฐ์ฐ์ผ๋ก ๊ตฌํ๊ธฐ ์ํด ํ๋ ฌ ์์ฑ
w0_factors = np.ones((N,1))
#์
๋ฐ์ดํธ
w1_update = -(2/N)*learning_rate*(np.dot(X.T, diff))
w0_update = -(2/N)*learning_rate*(np.dot(w0_factors.T, diff))
return w1_update, w0_update
# ์๋ ฅ์ธ์ iters ๋ก ์ฃผ์ด์ง ํ์๋งํผ ๋ฐ๋ณต์ ์ผ๋ก w1, w0 ๋ฅผ ์
๋ฐ์ดํธ ์ ์ฉํจ
def gradient_descent_steps(X,y,iters=1000) :
# ์ด๊ธฐํ
w0 = np.zeros((1,1))
w1 = np.zeros((1,1))
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
w1,w0 = gradient_descent_steps(X,y,iters=1000)
y_pred = w1[0,0] * X + w0
๐ก ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ Stochasitic Gradient Descent
- ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋, ์ผ๋ถ ๋ฐ์ดํฐ๋ง์ ์ด์ฉํด w ๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๊ฐ์ ๊ณ์ฐํ๋ค.
- ๋น ๋ฅธ ์๋
- ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ด๋ ๋ฏธ๋ ๋ฐฐ์น ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์ด์ฉํด ์ต์ ๋น์ฉํจ์๋ฅผ ๋์ถํ๋ค.
- GD ์ฝ๋์์ batch_size ๋ณ์๋ฅผ ์ถ๊ฐํ ๊ฒ์ด ์ฐจ์ด
04. ์ ํํ๊ท์ค์ต - ๋ณด์คํด ์ฃผํ ๊ฐ๊ฒฉ ์์ธก
๐ ๊ฐ์
๐ก LinearRegression
๐ธ ํ๋ผ๋ฏธํฐ
- fit_intercept : ์ ํธ ๊ฐ์ ์์ฑ ํ ๊ฒ์ธ์ง ๋ง๊ฒ์ธ์ง ์ง์ ํ๋ค (T/F) ๋ง์ผ False ๋ก ์ง์ ํ๋ฉด 0์ผ๋ก ์ง์ ๋๋ค.
- normalize : T/F ๋ก ๋ํดํธ๋ False ์ด๋ค. True ์ด๋ฉด ํ๊ท๋ฅผ ์ํํ๊ธฐ ์ ์ ์ ๋ ฅ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๊ทํํ๋ค.
๐ธ ์์ฑ
- coef_ : ํ๊ท๊ณ์ ์ถ๋ ฅ. Shape ๋ (Target ๊ฐ ๊ฐ์, ํผ์ฒ๊ฐ์)
- intercept_ : ์ ํธ๊ฐ ์ถ๋ ฅ
๐ธ ์ฃผ์ ์ฌํญ
- ๋ค์ค ๊ณต์ ์ฑ ๋ฌธ์ : ์ ๋ ฅ๋ณ์๋ค๋ผ๋ฆฌ ์๊ด๊ด๊ณ๊ฐ ๋งค์ฐ ๋์ ๊ฒฝ์ฐ ๋ถ์ฐ์ด ๋งค์ฐ ์ปค์ ธ ์ค๋ฅ์ ๋งค์ฐ ๋ฏผ๊ฐํด์ง ๐ ๋ ๋ฆฝ์ ์ธ ์ค์ํ ํผ์ฒ๋ง ๋จ๊ธฐ๊ณ ์ ๊ฑฐํ๊ฑฐ๋ ๊ท์ ๋ฅผ ์ ์ฉ
- ๋๋ฌด ๋ง์ ํผ์ฒ๊ฐ ๋ค์ค ๊ณต์ ์ฑ ๋ฌธ์ ๋ฅผ ์ง๋๋ฉด PCA ๋ฅผ ํตํด ์ฐจ์ ์ถ์๋ฅผ ์ํํ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณผ ์ ์๋ค.
๐ธ ํ๊ฐ์งํ
- MAE : ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๋๊ฐ์ผ๋ก ๋ณํํด ํ๊ท
- MSE : ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ์ฌ ํ๊ท
- RMSE : MSE ์ ๋ฃจํธ๋ฅผ ์์ด ๊ฒ
- R^2 : ๋ถ์ฐ ๊ธฐ๋ฐ์ผ๋ก ์์ธก ์ฑ๋ฅ์ ํ๊ฐํ๋ค. 1์ ๊ฐ๊น์ธ์๋ก ์์ธก ์ ํ๋๊ฐ ๋๋ค.
ํ๊ฐ๋ฐฉ๋ฒ | ์ฌ์ดํท๋ฐ | Scoring ํจ์ ์ ์ฉ ๊ฐ |
MAE | metrics.mean_absolute_error | neg_mean_absolute_error |
MSE | metrics.mean_squared_error | neg_mean_squared_error |
R^2 | metrics.r2_score | r2 |
โ scoring ํจ์ ์ ์ฉ๊ฐ์ด๋ cross_val_score ๋ GridSearchCV ์์ ํ๊ฐ ์ ์ฌ์ฉ๋๋ scoring ํ๋ผ๋ฏธํฐ์ ์ ์ฉ๊ฐ์ด๋ค.
โ scoring ํจ์์ neg, ์ฆ ์์๋ฅผ ๋ฐํํ๋ ์ด์ ๋ ์ฌ์ดํท๋ฐ์ Scoring ํจ์๊ฐ score ๊ฐ์ด ํด์๋ก ์ข์ ํ๊ฐ ๊ฒฐ๊ณผ๋ก ์๋ ํ๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ์ค๋ฅ ์ฐจ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ๊ทํ๊ฐ์งํ์ ๊ฒฝ์ฐ ๊ฐ์ด ์ปค์ง๋ฉด ์คํ๋ ค ๋์ ๋ชจ๋ธ์ด๋ผ๋ ์๋ฏธ์ด๋ฏ๋ก ์์๊ฐ์ผ๋ก ๋ณด์ ํด์ค ๊ฒ์ด๋ค. ๊ทธ๋์ ์์ ์ค๋ฅ ๊ฐ์ด ๋ ํฐ ์ซ์๋ก ์ธ์๋๊ฒ ํ๋ค.
๐ ๋ฐ์ดํฐ ๋ก๋
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
%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()
# Boston ๋ฐ์ดํ์
ํฌ๊ธฐ : (506, 14)
๐ ์ข ์๋ณ์์ ์ค๋ช ๋ณ์ ๊ด๊ณ ํ์ : sns.regplot
# PRICE ์ ์ค๋ช
๋ณ์ ์ฌ์ด์ ์ํฅ์ ๋๋ฅผ ์๊ฐํํด๋ณด๊ธฐ
fig, axs = plt.subplots(figsize=(16,8), ncols=4, nrows=2)
lm_features = ['RM','ZN','INDUS','NOX','AGE', 'PTRATIO', 'LSTAT', 'RAD']
for i, feature in enumerate(lm_features) :
row = int(i/4)
col = i%4
sns.regplot(x=feature, y='PRICE', data = bostonDF, ax = axs[row][col])
# RM(๋ฐฉ๊ฐ์) ๋ณ์์ LSTAT ๋ณ์ (ํ์ ๊ณ์ธต์ ๋น์จ) ๊ฐ Price ์์ ์ํฅ๋๊ฐ ๊ฐ์ฅ ๋๋๋ฌ์ง๊ฒ ๋ํ๋จ
๐ ์ ํํ๊ท ๋ชจ๋ธ ํ์ต/์์ธก/ํ๊ฐ
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)))
# MSE : 17.297 , RMSE : 4.159
# Variance score : 0.757
๐ ์ ํธ๊ณผ ํ๊ท๊ณ์ ๊ฐ ํ์ธ
print('์ ํธ ๊ฐ : ', lr.intercept_)
print('ํ๊ท ๊ณ์ ๊ฐ : ',np.round(lr.coef_ , 1))
# ์ ํธ ๊ฐ : 40.995595172164755
# ํ๊ท ๊ณ์ ๊ฐ : [ -0.1 0.1 0. 3. -19.8 3.4 0. -1.7 0.4 -0. -0.9 0. -0.6]
๐ ๊ต์ฐจ๊ฒ์ฆ
# ๊ต์ฐจ๊ฒ์ฆ
from sklearn.model_selection import cross_val_score
y_target = bostonDF['PRICE']
X_data = bostonDF.drop(['PRICE'], axis = 1, inplace = False)
lr = LinearRegression()
# 5๊ฐ ํด๋ ์ธํธ๋ก 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))
# 5 folds ์ ๊ฐ๋ณ Negative MSE scores : [-12.46 -26.05 -33.07 -80.76 -33.31]
# 5 folds ์ ๊ฐ๋ณ RMSE scores : [3.53 5.1 5.75 8.99 5.77]
# 5 folds ์ ํ๊ท RMSE : 5.829
05. ๋คํญํ๊ท
๐ ๊ฐ์
๐ก ๋คํญํ๊ท
- ๋จํญ์์ด ์๋ 2์ฐจ, 3์ฐจ ๋ฐฉ์ ์๊ณผ ๊ฐ์ ๋คํญ์์ผ๋ก ํํ๋๋ ๊ฒ์ ๋คํญํ๊ท๋ผ๊ณ ํ๋ค.
- ์ฃผ์) ๋คํญํ๊ท๋ ๋น์ ํํ๊ท๋ผ๊ณ ํผ๋ํ๊ธฐ ์ฌ์ด๋ฐ, ์ ํํ๊ท์ด๋ค. ์ ํ/๋น์ ํ์ ๋๋๋ ๊ธฐ์ค์ ํ๊ท๊ณ์๊ฐ ์ ํ/๋น์ ํ์ธ์ง์ ๋ฐ๋ฅธ ๊ฒ์ด์ง ๋ ๋ฆฝ๋ณ์์ ์ ํ/๋น์ ํ ์ฌ๋ถ์๋ ๋ฌด๊ดํ๋ค.
- ๋คํญํ๊ท๋ ์ ํํ๊ท์ด๊ธฐ ๋๋ฌธ์ ๋น์ ํํจ์๋ฅผ ์ ํ ๋ชจ๋ธ์ ์ ์ฉ์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๊ตฌํํ๋ค ๐PolynomialFeatures
๐ ๋น์ ํํจ์ ์์ฑ ์์
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
# ๋คํญ์์ผ๋ก ๋ณํํ ๋จํญ์ ์์ฑ
X = np.arange(4).reshape(2,2)
print('์ผ์ฐจ ๋จํญ์ ๊ณ์ ํผ์ฒ : \n', X) #[[0,1],[2,3]]
# degree = 2 ์ธ 2์ฐจ ๋คํญ์์ผ๋ก ๋ณํํ๊ธฐ ์ํด PolynomialFeatures ๋ฅผ ์ด์ฉํด ๋ณํ
poly = PolynomialFeatures(degree=2) # [1, x1, x2, x1^2, x1x2, x2^2]
poly.fit(X)
poly_ftr = poly.transform(X)
print('๋ณํ๋ 2์ฐจ ๋คํญ์ ๊ณ์ ํผ์ฒ : \n', poly_ftr)
# [[1. 0. 1. 0. 0. 1.],
# [1. 2. 3. 4. 6. 9.]]
๐ ๋คํญํ๊ท ๊ตฌํ
# ๋คํญํ๊ท ๊ตฌํํด๋ณด๊ธฐ
from sklearn.pipeline import Pipeline
import numpy as np
def polynomial_func(X) :
y = 1 + 2*X[:,0] + 3*X[:,0]**2 + 4*X[:,1]**3 # y = 1 + 2*x1 + 3*x1^2 + 4*x2^3
return y
# Pipeline ๊ฐ์ฒด๋ก ๋คํญ๋ณํ๊ณผ ์ ํํ๊ท๋ฅผ ์ฐ๊ฒฐ
model = Pipeline([('poly', PolynomialFeatures(degree=3)),
('linear', LinearRegression())])
X = np.arange(4).reshape(2,2) # ((x1,x2),(x1,x2))
y = polynomial_func(X)
model = model.fit(X,y)
print('Polynomial ํ๊ท๊ณ์\n', np.round(model.named_steps['linear'].coef_,2))
# [0. 0.18 0.18 0.36 0.54 0.72 0.72 1.08 1.62 2.34]
๐ ๊ณผ์์ ํฉ ๊ณผ๋์ ํฉ์ ์ดํด
- ํ์ต ๋ฐ์ดํฐ์ ํจํด์ ์ ๋ฐ์ํ๋ฉด์๋ ๋ณต์กํ์ง ์์ ๊ท ํ์กํ ๋ชจ๋ธ์ด ๊ฐ์ฅ ์ข๋ค.
๐ ํธํฅ ๋ถ์ฐ ํธ๋ ์ด๋ ์คํ
- Degree1 ๊ฐ์ ๋ชจ๋ธ์ '๊ณ ํธํฅ' (high Bias) ์ฑ์ ๊ฐ์ก๋ค๊ณ ํํ ๐ ๋ชจ๋ธ์ด ์ง๋์น๊ฒ ํ ๋ฐฉํฅ์ฑ์ผ๋ก ์น์ฐ์ณ์ง
- Degree15 ๊ฐ์ ๋ชจ๋ธ์ '๊ณ ๋ถ์ฐ' (high variance) ์ฑ์ ๊ฐ์ก๋ค๊ณ ํํ ๐ ํ์ต ๋ฐ์ดํฐ์ ์ธ๋ถ์ ์ธ ํน์ฑ๊น์ง ํ์ตํ๊ฒ ๋๋ฉด์ ์ง๋์น๊ฒ ๋์ ๋ณ๋์ฑ์ ๊ฐ์ง๊ฒ ๋จ
- ํธํฅ์ด ๋์ผ๋ฉด ๋ถ์ฐ์ด ๋ฎ์์ง๊ณ (๊ณผ์์ ํฉ), ๋ถ์ฐ์ด ๋์ผ๋ฉด ํธํฅ์ด ๋ฎ์์ง๋ค. (๊ณผ์ ํฉ)
06. ๊ท์ ์ ํ ๋ชจ๋ธ - ๋ฆฟ์ง, ๋ผ์, ์๋ผ์คํฑ๋ท
๐ ๊ฐ์
๐ก ๊ท์ ๊ฐ ํ์ํ ์ด์
- ํ๊ท ๋ชจ๋ธ์ ์ ์ ํ ๋ฐ์ดํฐ์ ์ ํฉํ๋ฉด์๋ ํ๊ท ๊ณ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ปค์ง๋ ๊ฒ์ ์ ์ดํ ์ ์์ด์ผ ํ๋ค.
- ์ต์ ๋ชจ๋ธ์ ์ํ Cost ํจ์ = ํ์ต ๋ฐ์ดํฐ ์์ฐจ ์ค๋ฅ ์ต์ํ โ ํ๊ท๊ณ์ ํฌ๊ธฐ ์ ์ด
๋น์ฉํจ์ ๋ชฉํ = MIN( RSS(W) + alpha * |W|2 ) ๋ฅผ ์ต์ํ
โจ alpha ๋ ํ๋ ํ๋ผ๋ฏธํฐ
๐ ๋น์ฉํจ์๋ฅผ ์ต์ํํ๋ W ๋ฒกํฐ๋ฅผ ์ฐพ๊ธฐ
- alpha ๋ฅผ ํฌ๊ฒ ํ๋ฉด ๋น์ฉํจ์๋ cost ๋ฅผ ์ต์ํํด์ผํ๊ธฐ ๋๋ฌธ์ ํ๊ท ๊ณ์ W์ ๊ฐ์ 0์ ๊ฐ๊น๊ฒ ์ต์ํํ์ฌ ๊ณผ์ ํฉ์ ๊ฐ์ ํ ์ ์๋ค.
- alpha ๋ฅผ ์๊ฒํ๋ฉด ํ๊ท๊ณ์ W ๊ฐ์ด ์ปค์ ธ๋ ์ด๋์ ๋ ์์๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ํ์ต ๋ฐ์ดํฐ ์ ํฉ์ ๊ฐ์ ํ ์ ์๋ค.
๐ก ๊ท์
- ๋น์ฉํจ์์ ์ํ๊ฐ์ผ๋ก ํ๋ํฐ๋ฅผ ๋ถ์ฌํด ํ๊ท ๊ณ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์์์ผ ๊ณผ์ ํฉ์ ๊ฐ์ ํ๋ ๋ฐฉ์
- L1 ๋ฐฉ์๊ณผ L2 ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถ๋๋ค.
- L1 ๊ท์ ๋ W ์ ์ ๋๊ฐ์ ํจ๋ํฐ๋ฅผ ๋ถ์ฌํ๋ ๋ฐฉ์์ผ๋ก, '๋ผ์' ํ๊ท๋ผ ๋ถ๋ฅธ๋ค. L1 ๊ท์ ๋ฅผ ์ ์ฉํ๋ฉด ์ํฅ๋ ฅ์ด ํฌ์ง ์์ ํ๊ท ๊ณ์ ๊ฐ์ 0์ผ๋ก ๋ณํํ๋ค.
- L2 ๊ท์ ๋ W์ ์ ๊ณฑ์ ๋ํด ํจ๋ํฐ๋ฅผ ๋ถ์ฌํ๋ ๋ฐฉ์์ผ๋ก '๋ฆฟ์ง' ํ๊ท๋ผ ๋ถ๋ฅธ๋ค.
๐ ๋ฆฟ์งํ๊ท
๐ก Ridge
- ์ฃผ์ ํ๋ผ๋ฏธํฐ : alpha
๐ก ์ค์ต
๐ alpha = 10 ์ผ๋ก ์ค์ ํด ๋ฆฟ์งํ๊ท ์ํ
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
# alpha = 10 ์ผ๋ก ์ค์ ํด ๋ฆฟ์งํ๊ท ์ํ
ridge = Ridge(alpha=10)
neg_mse_scores = cross_val_score(ridge, 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('5 folds ์ ๊ฐ๋ณ Negative MSE scores : ', np.round(neg_mse_scores,3))
print('5 folds์ ๊ฐ๋ณ RMSE scores : ', np.round(rmse_scores, 3))
print('5 folds์ ํ๊ท RMSE : {0:.3f}'.format(avg_rmse))
# ๊ท์ ๊ฐ ์๋ ํ๊ท๋ 5.829 ์์ --> ๊ท์ ๊ฐ ๋ ๋ฐ์ด๋ ์์ธก์ฑ๋ฅ์ ๋ณด์
# 5 folds ์ ๊ฐ๋ณ Negative MSE scores : [-11.422 -24.294 -28.144 -74.599 -28.517]
# 5 folds์ ๊ฐ๋ณ RMSE scores : [3.38 4.929 5.305 8.637 5.34 ]
# 5 folds์ ํ๊ท RMSE : 5.518
๐ ์ฌ๋ฌ๊ฐ์ alpha ๊ฐ์ผ๋ก rmse ์ธก์ ํด๋ณด๊ธฐ
# ์ํ๊ฐ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ธก์ ํด๋ณด๊ธฐ
alphas = [0,0.1,1,10,100]
# alpha ์ ๋ฐ๋ฅธ ํ๊ท rmse ๋ฅผ ๊ตฌํจ
for alpha in alphas :
ridge = Ridge(alpha = alpha)
# cross_val_scores ๋ฅผ ์ด์ฉํด 5 ํด๋์ ํ๊ท ์ ๊ณ์ฐ
neg_mse_scores = cross_val_score(ridge , X_data, y_target, scoring='neg_mean_squared_error', cv =5)
avg_rmse = np.mean(np.sqrt(-1*neg_mse_scores))
print('alpha {0} ์ผ ๋ 5 folds ์ ํ๊ท RMSE : {1:.3f}'.format(alpha, avg_rmse))
# alpha ๊ฐ 100์ผ ๋ ๊ฐ์ฅ ์ข์
# alpha 0 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.829
# 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
๐ alpha ๊ฐ์ ๋ฐ๋ฅธ ํ๊ท ๊ณ์ ํฌ๊ธฐ ๋ณํ ์ดํด๋ณด๊ธฐ
๐ ๋ผ์ ํ๊ท
๐ก Lasso
- ์ฃผ์ ํ๋ผ๋ฏธํฐ : alpha
- L2 ๊ท์ ๋ ํ๊ท๊ณ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์์ํค๋๋ฐ ๋ฐํ์ฌ L1 ๊ท์ ๋ ๋ถํ์ํ ํ๊ท๊ณ์๋ฅผ ๊ธ๊ฒฉํ๊ฒ ๊ฐ์์์ผ 0์ผ๋ก ๋ง๋ค๊ณ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค ๐ ์ ์ ํ ํผ์ฒ๋ง ํ๊ท์ ํฌํจ์ํค๋ ํผ์ฒ ์ ํ์ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
๐ก ์ค์ต
๐ ๋ชจ๋ธ ์ ์ฉ ํจ์ ๋ง๋ค๊ธฐ
from sklearn.linear_model import Lasso, ElasticNet
# ์ํ๊ฐ์ ๋ฐ๋ฅธ ํ๊ท ๋ชจ๋ธ์ ํด๋ ํ๊ท RMSE ๋ฅผ ์ถ๋ ฅํ๊ณ ํ๊ท ๊ณ์ ๊ฐ๋ค์ DataFrame ์ผ๋ก ๋ฐํ
def get_linear_reg_eval(model_name , params = None, X_data_n = None, y_target_n = None, verbose =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 folds ์ ํ๊ท RMSE : {1:.3f}'.format(param, avg_rmse))
# cross_val_score ๋ evaluation metric ๋ง ๋ฐํํ๋ฏ๋ก ๋ชจ๋ธ์ ๋ค์ ํ์ตํ์ฌ ํ๊ท ๊ณ์๋ฅผ ์ถ์ถํ๋ค.
model.fit(X_data, y_target)
# alpha์ ๋ฐ๋ฅธ ํผ์ฒ๋ณ ํ๊ท ๊ณ์๋ฅผ Series ๋ก ๋ณํํ๊ณ df ์นผ๋ผ ์ถ๊ฐ
coeff = pd.Series(data = model.coef_, index = X_data.columns)
colname = 'alpha:' + str(param)
coeff_df[colname] = coeff
return coeff_df
๐ ์ฌ๋ฌ๊ฐ์ง ์ํ ๊ฐ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ
lasso_alphas = [0.07, 0.1, 0.5, 1, 3]
coeff_lasso_df = get_linear_reg_eval('Lasso', params = lasso_alphas, X_data_n = X_data, y_target_n = y_target)
##### Lasso #####
# alpha 0.07 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.612
# alpha 0.1 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.615
# alpha 0.5 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.669
# alpha 1 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.776
# alpha 3 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 6.189
๐ ํ๊ท ๊ณ์ ์ถ๋ ฅ
# ํ๊ท๊ณ์ ์ถ๋ ฅ
sort_column = 'alpha:' + str(lasso_alphas[0])
coeff_lasso_df.sort_values(by=sort_column, ascending = False)
๐ ์๋ผ์คํฑ๋ท ํ๊ท
๐ก Elastic Net
- L2 ๊ท์ ์ L1 ๊ท์ ๋ฅผ ๊ฒฐํฉํ ํ๊ท
- ๋ผ์ํ๊ท(L1) ์ ์๊ด๊ด๊ณ๊ฐ ๋์ ํผ์ฒ๋ค์ ๊ฒฝ์ฐ์ ์ด๋ค ์ค ์ค์ ํผ์ฒ๋ง์ ์ ํํ๊ณ ๋ค๋ฅธ ํผ์ฒ๋ค์ ๋ชจ๋ ๊ณ์๋ฅผ 0์ผ๋ก ๋ง๋๋ ์ฑ์ง ๋๋ฌธ์ alpha ๊ฐ์ ๋ฐ๋ผ ํ๊ท ๊ณ์์ ๊ฐ์ด ๊ธ๊ฒฉํ ๋ณ๋ํ ์ ์๋๋ฐ, ์ด๋ฅผ ์ํํ๊ธฐ ์ํด L2 ๊ท์ ๋ฅผ ๋ผ์ ํ๊ท์ ์ถ๊ฐํ๋ค.
- ๋จ์ : ์ํ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ
๐ก ํ๋ผ๋ฏธํฐ
- alpha ๐ (a+b) ๊ฐ์ด๋ค : a*L1 + b*L2 ๐ a ๋ L1 ๊ท์ ์ ์ํ๊ฐ, b ๋ L2 ๊ท์ ์ ์ํ๊ฐ์ด๋ค.
- l1_ratio ๐ a/(a+b)
- l1_ration = 0 ์ด๋ฉด a = 0 ์ด๋ฏ๋ก L2 ๊ท์ ์ ๋์ผํ๋ค. 1์ด๋ฉด b=0 ์ด๋ฏ๋ก L1 ๊ท์ ์ ๋์ผํ๋ค.
๐ก ์ค์ต
๐ ๋ชจ๋ธ ํ์ต
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)
##### ElasticNet #####
# alpha 0.07 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.542
# alpha 0.1 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.526
# alpha 0.5 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.467
# alpha 1 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 5.597
# alpha 3 ์ผ ๋ 5 folds ์ ํ๊ท RMSE : 6.068
๐ ํ๊ท๊ณ์ ์ดํด๋ณด๊ธฐ
sort_column = 'alpha:'+str(elastic_alphas[0])
coeff_elastic_df.sort_values(by=sort_column, ascending=False)
๐ ์ ํ ํ๊ท ๋ชจ๋ธ์ ์ํ ๋ฐ์ดํฐ ๋ณํ
๐ก ์ ํํ๊ท์์ ์ต์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ ๋ชป์ง์๊ฒ ๋ฐ์ดํฐ ๋ถํฌ๋์ ์ ๊ทํ์ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ์ด ์ค์ํ๋ค.
- ์ ํํ๊ท ๋ชจ๋ธ์ ํผ์ฒ๊ณผ ํ๊น ๊ฐ ๊ฐ์ '์ ํ' ๊ด๊ณ๋ฅผ ๊ฐ์
- ํผ์ฒ๊ฐ๊ณผ ํ๊น๊ฐ์ ๋ถํฌ๊ฐ '์ ๊ท๋ถํฌ'์ธ ํํ๋ฅผ ๋งค์ฐ ์ ํธ ๐ skewness ํํ์ ๋ถํฌ๋ (์ฌํ๊ฒ ์๊ณก๋ฌ์ ๊ฒฝ์ฐ) ์ผ ๊ฒฝ์ฐ ์์ธก ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ธ ์ ์ฉ ์ด์ ์ '์ค์ผ์ผ๋ง/์ ๊ทํ' ์์ ์ ์ํํ๋ค.
๐ก ํผ์ฒ๋ณ์ ์ค์ผ์ผ๋ง/์ ๊ทํ
- StandardScaler : ํ๊ท ์ด 0, ๋ถ์ฐ์ด 1์ธ ํ์ค ์ ๊ท ๋ถํฌ๋ก ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ณํ
- MinMaxScaler : ์ต์๊ฐ์ด 0, ์ต๋๊ฐ์ด 1์ธ ๊ฐ์ผ๋ก ์ ๊ทํ๋ฅผ ์ํ
- Scaler ๋ฅผ ์ ์ฉํด๋ ์์ธก ์ฑ๋ฅ์ด ํฅ์๋์ง ์์๋ค๋ฉด ์ค์ผ์ผ๋ง/์ ๊ทํ๋ฅผ ์ํํ ๋ฐ์ดํฐ ์ ์ ๋ค์ '๋คํญํน์ฑ' ์ ์ ์ฉํ์ฌ ๋ณํํ๊ธฐ๋ ํ๋ค. ๊ทธ๋ฌ๋ ๋คํญ ํน์ฑ์ ์ด์ฉํ ๋ ๊ณผ์ ํฉ์ ์ฃผ์ํด์ผ ํ๋ค.
- ๋ก๊ทธ๋ณํ : ์๋ ๊ฐ์ log ํจ์๋ฅผ ์ ์ฉํ๋ฉด ๋ณด๋ค ์ ๊ท๋ถํฌ์ ๊ฐ๊น์ด ํํ๋ก ๊ฐ์ด ๋ถํฌ๋๋ค. โญโญ
๐ก ํ๊น๋ณ์ ์ค์ผ์ผ๋ง/์ ๊ทํ
- ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ ๋ณํ์ ์ ์ฉํ๋ค. (์ ๊ทํ๋ฅผ ํ๋ฉด ๋ค์ ์๋ณธ ํ๊น๊ฐ์ผ๋ก ์๋ณตํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ)
๐ก ์ค์ต
๐ ๋ฐ์ดํฐ ๋ณํ ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ
# Standard, MinMax, Log ์ค ๊ฒฐ์
# p_degree ๋ ๋คํญ์ ํน์ฑ์ ์ถ๊ฐํ ๋ ์ ์ฉ 2 ์ด์ ๋ถ์ฌํ์ง ์์
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures
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
๐ ๋ฆฟ์งํ๊ท ๋ชจ๋ธ ํ์ต
# ๋ฆฟ์งํ๊ท
alphas = [0.1, 1, 10, 100]
scale_methods = [(None, None), ('Standard', None), ('Standard',2), ('MinMax',None), ('MinMax',2), ('Log',None)]
for scale_method in scale_methods :
X_data_scaled = get_scaled_data(method = scale_method[0], p_degree = scale_method[1], input_data = X_data)
print('\n ๋ณํ ์ ํ : {0} , Polynomial : {1}'.format( scale_method[0], scale_method[1]))
get_linear_reg_eval('Ridge', params = alphas, X_data_n = X_data_scaled, y_target_n = y_target, verbose = False)
07. ๋ก์ง์คํฑ ํ๊ท
๐ ๊ฐ์
๐ก ๋ก์ง์คํฑ ํ๊ท
- ์ ํํ๊ท ๋ฐฉ์์ ๋ถ๋ฅ์ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ํํ๊ท ๊ณ์ด์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ ํํ๊ท๊ณ์ด์ ๋ก์ง์คํฑ ํ๊ท๋ ๋ฐ์ดํฐ์ ์ ๊ท ๋ถํฌ๋์ ๋ฐ๋ผ ์์ธก ์ฑ๋ฅ ์ํฅ์ ๋ฐ์ ์ ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ์ ๋จผ์ ์ ๊ท ๋ถํฌ ํํ์ ํ์ค ์ค์ผ์ผ๋ง์ ์ ์ฉํ๋๊ฒ ์ข๋ค.
- ๊ฐ๋ณ๊ณ ๋นจ๋ผ ์ด์ง ๋ถ๋ฅ ์์ธก์ ๊ธฐ๋ณธ ๋ชจ๋ธ๋ก ๋ง์ด ์ฌ์ฉํ๊ณ , ํฌ์ํ ๋ฐ์ดํฐ ์ธํธ ๋ถ๋ฅ์๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ฌ ํ ์คํธ ๋ถ๋ฅ์์๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
๐ง ์ ํํ๊ท์ ๋ค๋ฅธ์
- ํ์ต์ ํตํด ์ ํ ํจ์์ ํ๊ท ์ต์ ์ ์ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ์๊ทธ๋ชจ์ด๋ ํจ์ ์ต์ ์ ์ ์ฐพ๊ณ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฐํ ๊ฐ์ ํ๋ฅ ๋ก ๊ฐ์ฃผ์ ํ๋ฅ ์ ๋ฐ๋ผ ๋ถ๋ฅ๋ฅผ ๊ฒฐ์ ํ๋ค.
- ์์. ์ ์ฑ์ข ์ ๋ถ๋ฅ ๋ฌธ์
๐ก ์ฃผ์ ํ๋ผ๋ฏธํฐ
- penalty : ๊ท์ ์ ์ ํ์ ์ค์ ํ๋ค. l1 ์ด๋ฉด L1 ๊ท์ , l2 ์ด๋ฉด L2 ๊ท์ ๋ฅผ ์ ์ฉํ๋ค
- C : ๊ท์ ๊ฐ๋๋ฅผ ์กฐ์ ํ๋ alpha ๊ฐ์ ์ญ์์ด๋ค. ๊ฐ์ด ์์์๋ก ๊ท์ ๊ฐ๋๊ฐ ํฌ๋ค.
๐ ์ค์ต
๐ ์์ค์ฝ์ ์ ๋ฐฉ์ ๋ฐ์ดํฐ ์์
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
cancer = load_breast_cancer()
๐ ๋ณ์ ์ค์ผ์ผ๋ง
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
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)
๐ ๋ชจ๋ธ ํ์ต ๋ฐ ์ฑ๋ฅ ํ๊ฐ
# ๋ชจ๋ธ ํ์ต ๋ฐ ์ฑ๋ฅ ํ๊ฐ
from sklearn.metrics import accuracy_score, roc_auc_score
# ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ด์ฉํด ํ์ต ๋ฐ ์์ธก ์ํ
lr_clf = LogisticRegression()
lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)
# ์ ํ๋์ roc_auc ์ธก์
print('accuracy : {:0.3f}'.format(accuracy_score(y_test, lr_pred)))
print('roc_auc : {:0.3f}'.format(roc_auc_score(y_test, lr_pred)))
# accuracy : 0.977
# roc_auc : 0.972
๐ ํ์ดํผ ํ๋ผ๋ฏธํฐ ์ต์ ํ
from sklearn.model_selection import GridSearchCV
params = {'penalty' : ['l1','l2'], 'C' : [0.01, 0.1, 1, 1, 5, 10]}
grid_clf = GridSearchCV(lr_clf, param_grid = params, scoring = 'accuracy', cv=3)
grid_clf.fit(data_scaled, cancer.target)
print('์ต์ ํ์ดํผ ํ๋ผ๋ฏธํฐ:{0}, ์ต์ ํ๊ท ์ ํ๋ {1:.3f}'.format(grid_clf.best_params_, grid_clf.best_score_))
# ์ต์ ํ์ดํผ ํ๋ผ๋ฏธํฐ:{'C': 1, 'penalty': 'l2'}, ์ต์ ํ๊ท ์ ํ๋ 0.975
08. ํ๊ท ํธ๋ฆฌ
๐ ๊ฐ์
๐ก 'ํ๊ทํจ์' ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ๊ท VS 'ํธ๋ฆฌ' ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ๊ท
- ์ ํ ํ๊ท๋ ํ๊ท ๊ณ์์ ๊ด๊ณ๋ฅผ ๋ชจ๋ ์ ํ์ผ๋ก ๊ฐ์ ํ์ฌ, ํ๊ท ๊ณ์๋ฅผ ์ ํ์ผ๋ก ๊ฒฐํฉํ๋ ํ๊ท ํจ์๋ฅผ ๊ตฌํด, ๋ ๋ฆฝ๋ณ์๋ฅผ ์ ๋ ฅํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ์์ธกํ๋ค. ๋น์ ํ ํ๊ท๋ ํ๊ท ๊ณ์์ ๊ฒฐํฉ์ ๋น์ ํ์ผ๋ก ํ๊ณ , ๋น์ ํ ํ๊ท ํจ์๋ฅผ ์ธ์ ๊ฒฐ๊ณผ๊ฐ์ ์์ธกํ๋ค.
โ ๋น์ ํ ํ๊ท ํจ์์ ๊ณก์ ์ ๋ชจํํ ํ๋ ๊ฒ : https://blog.minitab.com/ko/adventures-in-statistics-2/what-is-the-difference-between-linear-and-nonlinear-equations-in-regression-analysis
- ์ด ํํธ์์๋ ํ๊ท ํจ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์๊ณ ๊ฒฐ์ ํธ๋ฆฌ์ ๊ฐ์ด ํธ๋ฆฌ ๊ธฐ๋ฐ์ ํ๊ท ๋ฐฉ์์ ์๊ฐํ๊ณ ์ ํ๋ค.
๐ก ํ๊ท ํธ๋ฆฌ
- ๋ฆฌํ๋ ธ๋์ ์ํ ๋ฐ์ดํฐ ๊ฐ์ ํ๊ท ๊ฐ์ ๊ตฌํด ํ๊ท ์์ธก๊ฐ์ ๊ณ์ฐํ๋ค.
- ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ ๋ถ๋ฅ ํธ๋ฆฌ Classifier ํ์ดํผ ํ๋ผ๋ฏธํฐ์ ๋์ผํ๋ค.
๐ก CART (classification and regression Trees)
- ํธ๋ฆฌ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ (๊ฒฐ์ ํธ๋ฆฌ, ๋๋ค ํฌ๋ ์คํธ, GBM, XGBoost, LightGBM ๋ฑ) ์ ๋ถ๋ฅ ๋ฟ ์๋๋ผ ํ๊ท๋ ๊ฐ๋ฅํ๋ค. ํธ๋ฆฌ ์์ฑ์ด CART ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ | ํ๊ท Estimator | ๋ถ๋ฅ Estimator |
Decision Tree | DecisionTreeRegressor | DecisionTreeClassifier |
Gradient Boosting | GraidnetBoostingRegressor | GradientBoostingClassifier |
XGBoost | XBGRegressor | XGBClassifier |
RandomForest | RandomForestRegressor | RandomForestClassifier |
LightGBM | LGBMRegressor | LGBMClassifier |
๐ก ์ค์ต
๐ ๋ณด์คํด ์ฃผํ ๊ฐ๊ฒฉ ์์ธก ์์
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np
# 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
y_target = bostonDF['PRICE']
X_data = bostonDF.drop(['PRICE'],axis=1,inplace=False)
๐ ๋๋ค ํฌ๋ ์คํธ ํ๊ท ๋ชจ๋ธ ํ๋ จ/ํ๊ฐ
rf = RandomForestRegressor(random_state=0, n_estimators = 1000)
neg_mse_scores = cross_val_score(rf, 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(np.round(neg_mse_scores,2)) # [ -7.88 -13.14 -20.57 -46.23 -18.88]
print(np.round(rmse_scores,2)) # [2.81 3.63 4.54 6.8 4.34]
print(avg_rmse) # 4.422538982804892
๐ ๋๋ค ํฌ๋ ์คํธ, ๊ฒฐ์ ํธ๋ฆฌ, GBM, XGBoost, LightGBM Regressor ๋ชจ๋ ์ด์ฉํ์ฌ ์์ธกํด๋ณด๊ธฐ
# ํจ์ ์ ์
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))
# ์ ์ฉ
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)
๐ก ํ๊ทํธ๋ฆฌ์ ํผ์ฒ๋ณ ์ค์๋
- ํ๊ท ํธ๋ฆฌ์ Regressor ํด๋์ค๋ ์ ํ ํ๊ท์ ๋ค๋ฅธ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ฏ๋ก ํ๊ท ๊ณ์๋ฅผ ์ ๊ณตํ๋ coef_ ์์ฑ์ด ์๋ค. ๋์ feature_importances_ ๋ฅผ ์ด์ฉํด ํผ์ฒ๋ณ ์ค์๋๋ฅผ ์ ์ ์๋ค.
import seaborn as sns
%matplotlib inline
rf_reg = RandomForestRegressor(n_estimators=1000)
rf_reg.fit(X_data, y_target)
feature_series = pd.Series(data = rf_reg.feature_importances_, index = X_data.columns)
feature_series = feature_series.sort_values(ascending = False)
sns.barplot(x = feature_series, y = feature_series.index)
๐ก ์ ํํ๊ท์ ํ๊ท ํธ๋ฆฌ ๋น๊ตํด๋ณด๊ธฐ
- ์ ํ ํ๊ท๋ ์ง์ ์ผ๋ก ์์ธก ํ๊ท์ ์ ํํ
- ํ๊ท ํธ๋ฆฌ๋ ๋ถํ ๋๋ ๋ฐ์ดํฐ ์ง์ ์ ๋ฐ๋ผ ๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด์ ๊ณ๋จ ํํ๋ก ํ๊ท์ ์ ๋ง๋ ๋ค. max_depth = 2 ์ธ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ๊ฐ ๊ณ๋จ ๊ตฌ๊ฐ๋ณ๋ก y ๊ฐ์ ํ๊ท ๊ฐ์ ์์ธก์น๋ก ๋ฐํํ ๋ถ๋ถ์ ํ์ธํด๋ณผ ์ ์๋ค.
- ํธ๋ฆฌ์ ์ต๋ ๊น์ด๋ฅผ 7๋ก ์ค์ ํ ๊ฒฝ์ฐ์ ํ์ต ๋ฐ์ดํฐ ์ธํธ์ ์ด์์น๋ ํ์ตํ๊ฒ ๋๋ฉด์ ๊ณผ์ ํฉ ๋์์์ ํ์ธํด๋ณผ ์ ์๋ค.
'1๏ธโฃ AIโขDS > ๐ ๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[05. ํด๋ฌ์คํฐ๋ง] K-means, ํ๊ท ์ด๋, GMM, DBSCAN (0) | 2022.05.07 |
---|---|
[06. ์ฐจ์์ถ์] PCA, LDA, SVD, NMF (0) | 2022.04.24 |
[04. ๋ถ๋ฅ] LightGBM, ์คํํน ์์๋ธ, Catboost (0) | 2022.03.20 |
[04. ๋ถ๋ฅ] GBM, XGboost (0) | 2022.03.14 |
[01,02] ๋จธ์ ๋ฌ๋ ๊ฐ์ (0) | 2022.03.13 |
๋๊ธ