AI/Machine Learning
[ML] Sklearn Polynomial Regression
운호(Noah)
2021. 7. 20. 00:23
Linear Regression 이란?
Linear Regression 은 선형 회귀이며, 선형 방정식은 아래 공식으로 표현할 수 있습니다.
- y = ax + b
하지만, 아래 그림처럼, 데이터가 비선형적으로 분포하고 있을 땐, 선형 회귀 모델의 오차는 커지게 됩니다.
따라서 만약, 데이터가 2차원 곡선 형태로 분포되어 있다면, 2차원 곡선 모델로,
3차원 곡선 형태로 분포되어 있다면, 3차원 곡선 모델로 접근하는 것이 오차를 줄이는 방법일 수 있습니다.
Polynomial Regression 이란?
Polynomial Regression 은 다항 회귀이며, 다항 방정식은 아래 공식으로 표현할 수 있습니다.
따라서, 데이터가 비선형적으로 분포하고 있을 땐, 아래 그림과 같이, 비선형 회귀 모델의 오차가 적어지게 됩니다.
Sklearn 의 Polynomial Regression
- reference
- Sklearn 의 Polynomial Regression 모델은 비선형 데이터를 학습하기 위해, 선형 회귀 모델을 사용하는 기법입니다.
- 입력 데이터셋을 X 라고 가정했을 때,
- X 의 거듭제곱(X^2, X^3, etc)을 생성해, 입력 데이터셋에 새로운 변수로 추가하고,
- 이 확장된 변수를 포함한 데이터셋을 선형모델로 훈련시키는 방법입니다.
- 즉, X 를 통해 X^2, X^3 을 생성한 뒤, y = 1 + aX + bX^2 + cX^3 형식을 구성하고
- a, b, c 를 선형 회귀 모델을 통해 학습하는 방법입니다.
- 무슨 소리인지 코드를 통해 좀 더 쉽게 설명해보겠습니다.
예제 코드
훈련 데이터셋 X_train, y_train 생성
from sklearn.preprocessing import PolynomialFeatures X_train = np.arange(6).reshape(3, 2) # array([[0, 1], # [2, 3], # [4, 5]]) y_train = 0.5 * X_train**2 + X_train + 2 # array([[ 2. , 3.5], # [ 6. , 9.5], # [14. , 19.5]])
훈련 데이터셋 X_train 의 거듭제곱을 생성한 뒤, 훈련 데이터셋 X_train 에 새로운 변수로 추가
# degree : 거듭제곱의 차수, include_bias : 편향값(1) 추가 여부 poly = PolynomialFeatures(degree=2, include_bias=True) # 훈련 데이터셋 X_train 의 거듭제곱을 생성한 뒤, 훈련 데이터셋 X_train 에 새로운 변수로 추가 X_train_poly = poly.fit_transform(X_train) # array([[ 1., 0., 1., 0., 0., 1.], # [ 1., 2., 3., 4., 6., 9.], # [ 1., 4., 5., 16., 20., 25.]])
- 제곱 : ['1', 'x0', 'x1', 'x0^2', 'x0 x1', 'x1^2']
- 세제곱 : ['1', 'x0', 'x1', 'x0^2', 'x0 x1', 'x1^2', 'x0^3', 'x0^2 x1', 'x0 x1^2', 'x1^3']
- get_feature_names() 을 통해 만들어진 변수의 차수를 쉽게 확인할 수 있습니다.
확장된 변수를 포함한 훈련 데이터셋을 선형모델로 훈련
from sklearn.linear_model import LinearRegression lin_reg = LinearRegression() lin_reg.fit(X_train_poly, y_train)
테스트 데이터셋 X_test, y_test 생성
X_test = np.linspace(-3, 3, 6).reshape(3, 2) # array([[-3. , -1.8], # [-0.6, 0.6], # [ 1.8, 3. ]]) y_test = 0.5 * X_test**2 + X_test + 2 # array([[3.5 , 1.82], # [1.58, 2.78], # [5.42, 9.5 ]])
테스트 데이터셋 X_test 의 거듭제곱을 생성한 뒤, 테스트 데이터셋 X_test 에 새로운 변수로 추가
X_test_poly = poly.transform(X_test)
테스트 데이터셋 예측
y_pred = lin_reg.predict(X_test_poly)
코드 요약
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
X_train = np.arange(6).reshape(3, 2)
y_train = 0.5 * X_train**2 + X_train + 2
poly = PolynomialFeatures(degree=2, include_bias=True)
X_train_poly = poly.fit_transform(X_train)
lin_reg = LinearRegression()
lin_reg.fit(X_train_poly, y_train)
X_test = np.linspace(-3, 3, 6).reshape(3, 2)
y_test = 0.5 * X_test**2 + X_test + 2
X_test_poly = poly.transform(X_test)
y_pred = lin_reg.predict(X_test_poly)