My Data Story

[회귀] 비선형 회귀 - 다항 회귀, 스플라인 회귀 본문

Machine Learning/2. 지도 학습 알고리즘

[회귀] 비선형 회귀 - 다항 회귀, 스플라인 회귀

Hwasss 2021. 8. 6. 09:42
728x90

◈  '회귀' 목차 

1. 선형 회귀 개념

2. 선형 회귀 모델 훈련

3. 선형 회귀 모델 평가 및 모델 선택

4. 선형 회귀로 새로운 데이터 예측

5. 선형 회귀 모델 해석

6. 선형 회귀 가설 검정 : 회귀 진단

7. 비선형 회귀 - 다항 회귀, 스플라인 회귀

     응답 변수와 예측 변수 관계가 비선형일  때 적용할 수 있는 다항회귀, 스플라인회귀, 일반화가법모형에 대해 살펴보자.

8. 규제가 있는 선형 회귀


응답 변수와 예측 변수간의 관계가 반드시 선형일 필요는 없다. 

비선형 관계를 띈다면 다항회귀나 스플라인 회귀와 같은 비선형 모델을 고려해볼 수 있다. 

 

어떤 모델이 비선형 회귀 모델일까?  본질적으로 예측 변수들의 선형 결합 또는 일부 변환으로 응답 변수를 표현할 수 없는 모든 모델을 말한다. 통계학자가 비선형 회귀에 대해 말한다면, 이는 최소 제곱 방법으로 피팅할 수 없는 모델을 의미한다. 비선형 회귀 모델은 수치 최적화가 필요하기 때문에 피팅하기 어렵고 더 많은 계산을 필요로 한다. 이러한 이유로 가능하면 선형 모형을 이용하는 것이 일반적이기는 하다.

1. 다항 회귀

데이터가 비선형인 경우, 각 특성의 거듭제곱을 새로운 특성으로 추가하여 확장된 특성을 포함한 데이터 셋에 선형모델을 훈련시키는 기법이다. 

1.1 모델 구현

사이킷런에서 특성의 거듭제곱을 생성할 때는 PolynomialFeatures 를 이용한다.

이때 PolynnomialFeatures 파라미터 중 includ_bias 는 편향을 추가 여/부에 대한 입력이다.


예를 들어 특성이 a,b 2개 있다고 할 때
PolynomialFeatures(degree=2, include_bias=True) 이면 a,b,c,ab,ac,bc,1 항 생성하고,

PolynomialFeatures(degree=2, include_bias=False) 이면 a,b,c,ab,ac,bc 항 생성한다.

 

from sklearn.preprocessing import PolynomialFeatures
from sklearn.Linear_model import LinearRegression

#LinearRegression은 intercept 에 대해 따로 학습하기 때문에 include_bias=False 로 설정
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.transform(X)

