머신러닝&딥러닝/Python

[scikit-learn] 다항회귀 PolynomialFeatures

e냥냥 2022. 8. 1. 15:05
728x90

데이터의 분포가 곡선으로 나타나는 경우 일반적으로 선형회귀모형을 사용할 수 없으나 다항 회귀 모형을 사용할 수 있습니다.

다항 회귀는 데이터 각 특성의 제곱을 추가하여 확장된 특성을 포함하여 선형 회귀 모델을 훈련 시키는 방법입니다.

 

일반적인 Linear Regression은 $y = ax+b$ 와 같이 표현할 수 있는데 아래 샘플 데이터와 같이 곡선 형태의 데이터를 학습하게 된다면 직선의 모델이 생성되어 오차가 커지게 될 것입니다. 특성의 제곱을 추가하는 다항회귀는 $y = w_0+w_1x+w_2x^2+…+w_nx^n$ 과 같이 표현할 수 있으며 선형 회귀 모델보다 오차를 줄일 수 있습니다. 

 

 

기존 데이터의 특성을 제곱하는 방법으로 sklearn 라이브러리 preprocessing 패키지의 PolynomialFeatures 함수

이용할 수 있습니다. 

from sklearn.preprocessing import PolynomialFeatures

n = 200
x = 4 * np.random.rand(n, 1) - 1
y = 1.5 * x**2 + x + 5 + np.random.rand(n, 1)

plt.scatter(x, y, s=3)

 

곡선 형태의 샘플 데이터를 PolynomialFeature 함수를 이용하여 다항식 형태로 변환해보겠습니다. 

poly = PolynomialFeatures(degree=2, include_bias=False)
x_poly = poly.fit_transform(x)
print(poly.get_feature_names())
→ ['x0', 'x0^2']

print(x[0])
→ [1.27417549]

print(x_poly[0])
→ [1.27417549 1.62352318]

get_feature_names() 함수를 통해 만들어진 변수의 차수를 쉽게 확인할 수 있습니다.

degree 옵션은 차수를 조절하며, include_bias 옵션을 True로 할 경우 0차항까지 출력해줍니다. x_poly[0]값을 보면 기존의 1.27417549와 추가된 항이 보입니다.  확장된 데이터셋에 LinearRegression 선형 회귀 모형을 적용해보겠습니다. 

 

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(x_poly, y)

# 다항회귀 그래프
xx = np.linspace(-1, 3, 200)
xx_poly = poly.transform(xx.reshape(-1, 1))
y_pred = lr.predict(xx_poly)

plt.scatter(x, y, s=3)
plt.plot(xx, y_pred, 'r-', label = 'pred')
plt.legend()
plt.show()

PolynomialFeatures는 주어진 차수까지 특성 간의 모든 교차항을 추가하기 때문에 특성 간의 관계를 찾을 수 있습니다. 

 

 

 

감사합니다 :)

 

 

728x90
loading