상세 컨텐츠

본문 제목

회귀분석-다항 회귀(Polynomial Regression)

인공지능/머신러닝

by 2^7 2024. 10. 28. 21:00

본문

다항 회귀(Polynomial Regression)

 선형 회귀의 확장으로, 독립 변수와 종속 변수 사이의 비선형 관계를 설명하는 데 사용되며 선형 회귀와 달리 다항 회귀는 데이터를 직선이 아닌 다항식 곡선으로 모델링하여 더 복잡한 패턴을 포착할 수 있음

 

1. 다항 회귀 기본 개념

  • 다항 회귀는 독립 변수를 다항식 형태로 변환하여 모델을 학습하는 방법
  • 종속 변수 y와 독립 변수 x사이의 관계가 비선형적일 때, 이를 x의 여러 차수로 변환하여 아래와 같은 다항식으로 모델링 할 수 있음
  • n의 값이 커질수록 곡선의 유연성이 높아져 복잡한 데이터 패턴을 잘 따라갈 수 있음


y: 종속 변수 (예측하고자 하는 값)
xi​: 독립 변수 (입력 값)
βi​: 회귀 계수 (모델이 학습하는 가중치)
ϵ: 오차 항 (모델이 설명하지 못하는 부분)

 

2. 다항 회귀의 특징

1) 비선형 관계 모델링

  • 다항 회귀는 비선형 데이터를 모델링할 수 있어 데이터의 복잡한 패턴을 표현할 수 있음

2) 다양한 패턴 학습

  • 고차 다항식을 사용하면 데이터의 구부러진 패턴, 굴곡 등을 보다 잘 설명할 수 있음

3) 복잡한 관계 모델링

  • 현실의 많은 데이터는 비선형적 특성을 보이기 때문에, 다항 회귀를 통해 복잡한 관계를 모델링하는 것이 유리

 

3. 다항 회귀의 학습 방법

 다항 회귀는 선형 회귀와 같은 방식으로 최소 제곱법(Ordinary Least Squares)을 통해 학습함 단, 독립 변수를 다항식 형태로 변환하여 새로운 변수를 생성하는 것이 차이

예를 들어, 독립 변수 x가 있을 때, x^2, x^3 등의 변수를 추가하여 선형 회귀 모델을 학습하는 방식

ex) 2차 다항 회귀 모델을 사용해 데이터를 학습

 

4. 다항 회귀의 차수 선택과 과적합 문제

 다항 회귀에서 차수가 높아질수록 데이터에 더 유연하게 적합할 수 있지만, 과적합의 위험이 커짐 (너무 높은 차수를 사용하면 모델이 학습 데이터에 과도하게 적합되어 새로운 데이터에 대한 일반화 성능이 저하됨)

 

  • 차수가 너무 낮으면 데이터의 비선형적 특성을 제대로 반영하지 못해 언더피팅(underfitting)이 발생할 수 있음
  • 차수가 높아지면 모델이 학습 데이터에 과도하게 적합되어 과적합(overfitting)이 발생할 가능성이 커짐

따라서 다음과 같은 방식으로 차수 선택의 기준으로 정함

 

  • 교차 검증(Cross-Validation): 모델의 차수를 선택할 때, 교차 검증을 통해 최적의 차수를 찾을 수 있음
  • 정규화 및 규제(Regularization): 과적합을 방지하기 위해 릿지 회귀나 라쏘 회귀와 같은 규제 기법을 적용

 

5. 다항 회귀의 평가 지표

다항 회귀 모델 평가의 주요 지표

1) R² (결정 계수)

  • 결정 계수는 모델이 주어진 데이터를 얼마나 잘 설명하는지 나타내는 지표
  • 값이 0에서 1 사이로 1에 가까울수록 데이터가 모델에 의해 잘 설명된다는 의미

는 실제 값의 평균

2) MSE (Mean Squared Error)

  • 예측 값과 실제 값의 차이를 제곱한 후 평균을 구하는 방식으로 정확도를 평가
  • 값이 작을수록 좋은 모델을 의미

Python에서 Scikit-learn 라이브러리를 사용하여 간단하게 다항 회귀 모델을 구현방법

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

# 예제 데이터 생성
X = np.random.rand(100, 1) * 10  # 0~10 사이의 값을 가진 데이터
y = 3 + 2 * X + X**2 + np.random.randn(100, 1) * 5  # 실제 데이터(잡음 포함)

# 다항 특징 생성 (2차 다항식)
poly_features = PolynomialFeatures(degree=2)
X_poly = poly_features.fit_transform(X)

# 모델 학습
model = LinearRegression()
model.fit(X_poly, y)

# 예측
y_pred = model.predict(X_poly)

# 평가
mse = mean_squared_error(y, y_pred)
print("Mean Squared Error:", mse)
728x90

관련글 더보기