데이터분석/통계

정규화 선형회귀 릿지(ridge), 라쏘(lasso), elastic net

씩씩한 IT블로그 2020. 12. 24. 10:46
반응형

0. 정규화 선형회귀?

(1) 선형회귀 계수(Weight)에 대한 제약 조건을 추가함으로써 모형이 과도하게 최적화되는 현상인 과최적화를 막는 방법

(2) 계수의 크기가 커지면 과적합됨. =>  계수의 크기를 제한함

 

* 기존의 회귀분석?

 

1. 릿지회귀(ridge Regression)

(1) 정의

추정계수의 제곱합을 최소로 하는것.

람다는 추정계수제곱의 가중치.

 

(2) 특징

- 제곱합을 최소화 하기 때문에 계수의 크가 줄어듬 => 과적합이 방지됨

- 다중공선성이 분산되기 때문에 효과적

- 딥러닝 loss function에서 L2 panelty로 사용됨

 

(3) 코드

# Ridge
fit = Ridge(alpha=0.5, fit_intercept=True, normalize=True, random_state=123).fit(X_train, Y_train)
pred_tr = fit.predict(X_train)
pred_te = fit.predict(X_test)

 

<exmaple>

import warnings
warnings.filterwarnings('always')
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, Lasso, ElasticNet
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target
print('Data View')
display(pd.concat([pd.DataFrame(y, columns=['diabetes_value']), pd.DataFrame(X, columns=diabetes.feature_names)], axis=1).head())

alpha_weight = 0.5
fit = Ridge(alpha=alpha_weight, fit_intercept=True, normalize=True, random_state=123).fit(X, y)
pd.DataFrame(np.hstack([fit.intercept_, fit.coef_]), columns=['alpha = {}'.format(alpha_weight)])

 

(4) 추정제곱가중치의 변화(각기 다른 색깔)에 따른 각 컬럼의 계수

 

2. 라쏘회귀(lasso Regression)

(1) 정의

LASSO(Least Absolute Shrinkage and Selection Operator)

추정계수의 절댓값 합을 최소로 하는것 (0에 가까워짐)

 

(2) 특징

- 몇몇 기여도가 낮은 계수들이 0으로 수렴하려고 함

- 반면 기여도가 높은 특정변수의 계수는 커지는 단점이 있음

- 딥러닝 loss function에서 L1 panelty로 사용됨

 

(3) 코드

# LASSO
fit = Lasso(alpha=0.5, fit_intercept=True, normalize=True, random_state=123).fit(X_train, Y_train)
pred_tr = fit.predict(X_train)
pred_te = fit.predict(X_test)

 

<exmaple>

import warnings
warnings.filterwarnings('always')
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, Lasso, ElasticNet
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target
print('Data View')
display(pd.concat([pd.DataFrame(y, columns=['diabetes_value']), pd.DataFrame(X, columns=diabetes.feature_names)], axis=1).head())

alpha_weight = 0.5
fit = Lasso(alpha=alpha_weight, fit_intercept=True, normalize=True, random_state=123).fit(X, y)
pd.DataFrame(np.hstack([fit.intercept_, fit.coef_]), columns=['alpha = {}'.format(alpha_weight)])

 

(4) 추정절대가중치별(각기다른 색깔의 그래프) 각 컬럼의 계수에 대한 그래프

- 0으로 수렴하는 계수가 존재한다

 

3. 엘라스틱 넷(elastic net)

(1) 정의

추정계수의 절댓값 합과 제곱합을 동시에 최소로 하는것

 

(2) 특징

큰 데이터셋에서 릿지와 라쏘의 효과를 모두 반영하기 좋음 (적은 데이터셋은 효과적음, 릿지 라쏘와 반대)

 

(3) 코드

# Elastic Net
fit = ElasticNet(alpha=0.01, l1_ratio=1, fit_intercept=True, normalize=True, random_state=123).fit(X_train, Y_train)
pred_tr = fit.predict(X_train)
pred_te = fit.predict(X_test)

 

*출처 : 패스트캠퍼스 "파이썬을 활용한 시계열 데이터분석 A-Z"

반응형