Programming

다항 회귀(Polynomial Regression)를 이용한 보스턴 주택가격 예측

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

1. 왜 다항 회귀를 사용하는가

앞서 살펴본 일반 선형회귀(Linear Regression) 는 각 피처와 타깃 값 사이의 관계를 직선으로 가정합니다.
하지만 실제 데이터에서는 다음과 같은 문제가 자주 발생합니다.

  • 피처와 타깃 간 관계가 곡선 형태
  • 단순 직선으로는 패턴을 충분히 설명하지 못함
  • 언더피팅(Underfitting) 발생

이때 사용하는 방법이 다항 회귀(Polynomial Regression) 입니다.

다항 회귀는

피처를 다항식 형태로 확장한 뒤, 선형 회귀 모델을 적용
하는 방식으로, 비선형 패턴을 보다 유연하게 학습할 수 있습니다.

2. 실습 데이터: 보스턴 주택가격 데이터

  • 독립 변수(X) : 범죄율, 방 개수, 주택 노후도, 세금 등 13개 피처
  • 종속 변수(y) : 주택 가격(PRICE)
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np

3. 학습 / 테스트 데이터 분리

# 타깃 변수(PRICE)와 피처 분리
X_data = bostonDF.drop(['PRICE'], axis=1, inplace=False)
y_target = bostonDF['PRICE']

# 학습 데이터 70%, 테스트 데이터 30% 분리
X_train, X_test, y_train, y_test = train_test_split(
    X_data,
    y_target,
    test_size=0.3,
    random_state=156
)

핵심 포인트

  • random_state 고정 → 결과 재현성 확보
  • 다항 회귀 역시 학습/평가 분리 원칙은 동일

4. Pipeline을 이용한 다항 회귀 모델 구성

# 다항 피처 변환 + 선형 회귀를 하나의 파이프라인으로 구성
p_model = Pipeline([
    ('poly', PolynomialFeatures(
        degree=2,          # 2차 다항식 적용
        include_bias=False # 절편 항(1)은 LinearRegression이 자동 처리
    )),
    ('linear', LinearRegression())
])

왜 Pipeline을 사용하는가?

  • 전처리 + 모델을 하나의 흐름으로 관리
  • 코드 가독성 향상
  • 교차검증, 하이퍼파라미터 튜닝 시 필수 구조

5. 모델 학습 및 예측

# 모델 학습
p_model.fit(X_train, y_train)

# 테스트 데이터 예측
y_preds = p_model.predict(X_test)

6. 회귀 성능 평가

# 평균 제곱 오차(MSE)
mse = mean_squared_error(y_test, y_preds)

# RMSE (MSE에 루트 적용)
rmse = np.sqrt(mse)

print(f'MSE : {mse}')
print(f'RMSE : {rmse}')
print(f'Variance Score(R^2) : {r2_score(y_test, y_preds)}')



MSE : 15.555752313191336
RMSE : 3.9440781322371565
Variance Score : 0.7816647162535606

해석

  • RMSE ≈ 3.94
    → 예측 가격이 평균적으로 약 3.9만 달러 정도 오차 발생
  • R² ≈ 0.78
    → 전체 주택 가격 변동성의 약 78% 설명

7. 다항 피처 확장 결과 확인

# 다항 피처 변환 결과 확인
X_train_poly = PolynomialFeatures(
    degree=2,
    include_bias=False
).fit_transform(X_train)

X_train_poly.shape, X_train.shape

((354, 104), (354, 13))

의미

  • 원본 피처: 13개
  • 2차 다항 변환 후 피처: 104개

👉 피처 수가 급격히 증가

8. 다항 회귀의 핵심 주의사항 (중요)

다항 회귀는 잘 쓰면 강력하지만, 잘못 쓰면 오버피팅의 지름길

  • 차수(degree)가 커질수록
    • 피처 수 폭발
    • 모델 복잡도 증가
    • 학습 데이터에 과도하게 적합
  • 테스트 성능이 오히려 나빠질 수 있음

실무 권장 전략

  • 낮은 차수(2~3차)부터 시작
  • 반드시 교차검증(CV) 수행
  • Ridge / Lasso와 함께 사용 고려

 

마무리 정리

  • 다항 회귀는 선형 회귀의 표현력을 확장하는 기법
  • PolynomialFeatures + LinearRegression 구조가 핵심
  • Pipeline 사용은 사실상 필수
  • 피처 수 증가 → 오버피팅 관리가 가장 중요

다음 단계로 이어가면 좋은 주제는 다음과 같습니다.

  • 🔜 다항 회귀 + Ridge / Lasso 규제
  • 🔜 차수별 성능 비교 (degree 1~3)
  • 🔜 교차검증 기반 최적 차수 선택
반응형