본문 바로가기
Studying/Machine Learning

[머신러닝] Overfitting & Regularization (with Polynomial function)

by giem 2022. 7. 12.
반응형

 

 

이전 포스트까지는 linear regression으로 데이터에 가장 잘 맞는 직선을 찾았다.

 

하지만 직선이 데이터를 설명할 수 없다면 곡선을 찾아야 할 것이다.

 

이때 Polynomial regression을 사용한다.

 


Overfitting 이해

 

먼저 4차 polynomial function을 정의하고 그래프로 표현해보겠다.

 

from matplotlib import pyplot
from autograd import grad
from autograd import numpy

numpy.random.seed(0)    # fix seed for reproducibility
x = numpy.linspace(-3, 3, 20)
y = x**4 + x**3 - 4*x**2 + 8*numpy.random.normal(size=len(x))
pyplot.scatter(x, y);

이 데이터는 곡선의 형태이기 때문에 직선으로 표현하는 데에 무리가 있다.

 

이 데이터를 맞추기 위해서는 2차이상의 함수가 필요할 것이다.

 

그래프로 확인하기 위해 패키지를 하나 가져오겠다.

 

from urllib.request import urlretrieve

URL = 'https://raw.githubusercontent.com/engineersCode/EngComp6_deeplearning/master/scripts/plot_helpers.py'
urlretrieve(URL, 'plot_helpers.py')

from plot_helpers import interact_polyreg

max_degree = 15
interact_polyreg(max_degree, x, y)

이렇게 그래프를 확인해보면

 

차수가 1일 때는 MAE가 매우 높고 데이터를 잘 맞추지 못한 것을 확인할 수 있다.

 

2차를 보면 어느 정도 잘 맞춘 것을 볼 수 있고 MAE가 절반 가까이 줄어든 것을 확인할 수 있다.

 

양 끝이 올라가는 형태이기 때문에 짝수차 함수만 보겠다.

데이터를 잘 설명하는 곡선이 그려졌다.

 

이 정도에서 끝나는 것이 적당하다고 볼 수 있다.

앞에서 데이터를 뽑아낸 것도 4차 함수였다.

 

이 이상으로 차수를 늘리는 것이 overfitting이다.

 

15차까지 늘려보겠다.

거의 모든 데이터를 맞추는 형태이다.

 

하지만 이것은 training 데이터이기 때문에 실제 test 데이터가 들어오면 예측률이 떨어질 것이다.

 

위 그래프에서 약 2.9 근처에 데이터가 들어오면 매우 큰 값을 예측하게 되기 때문에

큰 오류 값을 나타내는 것을 예로 들 수 있다.

 


Regularization

 

이를 보정하기 위해 cost function에 아래와 같은 제한 조건을 추가한다.

 

$$\lambda\sum_{j=1}^dw_j^2$$

 

이를 MSE를 사용한 cost function에 적용하면 다음과 같다.

 

$$L(\mathbf{w}) = \frac{1}{N} \lVert \mathbf{y} - \mathbf{Xw} \rVert^2 + \lambda \sum_{j=1}^d w_j^2$$

 

이 cost function은 계수가 커지면 두번째 항이 커지게 돼서 cost 값이 늘어나기 때문에

계수들이 커지는 것을 방지한다.

 

$\lamda$값이 커질 수록 계수들을 더 작게 만든다.

 

패키지를 통해 regularization 유무에 따른 차이를 확인해 보겠다.

 

interact_polyreg(max_degree, x, y, regularized=True)

위는 10차로 늘렸을때의 그래프다. 차수가 커질수록 regularization의 중요성이 커지는 것을 볼 수 있다.

반응형

댓글