Programming

다항 회귀(Polynomial Regression)의 이해와 실습

Lucas.Kim 2026. 1. 5. 07:51
반응형

1. 다항 회귀란 무엇인가

다항 회귀(Polynomial Regression)는 독립변수를 다항식 형태로 확장한 뒤 선형회귀 모델을 적용하는 방식입니다.

핵심적으로 다음 두 가지를 반드시 구분해야 합니다.

  • 다항 회귀는 비선형 회귀처럼 보이지만 선형 회귀 모델입니다.
  • 회귀에서 말하는 선형/비선형 기준은
    👉 독립변수가 아니라 회귀 계수(가중치)가 선형인지 여부입니다.

즉,

y=w0+w1x+w2x2+w3x3y = w_0 + w_1x + w_2x^2 + w_3x^3

위 식은 x는 비선형이지만, w는 선형이므로 선형 회귀 모델입니다.

2. PolynomialFeatures 클래스 개요

PolynomialFeatures는 원본 단항 피처를 다항 피처로 확장하는 전처리 클래스입니다.

  • 차수(degree)에 따라 새로운 피처를 생성
  • 모델 자체가 아니라 Feature Engineering 도구
  • 확장된 피처에 LinearRegression을 적용하면 다항 회귀 완성

3. 2차 다항 피처 변환 예제

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

# 원본 입력 데이터 (2개 샘플, 2개 피처)
X = np.arange(4).reshape(2, 2)
print(f'일차 단항식 피처:\n{X}')

# degree=2 → 2차 다항식으로 확장
poly = PolynomialFeatures(degree=2)
poly_ftr = poly.fit_transform(X)

print(f'2차 다항식으로 변환된 피처:\n{poly_ftr}')

4. 직접 정의한 3차 다항식 예제

import numpy as np

# 3차 다항식을 정의한 함수
def polynomial_fun(X):
    # y = 1 + 2x1 + 3x1^2 + 4x2^3
    return 1 + 2*X[:, 0] + 3*(X[:, 0]**2) + 4*(X[:, 1]**3)

# 입력 데이터 생성
X = np.arange(0, 4).reshape(2, 2)
y = polynomial_fun(X)

print(f'입력 피처:\n{X}')
print(f'결정값(y):\n{y}')

이 예제는 다항 회귀가 복잡한 비선형 관계도 선형 회귀로 학습 가능함을 보여줍니다.

5. PolynomialFeatures + LinearRegression 직접 결합

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 3차 다항식 피처 생성
poly_ftr = PolynomialFeatures(degree=3).fit_transform(X)

# 선형 회귀 모델 학습
model = LinearRegression()
model.fit(poly_ftr, y)

print(f'회귀 계수:\n{np.round(model.coef_, 2)}')
print(f'계수 개수: {model.coef_.shape}')

해석

  • 생성된 피처 수만큼 회귀 계수가 증가
  • 차수가 커질수록 모델 복잡도 급격히 증가
  • 과적합(overfitting) 위험 존재

6. Pipeline을 활용한 다항 회귀 (권장 방식)

실무에서는 Pipeline을 사용하는 것이 가장 안전하고 깔끔합니다.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import numpy as np

def polynomial_fun(X):
    return 1 + 2*X[:, 0] + 3*(X[:, 0]**2) + 4*(X[:, 1]**3)

# 파이프라인 구성
model = Pipeline([
    ('poly', PolynomialFeatures(degree=3)),   # 다항 피처 생성
    ('linear', LinearRegression())             # 선형 회귀 학습
])

X = np.arange(4).reshape(2, 2)
y = polynomial_fun(X)

model.fit(X, y)

print(f'최종 회귀 계수:\n{np.round(model.named_steps["linear"].coef_, 2)}')

Pipeline 사용 이유

  • 전처리 + 모델을 하나의 객체로 관리
  • 데이터 누수(Data Leakage) 방지
  • 교차검증, GridSearch에 매우 유리

7. 다항 회귀 사용 시 주의사항

  • 차수가 커질수록 피처 수 폭발
  • 고차 다항식 → 과적합 위험 증가
  • 반드시 다음과 함께 사용 권장
    • 규제 모델(Ridge, Lasso)
    • 교차 검증(CV)
    • Feature Scaling

마무리 요약

  • 다항 회귀는 선형 회귀의 확장
  • 비선형 패턴을 선형 모델로 학습 가능
  • 핵심은 PolynomialFeatures + LinearRegression
  • 실무에서는 Pipeline 사용이 표준
반응형