본문 바로가기
머신러닝,딥러닝/ML 회귀분석(이상엽 교수님)

회귀모델: 라쏘(Lasso), 릿지(Ridge), 엘라스틱 넷(ElasticNet)

by 코듀킹 2023. 5. 29.
목차
1. 라쏘(Lasso)
2. 릿지(Ridge)
3. 엘라스틱 넷(ElasticNet)

 

우리는 선형회귀 모형에 대해서 배웠고, 성능평가 방법과 규제화에 대해서도 배웠다.(앞 내용을 모르시는 분은 아래 더 보기를 참고해 주세요.) 선형회귀 모델을 통해 학습을 시키고, \(R^2\) 를 통해 성능평가를 하고, 과적합으로 인해 성능이 좋지 않으면 L1 penalty term과 L2 penalty term 이용해서 규제화를 시킨다고 했다. 특히 다중 회귀 문제에서는 과적합 현상이 자주 일어나기 때문에 규제화가 꼭 필요할 때가 많다. 

 

 

그래서 오늘은 선형 회귀 모형의 파라미터 최적값을 구하는 데 사용하는 mse 비용함수에 penalty term을 처음부터 추가해서 파라미터의 최적값을 찾도록 학습시키는 방식인 Lasso, Ridge, ElasticNet에 대해서 알아보겠다. 즉, 규제화를 적용해서 학습시키는 방식인 선형 회귀 모형들에 대해서 알아보겠다.

 

 

1. 라쏘(Lasso)

L1 규제화 방법을 적용한 선형회귀 모형을 Lasso라고 한다. 원래의 비용함수인 mse에 L1 페널티항을 더해서 새로운 비용함수로 사용하는 방식이다. 

 

$$ MSE + L1\ penalty\ term $$

$$ = MSE + \lambda\cdot L1-norm $$

$$ = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y_i})^2 + \lambda \sum_{j=1}^{m}|w_j| $$

 

Lasso는 위 식을 최소화시키는 값을 찾는 방식이다. L1 penalty term을 사용하기 때문에 파라미터값을 0으로 만들어서, 차원 축소의 효과까지 얻을 수 있다. 파이썬 sklearn에서 Lasso를 사용하려면, Lasso 클래스를 써야 한다.

 

from sklearn.linear_model import Lasso
model_lasso = Lasso(alpha = 0.5) # aplha => regularization strength

 

alpha는 penalty term의 하이퍼 파라미터인 \(\lambda\)이다. Lasso는 클래스를 호출할 때, alpha를 꼭 설정해주어야 한다. 위 예제에서는 이를 0.5로 설정해 주었다. 기본 선형 회귀 모형 같은 경우엔 아래와 같이 LinearRegression 클래스를 사용하는데, penatly term을 사용하지 않기 때문에 aplha를 따로 설정해주지 않는다. 

 

from sklearn.linear_model import LinearRegression
model = LinearRegression() # 기본적인 선형회귀 모형

 

이렇게 불러온 모델을 기존에 학습데이터와 평가데이터로 나눠놓은 데이터에 적용하여 학습시키고, 성능평가를 하면 된다. 이렇게 학습시키고 나서 .coef_ 함수를 사용해 보면, 파라미터 값이 0인 값이 나오는 경우가 있다. L1 페널티항을 사용했기 때문이다.

 

 

 

model_lasso.fit(X_train, y_train)
model_lasso.coef_ # 0인 값이 나올 수 있다.
model_lasso.score(X_test, y_test)

 

 

이렇게 Lasso는 L1 규제화 방식을 사용하는 선형회귀 모형이다. 파라미터 값을 0까지도 줄일 수 있는 특징으로 인해 차원축소 효과까지 얻을 수 있다는 특징이 있다.

 

2. 릿지(Ridge)

Ridge는 L2 규제화 방법을 적용한 선형회귀 모형이다. 아래 식을 최소화시키는 값을 찾는 방식이다.

 

$$ MSE + L2\ penalty\ term $$

$$ = MSE + \lambda\cdot (L2-norm)^2 $$

$$ = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y_i})^2 + \lambda \sum_{j=1}^{m}w_j^2 $$

 

Ridge는 L2 penalty term을 사용한다. 파이썬 sklearn에서 Ridge를 사용하려면, Ridge 클래스를 사용해야 한다.

 

from sklearn.linear_model import Ridge
model_ridge = Ridge(aplha=10)

 

Lasso와 마찬가지로, Ridge도 하이퍼 파라미터인 \(\lambda\)를 사용하기 때문에 aplha를 설정해주어야 한다. 학습과 성능평가 방식은 똑같다.

 

model_ridge.fit(X_train, y_train)
model_ridge.score(X_test, y_test)

 

3. 엘라스틱 넷(ElasticNet)

L1 페널티 항과 L2 페널티항을 모두 사용하는 선형회귀 모형이 ElasticNet이다. 식은 다음과 같다.

 

$$ MSE + L1\ penalty\ term + L2\ penalty\ term $$

$$ = MSE + r\lambda\cdot L1-norm + \frac{1-r}{2}\lambda\cdot (L2-norm)^2 $$

$$ = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y_i})^2 + r\lambda\sum_{j=1}^{m}|w_j| + \frac{1-r}{2}\lambda \sum_{j=1}^{m}w_j^2 $$

 

Elastic Net은 라쏘와 릿지의 정규화 방법을 모두 포함한 방법이다. 라쏘와 릿지의 최적화 지점이 서로 다르기 때문에 두 규제화 항을 합쳐서 r로 규제정도를 조절해줘야 한다는 특징이 있다.  파이썬 sklearn에서 Elastic Net를 사용하려면, ElasticNet 클래스를 써야 한다.

 

from sklearn.linear_model import ElasticNet
model_elnet = ElasticNet(aplha=0.5, l1_ratio=0.5)

 

이번에는 aplha만 설정해 주는 것이 아니라, l1_ratio까지 설정해주어야 한다. l1_ratio가 라쏘와 릿지의 규제정도를 조절해 주는 r값이다. 0.5로 설정하면, L1과 L2를 반반씩 사용하겠다는 뜻이다. l1_ratio를 1로 설정하면, L1 만 사용하는 것이고, 0이면 L2 만 사용하는 방식이다. 일반적으로 0.5를 사용한다. 학습과 성능평가 방식은 똑같다.

 

model_elnet.fit(X_train, y_train)
model_elnet.score(X_test, y_test)

 

 

여기까지 Lasso, Ridge, ElasticNet에 대해 알아보았다. 마인드맵으로 정리하면 아래와 같다. 전부 회귀 문제에서 사용하는 모델이기 때문에 분류 문제를 만나면, 다른 모형을 사용해야 한다. 

 

 

 

 

선형 회귀, Lasso, Ridge, ElasticNet 중에 어떤 것을 사용할지는 우선, 사용가능한 모형들을 다 사용해 보고 평가 데이터에 대해 모형의 성능이 가장 좋은 모형을 최종적인 모형으로 사용하면 된다. 하이퍼 파라미터는 직접 설정해줘야 하는데, 그러한 과정을 하이퍼파라미터 튜닝이라고 한다. 이는 사람이 직접 일일이 설정하는 데에 시간이 오래 걸리기 때문에 자동으로 설정해 주는 Grid Search라는 방식이 있다. 하이퍼 파리미터 튜닝에 대해서는 다음 시간에 다뤄보겠다.

댓글