본문 바로가기

* [R_Python] 데이터분석 정리/[Python] 머신러닝

규제가 있는 선형 모델 (릿지,라쏘,엘라스틱넷)

모델링에서 과대적합을 감소시키는 방법으로 규제를 사용한다.

다항 회귀 모델에서 규제하는 방법은 다항식의 차수를 줄이는 방법도 있지만,

보통 모델의 가중치를 제한하여 규제를 가하는 방법을 택한다.

이때 모델 가중치를 제한하는 방법으로, 릿지/라쏘/엘라스틱넷이 존재한다.

 


선형 모형 과적합 발생 時 (1) 다항식 차수 감소  
  (2) 규제 있는 모델 사용 ① 릿지 : L2 규제 사용
    ② 라쏘 : L1 규제 사용
    ③ 엘라스틱넷 : 릿지 + 라쏘 혼합

※ 보통 릿지 사용
- 특성 수 줄이고 싶으면 라쏘
- 특성이 데이터보다 많을 땐 엘라스틱넷  선호

※ 스케일링 필수!

 

① 릿지 

  - L2 규제 사용

  - 모델의 가중치가 가능한 작게 유지되도록 만들어줌

  - 규제항은 훈련하는 동안 비용함수만 추가되어 사용 (성능 지표엔  사용하지 않음)

     ㄴ 비용함수는 미분 가능해야하고, 성능 지표는 목표에 가까워야 하기 때문

     ㄴ 성능 지표로 정밀도/재현율을 사용하여 평가하는 것이 좋음

  - 릿지 회귀를 계산하기 위해 정규방정식/경사 하강법 사용 가능

   

1. 릿지 회귀의 비용 함수

$ J(\theta) $ = MSE($\theta$) + $\alpha$ $1 \over 2$ $\sum_{i=1}^n \theta^{2}_{i} $

where $ \alpha $ : 규제 조절 역할. (0 이면, 선형회귀와 같아짐)

i = 1부터 시작 :  편향 $ \theta_0 $는 규제하지 않기 때문

$\alpha$ $1 \over 2$ $\sum_{i=1}^n \theta^{2}_{i} $ : 규제항

L2 노름 : $\sum_{i=1}^n \theta^{2}_{i} $ 

 

2. $ \alpha $에 따른 릿지 모델

- $\alpha$를 증가시킬 수록, [분산 감소 + 편향 증가]를 확인할 수 있음

 

Python 코드

- 사이킷 런 : Ridge(alpha) 사용

- 확률적 경사하강법 : SGDRegressor(penalty="l2")

 

② 라쏘

  - L1 규제 사용

  - 자동으로 특성 선택을 하고 희소 모델을 만듬

    (덜 중요한 가중치는 0으로 만드려 함)

 

1. 라쏘 회귀의 비용 함수

$ J(\theta) $ = MSE($\theta$) + $\alpha$  $\sum_{i=1}^n \mid \theta_{i} \mid $

- 라쏘의 비용 함수는 $ \theta = 0 $일 때, 미분 가능하지 않음 (이럴 땐, 서브그레디언트 벡터를 사용!)

 

※ 라쏘 대 릿지

- 등고선 : 두 개 파라미터에 대한 손실함수

- 노란선 : 파라미터의 이동

- $ alpha $는 노란선에 따라 증가시 왼쪽, 감소시 오른쪽 이동 

- 하얀선 : 경사하강법 파라미터 최적화 과정

 

<왼쪽 그림>

- L1손실은 축에 가까워지면서 선형적으로 줄어듦 (=> $theta_{2}$가 먼저 0에 도달)

- L2손실은 원점에 가까울수록 줄어드는 모습

 

<오른쪽 그림>

- 라쏘 비용 함수 파라미터가 최적점에 가까워질때, 0에 가까워짐

  L1의 그레디언트는 0에서 정의되지 않기 때문에 진동이 있음

  (이 지점에서 그레디언트는 -1~1사이)

- 릿지 비용 함수 (1) 파라미터가 최적점에 가까워질수록 그레디언트가 작아짐 (진동 없음)

                      (2) $alpha$를 증가시킬수록 최적 파라미터가 원점에 가까워지나 0이 되진 않음

Python 코드

- 사이킷 런 : Lasso(alpha) 사용

- 확률적 경사하강법 : SGDRegressor(penalty="l1")

 

 

③ 엘라스틱넷 

- 릿지와 라쏘 회귀를 절충한 모델 (혼합비율 $r$로 조절)

 

$ J(\theta) $ = MSE($\theta$) + $r \alpha$  $\sum_{i=1}^n \mid \theta_{i} \mid $+ $\alpha$ $(1-r) \over 2$ $\sum_{i=1}^n \theta^{2}_{i} $  

 

Python 코드

- 사이킷 런 : ElastictNet(alpha, l1_ratio) 사용!  (l1_ratio = 혼합 비율 r)