모델링에서 과대적합을 감소시키는 방법으로 규제를 사용한다.
다항 회귀 모델에서 규제하는 방법은 다항식의 차수를 줄이는 방법도 있지만,
보통 모델의 가중치를 제한하여 규제를 가하는 방법을 택한다.
이때 모델 가중치를 제한하는 방법으로, 릿지/라쏘/엘라스틱넷이 존재한다.
선형 모형 과적합 발생 時 | (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)
'* [R_Python] 데이터분석 정리 > [Python] 머신러닝' 카테고리의 다른 글
로지스틱 회귀와 소프트맥스 회귀 (0) | 2021.07.18 |
---|---|
경사 하강법의 조기 종료 (0) | 2021.07.18 |
결정 트리 - Decision Tree #이론 + 파이썬 코드 #쉬운 정리 (0) | 2020.11.24 |