데이터의 분포가 곡선으로 나타나는 경우 일반적으로 선형회귀모형을 사용할 수 없으나 다항 회귀 모형을 사용할 수 있습니다.
다항 회귀는 데이터 각 특성의 제곱을 추가하여 확장된 특성을 포함하여 선형 회귀 모델을 훈련 시키는 방법입니다.
일반적인 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는 주어진 차수까지 특성 간의 모든 교차항을 추가하기 때문에 특성 간의 관계를 찾을 수 있습니다.
감사합니다 :)
'머신러닝&딥러닝 > Python' 카테고리의 다른 글
tqdm을 사용하여 처리 진행상황 확인하는 방법(for문, apply문) (0) | 2022.09.14 |
---|---|
[패턴] Timeseries 데이터에서 유사한 패턴 index 찾기 (0) | 2022.08.11 |
[R과 Python 비교] 데이터 프레임 병합하는 다양한 방법 (0) | 2022.05.24 |
[scikit-learn] PCA 기능 (0) | 2022.05.18 |
[Jupyter notebook] 아나콘다 가상 환경 생성 및 활용 (0) | 2022.05.10 |