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)
'인공지능' 카테고리의 다른 글
On Device AI: 디바이스 내 인공지능에 대한 이해 (0) | 2024.03.16 |
---|---|
다국어 지원 딥러닝 모델 (1) | 2024.03.16 |
ChatGPT에게 잘 질문하기 (Template) (0) | 2024.03.08 |
ChatGPT에게 잘 질문하기 (Prompt 엔지니어링) (0) | 2024.03.06 |
배치 정규화 (Batch Normalization) (0) | 2022.04.17 |