lin_reg = LinearRegression() 
lin_reg.fit(X_poly, y)
print(lin_reg.intercept_, lin_reg.coef_

#LinearRegression(fit_intercept=False) 하면, lin_reg.intercept_=0 된다.

 

특성이 여러 개 일때 다항 회귀는 특성 사이의 관계를 찾을 수 있다. (일반적인 선형 회귀 모델에서는 못 한다.)

 

1.2 모델 선택

다항 회귀는 선형 회귀보다 파라미터가 많아서 훈련 데이터에 과대 적합되기 쉽다. 

 

그렇다면, 어느 정도 복잡한 모델을 사용할지 어떻게 결정할 수 있을까? 

또 모델이 데이터에 과대 적합 또는 과소 적합 되었는지 어떻게 알 수 있을까?

(1) 교차 검증 

모델의 일반화 성능을 추정하기 위해 교차 검증을 사용할 수 있다. 

훈련 데이터에서 성능이 좋지만 교차 검증 점수가 나쁘다면 모델이 과대 적합된 것이다. 

만약 양쪽 모두 좋지 않다면 모델은 과소 적합된 것이다.

(2) 학습 곡선 확인 ★

훈련 세트 크기 또는 훈련 반복에 따른 훈련 세트의 모델 성능과 검증 세트의 모델 성능을 그래프로 나타내어 비교한다.

 

from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

def plot_learning_curve(model, X, y) :
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
    train_errors, val_errors = [], []
    
    for m in range(1, len(X_train)) :
        model.fit(X_train[:m], y_train[:m])
        y_train_predict = model.predict(X_train[:m])
        y_val_predict = model.predict(X_val)
        train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
        val_errors.append(mean_squared_error(y_val, y_val_predict))
        
    plt.plot(np.sqrt(train_errors), 'r-+', linewidth=2, label='훈련세트')
    plt.plot(np.sqrt(val_errors), 'b--', linewidth=3, label='검증세트')

 

 

<학습 곡선1 - 과소 적합된 모델>

 

 

위 그래프는 두 곡선이 수평한 구간을 만들고, 꽤 높은 오차에서 매우 가까이 근접해 있다. 이는 과소 적합된 모델이다. 

과소 적합된 모델은 훈련 샘플을 추가해도 별 효과가 없고  더 복잡한 알고리즘을 적용하거나 새로운 특성을 추가해야 한다.

 

 

<학습 곡선2 - 과대 적합된 모델>

 

 

위 그래프는 훈련 데이터의 오차가 학습 곡선1보다는 낮은 곳에 위치한다.

하지만 훈련 오차와 검증 오차 두 곡선 사이의 공간이 존재한다. 

훈련 데이터에서의 모델 성능이 검증 데이터에서보다 훨씬 낮다는 뜻이고, 이는 과대 적합된 모델이다.

 

과대 적합된 모델은 검증 오차가 훈련 오차에 근접할 때까지 더 많은 훈련 데이터를 추가해야 한다.

 

 

※ 편향/분산 트레이드 오프

모델의 일반화 오차는 3가지 다른 종류의 오차 합으로 표현할 수 있다. 

 

  • 편향 
    잘못된 가정으로 발생한 오차 
    편향이 큰 모델은 훈련 데이터에 과소 적합되기 쉬움
  • 분산 
    훈련 데이터에 있는 작은 변동에 과도하게 민감하기 때문에 발생한 오차
    자유도가 높은 모델은 높은 분산을 가지기 쉬워 훈련 데이터에 과대 적합되기 쉬움
  • 줄일 수 없는 오차
    데이터 자체에 있는 잡음 때문에 발생한 오차

=> 모델의 복잡도가 커질수록 분산은 커지고 편향은 작아진다. 

 

2. 스플라인

다항 회귀는 비선형 관계에 대해 어느 정도의 곡률을 담아낼 수 있다. 하지만 3차, 4차 다항식과 같이 고차 항을 추가하는 것은 종종 회귀방정식에 바람직하지 않은 '흔들림'을 초래한다. 비선형 관계를 모델링하는 또 다른 더 나은 방법은 스플라인을 사용하는 것이다. 

 

스플라인은 고정된 점들 사이를 부드럽게 보간하는 방법을 말한다. 스플라인에 대한 좀 더 기술적인 정의는 일련의 조각 별 연속 다항식을 뜻한다.  구간별 다항식은 예측 변수를 위한 일련의 고정된 점(매듭) 사이를 부드럽게 연결한다. 

 

스플라인을 구하는 것은 다항 회귀보다 훨씬 복잡하다. 통계 소프트웨어는 일반적으로 스플라인 피팅을 위한 구체적인 사항들을 모두 다룰 수 있도록 지원한다. R패키지 splines는 회귀 모형에서 b-스플라인 항을 만드는데 사용할 수 있는 bs 함수를 포함한다. 

 

스플라인 항을 포함하여 모델을 구현할 경우, 선형 항 계수는 변수에 대한 직접적인 의미를 갖지만 스플라인 항 계수는 해석하기 어렵다. 대신 스플라인의 적합도를 확인하기 위해 시각화 방법을 사용하는 것이 더 유용하다. 

 

다항 회귀 모델에 대한 편잔차 그림과 스플라인 회귀 모델에 대한 편잔차 그림을 비교해보면,  스플라인 회귀 모델은 다항회귀 모델에 비해 좀 더 매끄럽게 매칭되며 스플라인의 유연성이 더 뛰어난 것을 볼 수 있다. 

 

 

< 왼쪽 : 다항 회귀 편잔차 그림, 오른쪽 : 스플라인 회귀 편잔차 그림 >

 

 

스플라인 회귀 곡선이 데이터에 더 가깝게 맞는 것을 의미하지만, 이것이 스플라인 회귀가 더 좋다는 의미는 아니다. 

 

3. 일반화가법 모형

사전 지식이나 회귀 진단을 통해 응답 변수와 예측 변수 사이에 비선형 관계가 있다는 것을 알았다고 하자. 다항 항은 관계를 포착하기에 유연성이 부족할 수 있으며 스플라인 항은 매듭을 어딜 할지 정해줘야 한다. 

 

일반화가법 모형(GAM)은 스플라인 회귀를 자동을로 찾는 기술이다. R의 gam 패키지로 GAM 모델을 피팅할 수 있다.