본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Machine Learning For Study

Hands-on ML : 4. 5 릿지(Ridge),라쏘(Lasso),엘라스틱 넷(Elastic-net) 모델 훈련

by 꿀먹은데이터 2022. 5. 20.

4.5 규제가 있는 선형 모델

과대적합을 감소시키는 좋은 방법으로 다항회귀모델의 다항식 차수를 감소시키는 등 자유도를 줄이는 방법이다.

4.5.1 릿지 회귀

릿지 회귀(Ridge Regression)은 능형회귀로 불리며 선형회귀에 규제가 추가된 것이다.

 

이 규제는 비용함수에 추가되는 것으로 테스트 세트에서 성능을 평가하거나 예측할 때 적용되지는 않는다.

위 식에서 i가 1부터 시작하는 것은 θ0는 규제되지 않는 것을 의미
w를 가중치 벡터(θ1~θn)라고 정의 ->  규제항은 ½(∥ w ∥2)^2와 같다.

여기서 ∥ w ∥2가 가중치 벡터의 ℓ2노름이다.

이를 경사하강법에 적용하려면 MSE 그라디언트 벡터에 αw를 더하면 된다.

선형회귀와 마찬가지로 릿지 회귀를 계산하기 위해 정규방정식과 경사하강법을 이용할 수 있다.

릿지회귀 적용 예

from sklearn.linear_model import Ridge

ridge_reg = Ridge(alpha=1,
                 solver="cholesky",
                 random_state=42)
ridge_reg.fit(X,y)
ridge_reg.predict([[1.5]])   # 새로운 샘플에 대한 예측

array([[1.55071465]])

 

확률적 경사하강법을 이용해 릿지 모델 훈련하기

solver='sag'를 이용하면 확률적 평균 경사하강법(Stochastic Average Gradient Descent)을 사용할 수 있다.

ridge_reg = Ridge(alpha=1, solver="sag", random_state=42)
ridge_reg.fit(X, y)
ridge_reg.predict([[1.5]])

array([[1.5507201]])

 

다음은 다양한 수준의 라쏘 규제를 사용한 선형 회귀와 다항 회귀이다.

4.5.2 라쏘 회귀

라쏘 회귀(Lasso Regression) 는 릿지 회귀처럼 비용함수에 규제항을 더하지만 ℓ2노름의 제곱을 2로 나눈 것 대신 가중치 벡터의 ℓ1노름을 사용한다.

라쏘회귀의 중요한 특징은 덜 중요한 변수의 가중치를 완전희 제거한다는 점이다.

(즉 가중치가 0이 된다.)

 

라쏘 회귀는 자동으로 특성 선택을 하고 희소 모델(sparse model)을 만든다.

왼쪽 열은 MSE 비용함수는 동일하지만, ℓ1,ℓ2 페널티 그래프에 있는 등고선은 다르다.
오른쪽 열은 비용함수에 규제항이 포함되어 있어서 등고선이 다르게 나타나며 최적 파라미터 값(빨간 네모)이 달라진 것을 볼 수 있다.

라쏘 비용함수에서 배치 경사하강법의 경로가 전역 최솟값(빨간 네모)으로 가는 도중에 지그재그로 튀는 경향을 보이는데, 이는 θ2=0에서 기울기가 갑자기 바뀌기 때문이다.

라쏘의 비용 함수는 θi=0에서 미분 가능하지 않다. 하지만 θ=0일 때 서브그레이디언트 벡터를 사용하면 경사 하강법을 적용하는데 문제가 없다.

Lasso 클래스를 사용한 간단한 예제.

from sklearn.linear_model import Lasso

lasso_reg = Lasso(alpha = 0.1)
lasso_reg.fit(X,y)
lasso_reg.predict([[1.5]])

array([1.53788174])

4.5.3 엘라스틱넷

엘라스틱 넷(Elastic Net)은 릿지회귀와 라쏘회귀를 절충한 모델이다.

규제항은 릿지와 회귀의 규제항을 단순히 더해서 사용하며, 두 규제항의 혼합정도를 혼합비율 r을 사용해 조절한다.

r=0이면 릿지회귀와 같고, r=1이면 라쏘회귀와 같다.

그럼 보통의 선형 회귀, 릿지, 라쏘, 엘라스틱넷을 언제 사용해야 할까?

적어도 규제가 약간 있는 것이 대부분 경우에 좋으므로 평범한 선형 회귀는 피해야 한다.

릿지가 기본이 되지만 실제 쓰이는 변수가 별로 없다면 라쏘나 엘라스틱넷을 선호한다.

 

엘라스틱넷 코드

from sklearn.linear_model import ElasticNet
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5, random_state=42)
elastic_net.fit(X, y)
elastic_net.predict([[1.5]])

array([1.54333232])

 

4.5.4 조기 종료

 경사하강법과 같이 반복적인 학습 알고리즘을 규제하는 방법으로,

검증 에러가 최솟값에 도달하면 훈련을 중지(조기 종료)시키는 것이다.

위 그래프를 보면 검증세트는 알고리즘이 학습됨에 따라 RMSE는 감소하면서 최솟값에 도달했다가 다시 상승한다.

이는 모델이 훈련데이터에 Overfitting 되었기 때문에 나타나는 현상이다.

 

SGD나 미니배치 경사하강법의 경우 비용함수의 곡선이 매끄럽지 않아서 최솟값에 도달했는지 확인하기 어려울 수 있다.

 검증 오차가 일정 시간(횟수)동안 최솟값보다 클 때 모델이 더 개선되지 않는다고 판단하여 학습을 멈추고 최소였던 검증오차로 되돌아가는 방식을 사용한다.

 

 

자세한 코드는 저의 깃허브를 참고하시면 됩니다.

https://github.com/rootofdata/handson-ML

 

GitHub - rootofdata/handson-ML: handson ML

handson ML. Contribute to rootofdata/handson-ML development by creating an account on GitHub.

github.com

 

참고 문헌 :

https://book.naver.com/bookdb/book_detail.nhn?bid=16328592

 

핸즈온 머신러닝

머신러닝 전문가로 이끄는 최고의 실전 지침서 텐서플로 2.0을 반영한 풀컬러 개정판 『핸즈온 머신러닝』은 지능형 시스템을 구축하려면 반드시 알아야 할 머신러닝, 딥러닝 분야 핵심 개념과

book.naver.com