일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- F분포
- 결정계수
- 구글 BERT의 정석
- 감성분석
- 모두의 딥러닝
- Django
- 가설검정
- 파이썬 pandas
- 기술통계학
- 은준아 화이팅
- 밑바닥부터 시작하는 딥러닝
- 기초통계
- 회귀분석
- 다층 퍼셉트론
- 오래간만에 글쓰네
- 텍스트 분류
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- 코사인 유사도
- word2vec
- rnn
- 머신러닝
- student t분포
- numpy
- 최소자승법
- 밑바닥부터 시작하는 딥러닝2
- Pandas
- 자연어 처리
- 차원축소
- 히스토그램
- 군집화
- Today
- Total
데이터 한 그릇
회귀)다항 회귀와 과(대)적합/과소적합 이해 본문
- 다항 회귀 이해
- 다항 회귀를 이용한 과소적합 및 과적합 이해
다항 회귀 이해
단순 선형 회귀 같은 경우에는 종속변수와 독립변수와의 관계가 일차방정식의 관계를 가진 회귀 모형이였다. 지금부터 알아볼 다항 회귀 같은 경우에는 종속변수와 독립변수의 관계가 일차방정식 이외의 2차 3차 이상의 관계를 가지는 회귀 모형을 알아볼 예정이다. 이를 다항 회귀라고 부른다.
주의해야할 점은 다항 회귀가 일차방정식의 "선"의 모양이 아니기 때문에 선형 회귀가 아니라고 착각할 수 있다는 점이다. 회귀 모형이 선형인지 선형이 아닌지에 대한 판단은 회귀 모형의 변수, 피처에 따라서 나뉘는 것이 아니라 회귀 모형의 계수에 따라서 나뉜다. 만일 y = ax + (a+1) * x^2 라고 했을 때, 변수가 일차 이상의 이차항을 보이고 있지만 회귀 계수의 경우 일차의 모습을 가지고 있기 때문에 여전히 선형의 특징을 가지고 있다고 할 수 있다.
다항 회귀가 사용되는 예시는 무엇이 있을까? 파이썬 내장 데이터 셋인 보스턴 주택 가격 데이터 셋에서 집값을 구성하는 데이터들끼리의 관계를 살펴보면 일차방정식의 관계를 가진 게 아니라 곡선의 관계를 가진 것들을 확인할 수 있다. 이때 단순 선형 회귀 모델을 사용했을 경우 데이터에 대한 예측력이 떨어질 수 있다. 따라서 곡선의 다항 회귀 모형을 사용해야 예측력을 높일 수 있다.
다항 회귀 모델을 만드는 경우 안타깝게도 사이킷런은 자체적인 다항 회귀 모델 모듈을 제공하지 않는다. 따라서 PolynomiaFeatures 모듈을 사용하여 일차 피처를 다항 피처로 변환하여 모델을 만들게 된다. 다음은 그 예시라고 할 수 있다.
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
X = np.arange(4).reshape(2,2)
print('일차 단항식 계수 피처 :\n', X)
poly = PolynomialFeatures(degree = 2)
poly.fit(X)
poly_ftr = poly.transform(X)
print('변환된 2차 다항식 계수 피처 : \n', poly_ftr)
사이킷런에서 polynomialfeatures 를 요청하고 객체를 생성한다. 이때 파라미터인 degree를 조정하여 몇차 다항식인지 설정한다. 만일 degree = 2로 설정했다면 이차다항식으로 설정한 것이다.
넘파이를 이용하여 1~4까지의 숫자를 2행 2열로 만든다. 이 값을 데이터라고 가정하고 이차 다항식으로 설정한 polynomualfeaures에 학습시키고 이차 피처로 변형시킨다.
def polynomial_func(X):
y = 1 + 2*X[:,0] + 3*X[:,0]**2 + 4 * X[:,1]**3
return y
X = np.arange(4).reshape(2,2)
print('일차 단항식 계수 feature : \n', X)
y = polynomial_func(X)
print('삼차 다항식 결정값 : \n', y)
from sklearn.linear_model import LinearRegression
poly_ftr = PolynomialFeatures(degree = 3).fit_transform(X)
print('3차 다항식 계수 피처 : \n', poly_ftr)
model = LinearRegression()
model.fit(poly_ftr, y)
print('polynomial 회귀 계수 \n', np.round(model.coef_,2))
print('polynomial 회귀 shape : ', model.coef_.shape)
polynomualfeatures를 통해서 어떻게 다항 피처로 변환했는지 살펴봤으면 변환 이후에 응용하는 것을 살펴보도록 하자. 먼저 3차 다항식을 예측한다고 했을 때, 임의로 3차 다항식의 계수를 결정한다. 그리고 3차 다항 피처로 변환한 데이터와 임의로 결정한 3차 다항식을 학습시킨다. 학습을 시킨 이후에 모델의 회귀 계수를 .coef_를 통해서 확인해보면,
[0, 0.18, 0.18, 0.36, 0.54, 0.72, 0.72, 1.08, 1.62, 2.34] 가 도출된다. 앞서 우리가 결과 식으로 설정한 식을 살펴보면 1+2x{1} +3x^2{1} + 4x^3{2} 이며 계수 값은 [1,2,0,3,0,0,0,0,0,4] 이다. 분명 차이가 존재하지만 다항 회귀로 근사하고 있음을 알 수 있다.
이때 fit_transform을 하고 모델에 그 데이터를 순차적으로 집어넣는 방식을 사용할수도 있지만 명료하게 하기 위해서 pipeline을 사용할 수도 있다. 다음은 pipeline을 이용하여 간단화한 코드이다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np
def polynomial_func(X):
y = 1 + 2*X[:,0] + 3*X[:,0]**2 + 4*X[:,1]**3
return y
model = Pipeline([('poly',PolynomialFeatures(degree=3)),
('linear',LinearRegression())])
X = np.arange(4).reshape(2,2)
y = polynomial_func(X)
model.fit(X,y)
print('Polynomial 회귀 계수 \n', np.round(model.named_steps['linear'].coef_,2))
다항 회귀를 이용한 과소적합 및 과적합 이해
예를 들어서 종속변수의 데이터와 독립변수의 데이터의 관계를 산점도로 나타냈더니 곡선의 형태를 보인다고 가정해보자. 우리는 피처를 다항 피처로 변화하여 앞선 코드에서 보였던 과정을 수행할 수 있다. 하지만 다항 관계를 잘못 설정하게 된다면 과소적합 혹은 과적합하여 모델을 생성할 수 있다.
편향-분산 트레이드오프는 머신러닝이 극복해야 할 가장 중요한 이슈이다. 만일 곡선의 모습을 보이는 데이터를 1차 방정식의 관계를 가지고 있는 것으로 단순하게 판단하게 된다면 과소적합하게 모델을 만들었다고 할 수 있다. 이는 고편향되어 있다고 할 수 있다. 반대로 2차 방정식의 관계를 가지고 있는 것을 과도하게 곡선을 만들어서 모델을 만들게 된다면 지나치게 높은 변동성을 가지게 되면서 예측력이 떨어질 것이다. 이는 과대적합하면서 고분산성을 가졌다고 할 수 있다.
'머신러닝 > 회귀' 카테고리의 다른 글
회귀) 로지스틱 회귀 (0) | 2021.04.30 |
---|---|
회귀)규제 선형 모델 -릿지, 라쏘, 엘라스틱넷 (0) | 2021.04.30 |
회귀) 단순 선형 회귀를 통한 회귀 이해 (0) | 2021.04.16 |