2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/머신러닝

3.3 다항회귀

원당컴1 2024. 5. 23. 09:39

 

목표

  • 독립변수의 특성의 차수를 높여서 기계학습 하는 방법을 살펴 보자. 

머신러닝 목차 - https://wondangcom.tistory.com/2769

 

머신러닝 목차

머신러닝 1. 머신러닝 소개 1.1 인공지능이란 (혼공머신) - 4차산업 혁명 시대에 꼭 필요한 인공지능에 대해 알아 보자. 링크 : https://wondangcom.tistory.com/2771(2024.3.7) 1.1 인공지능이란 목표 4차 산업 혁

wondangcom.tistory.com

 

1. 다항회귀란?

다항 회귀는 선형 회귀의 확장으로, 고차 다항식을 사용하여 데이터를 모델링하는 방법입니다. 이 모델은 비선형 관계를 표현할 수 있어 다양한 현상을 설명하는 데 유용합니다.

 

지난시간(https://wondangcom.tistory.com/2796) 에 선형회귀에서 공부시간량에 따른 시험점수를 예측하는 방법에 대해 살펴 보았습니다.

하지만 주식가격을 예측하는 경우 또는 집의 매매가격을 예측하는 경우 선형 회귀만으로는 해결 할 수 없습니다.

어느 지역의 집값이 위와 같이 변경 되는 데이터가 있다고 가정 해서 다항회귀로 해결하는 방법에 대해 살펴 보겠습니다.

2. 실습

2.1 샘플 데이터 생성

import numpy as np
import matplotlib.pyplot as plt

# 샘플 데이터 생성
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = x / 2 + np.sin(x) 

# 노이즈 추가
noise = np.random.normal(0, 0.1, len(x))
y_noisy = y + noise

# 데이터 시각화
plt.scatter(x, y_noisy, label="Test Data with Sin Curve + Noise")
plt.plot(x, y, color='r', label="y = x/2 + sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Test Data with Sin Curve")
plt.legend()
plt.show()

위와 같이 y=x/2 + sin(x) 와 은 곡선을 만들고 noise를 추가해서 다음과 같은 곡선의 데이터를 생성했습니다.

이 데이터를 선형회귀와 다항회귀를 사용하여 모델을 훈련해 보겠습니다.

2.2 선형회귀 훈련

# 선형회귀 모델 훈련
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x.reshape(-1, 1), y_noisy.reshape(-1, 1))

# 예측
y_pred = model.predict(x.reshape(-1, 1))

# 예측값 시각화
plt.scatter(x, y_noisy, label="Test Data with Sin Curve + Noise")
plt.plot(x, y_pred, color='g', label="Linear Regression Prediction")
plt.plot(x, y, color='r', label="y = x/2 + sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Test Data with Sin Curve and Linear Regression Prediction")
plt.legend()
plt.show()

LinearRegression 모델로 훈련 후 예측 데이터를 시각화 해보겠습니다.

녹색 선이 선형회귀 모델로 훈련하여 예측한 데이터 입니다. 

 

2.3 특성을 추가하여 훈련

from sklearn.preprocessing import PolynomialFeatures

# 다항식 특성 생성
poly_features = PolynomialFeatures(degree=2)
x_poly = poly_features.fit_transform(x.reshape(-1, 1))

# 다항회귀 모델 훈련
poly_model = LinearRegression()
poly_model.fit(x_poly, y_noisy.reshape(-1, 1))

# 예측
y_poly_pred = poly_model.predict(x_poly)

# 예측값 시각화
plt.scatter(x, y_noisy, label="Test Data with Sin Curve + Noise")
plt.plot(x, y_poly_pred, color='orange', label="Polynomial Regression Prediction")
plt.plot(x, y, color='r', label="y = x/2 + sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Test Data with Sin Curve and Polynomial Regression Prediction")
plt.legend()
plt.show()

다항회귀 역시 LinearRegression() 라이브러리를 이용하여 훈련합니다.

다만 일차원 직선이 아닌 곡선 형태의 모델을 얻기 위해 PolynomialFeatures 라이브러리를 이용하여 특성을 추가 합니다.

degree=2  를 주어 곡선 형식으로 예측을 하지만 정확한 곡선은 예측하지 못하는 것을 알 수 있습니다.

 

여기서 특성을 더 추가해 보도록 하겠습니다.

# 다항식 특성 생성
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=4,include_bias=False)
x_poly = poly_features.fit_transform(x.reshape(-1, 1))

# 다항회귀 모델 훈련
poly_model = LinearRegression()
poly_model.fit(x_poly, y_noisy.reshape(-1, 1))

# 예측
y_poly_pred = poly_model.predict(x_poly)

# 예측값 시각화
plt.scatter(x, y_noisy, label="Test Data with Sin Curve + Noise")
plt.plot(x, y_poly_pred, color='orange', label="Polynomial Regression Prediction")
plt.plot(x, y, color='r', label="y = x/2 + sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Test Data with Sin Curve and Polynomial Regression Prediction")
plt.legend()
plt.show()

PolynomialFeatures 를 사용하여 특성을 4제곱 만큼 추가하여 예측을 해 보았습니다.

거의 비슷하게 예측을 하는 것을 알 수 있습니다.

PolynomialFeatures 은 fit() 과 transform 을 차례대로 호출하여 새로운 특성을 만들 수 있습니다.

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

[[1. 2. 3. 4. 6. 9.]]

[2,3] 두개의 특성을 가진 데이터가 [[1. 2. 3. 4. 6. 9.]] 으로 바뀌는 것을 확인 할 수 있습니다.
[[1. 2. 3. 4. 6. 9.]] 클래스는 기본적으로 각 특성을 제곱한 항을 추가하고 4,9 특성끼리 곱한 항을 추가한다.

여기서 degree=4의 의미는 4제곱한 항까지를 추가하고 include_bias=False의 의미는 기본값인 1을 제외 하겠다는 의미입니다.

 

3. 맺음말

다항회귀는 다음과 같은 수식으로 표현 됩니다.

$$y = \beta_0 + \beta_1x + \beta_2x^2 + \ldots + \beta_nx^n$$

여기서

 

  • 는 종속 변수(타겟 변수)입니다.
  • 는 독립 변수(피처)입니다.
  • 은 회귀 계수입니다.
  • 은 다항식의 차수입니다.

선형 회귀는 구현이 간단하고 이해하기 쉽지만, 복잡한 관계를 표현하기 어렵습니다.

이러한 문제를 해결 할 수 있는 다항 회귀는 데이터의 복잡한 관계를 모델링할 때 유용한 방법입니다. 하지만 적절한 차수를 선택하고 과적합을 피하는 데 주의해야 합니다.

 

 

 

참고) 혼자공부하는 머신러닝

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기

'강의자료 > 머신러닝' 카테고리의 다른 글

4.1 MNIST  (10) 2024.06.05
3.4 규제  (11) 2024.05.30
3.2 경사 하강법  (6) 2024.05.20
3.1 선형 회귀  (7) 2024.05.09
2.1 데이터 다루기 - 데이터 전처리 필요성  (9) 2024.05.02