본문 바로가기
인공지능

Polynomial Regression (scikit learn)

by 느리게 걷는 즐거움 2022. 8. 2.
728x90
반응형

Polynomial Regression

Regression에서는 입력 \( x \in \mathbb{R} \)를  \( f(x) \in \mathbb{R} \)로 출력하는 함수 \( f \)를 찾는 것을 목표로한다. 

사이킷런 라이브러리를 이용하여 Polynomial(다항식) regression을 연습해본다.

 

예측을 위해서 \( [0-2.5, 5-2.5) \) 사이의 uniform distribution을 갖는 데이터를 생성한다. Ground true 함수는 \( y= x^2 + 2x +3 \)의 함수에 렌덤 노이즈를 추가한다.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

n = 100
x = 5 * np.random.rand(n,1) -2.5
print(x.mean())
y = x**2 + 2*x + 3 + np.random.rand(n,1)*3  # nx1 random matrix
plt.scatter(x, y, s=5)

2차 함수를 이용하기 위해서 PolynomialFeatures를 사용한다. poly_features로 가져온 데이터는 x로 생성된 데이터를 2차함수에 맞게 다항식을 적용하여 새롭게 데이터가 생성된다.

 

fir_tranform()함수를 통해서 데이터를 변형한 결과인 x_poly와 기존 데이터 x를 비교하면 \( x^2 \) 데이터가 추가된 것을 확인할 수 있다.

from sklearn.preprocessing import PolynomialFeatures

poly_features = PolynomialFeatures(degree=2, include_bias=False) 
x_poly = poly_features.fit_transform(x)
print(f'x_poly: {x_poly[:5]}')

x_and_xx = np.hstack((x, (x**2)))
print(f'x_and_xx: {x_and_xx[:5]}')
print(x_and_xx.shape)

<Result>
x_poly: [[-2.01574248  4.06321776]
 [ 1.51547098  2.2966523 ]
 [-0.09829544  0.00966199]
 [-2.06944878  4.28261824]
 [-2.02863948  4.11537814]]
x_and_xx: [[-2.01574248  4.06321776]
 [ 1.51547098  2.2966523 ]
 [-0.09829544  0.00966199]
 [-2.06944878  4.28261824]
 [-2.02863948  4.11537814]]
(100, 2)

LinearRegression 모델을 생성하고 학습을 위해 변형된 x_poly데이터와 y값을 전달한다. 학습이 완료된 model의 coef_와 intercept_ 변수를 확인하여 coefficient(계수)와 constant(상수)값을 확인한다. 초기에 데이터 생성을 위해 사용한 다항식의 계수와 상수값과 유사한 값임을 확인할 수 있다.

from sklearn.linear_model import LinearRegression
# model.coef_, model.intercept_
model = LinearRegression()
model.fit(x_poly, y) 

# y = x**2 + 2*x + 3 + np.random.rand(n,1)  # nx1 random matrix
print(model.coef_)
print(model.intercept_)

<Answer>
[[2.03828043 1.02078439]]
[4.43768936]

학습된 모델을 사용하여 x의 값을 예측한 결과를 그림으로 표시한다. 다항식을 위한 형태로 변화된 x_poly를 입력으로 전달 시 얻어지는 예측값 y_pred를 빨간색 '+'로 표시한다. 데이터 분포의 중심에 표시되는 것을 확인할 수 있다. 모델의 계수와 상수값으로 그래프를 녹색으로 표시하면 빨간색 '+'로 예측한 예측값을 포함하는 것을 알 수 있다. 

xx = np.linspace(-3, 3, 100)
y_pred = model.predict(x_poly)
plt.plot(x, y_pred, 'r+', markersize=10)
yy =  (model.coef_[0][1]*(xx**2)+model.coef_[0][0]*xx+model.intercept_)
plt.plot(xx,yy,'g')
plt.scatter(x, y, s=5)
728x90
반응형