courses
데이터가 곡선을 그리는데 직선을 사용해 새로운 데이터 포인트를 추정하는 건 합리적이지 않습니다. 그렇게 하면 패턴을 놓치고 잔차가 커지며 예측력이 떨어지는 모델이 됩니다. 약물 용량이 반응에 미치는 영향, 온도가 재료의 응력에 미치는 영향, 자산 가격이 시간에 따라 움직이는 방식 등 현실 세계의 데이터는 거의 선형적으로 행동하지 않습니다.
다항 회귀는 직선 대신 곡선을 적합하도록 선형 회귀를 확장해 이 문제를 해결합니다. 고차 항 몇 개만 추가하면 - x², x³ - 모델이 데이터의 실제 모양을 따라갈 수 있습니다.
이 글에서는 다항 회귀가 무엇인지, 그 배경 수학, Python으로 구현하는 방법, 그리고 많은 사람이 빠지는 함정인 과적합을 피하는 방법을 다룹니다.
머신러닝 개념이 처음이라면 먼저 Python에서의 선형 회귀 기초 튜토리얼을 읽어 보세요.
다항 회귀란?
직선으로는 데이터를 설명할 수 없을 때 사용하는 알고리즘이 다항 회귀입니다.
선형 회귀는 변수 간 관계를 직선으로 모델링합니다. 관계가 실제로 선형일 때는 잘 작동하지만, 대부분의 실제 데이터는 그렇지 않습니다. 자동차의 제동거리가 속도에 따라 어떻게 변하는지, 식물의 성장률이 비료에 어떻게 반응하는지 떠올려 보세요. 이런 관계는 곡선을 이룹니다. 직선은 어떻게 해도 잘 맞지 않습니다.
다항 회귀는 방정식에 고차 항을 추가해 선형 회귀를 확장합니다. y = b0 + b1x 대신 y = b0 + b1x + b2x² + b3x³와 같은 형태를 적합하는 것이죠. 다항식의 차수 - "n차"의 그 n - 는 곡선이 몇 번 굽을 수 있는지를 결정합니다.
간단히 핵심 차이를 정리하면 다음과 같습니다.
-
선형 회귀: 직선을 적합합니다. 특성당 하나의 계수, 곡선 자유도는 1입니다.
-
다항 회귀: 곡선을 적합합니다. 각 추가 항(
x²,x³, ...)은 데이터의 형태를 따라갈 수 있는 유연성을 더해 줍니다.

선형 회귀와 다항 회귀 비교
겉으로 보기엔 다항 회귀도 여전히 선형 모델입니다. 여기서 "선형"은 곡선의 모양이 아니라 계수를 다루는 방식을 뜻합니다. 새로운 특성(x², x³)을 추가하고 그 위에 선형 방정식을 적합하는 것입니다.
그렇다면 실제로 언제 사용해야 할까요?
선형 모델의 잔차 플롯에서 패턴이 보인다면 다항 회귀를 고려하세요. 관계가 선형이 아님을 시사합니다. 물리, 생물, 경제학처럼 곡선 관계가 도메인 지식으로 예상되는 경우에도 잘 맞습니다.
대신, 차수가 높아질수록 불안정해질 수 있습니다. 2차나 3차 다항식이면 대부분의 실제 곡선을 다룰 수 있지만, 더 높이면 신호가 아니라 잡음을 적합할 가능성이 큽니다.
왜 다항 회귀를 사용할까?
현실 세계에서 변수 간 관계는 대부분 선형이 아닙니다.
직선이 비슷하게 맞을 수는 있지만, 민감한 대상을 예측할 때 "비슷"으로는 충분하지 않습니다. 관계가 굽는 지점이 있으면, 선형 모델은 그 굽음을 꾸준히 놓치게 됩니다.
다항 회귀는 모델이 곡선을 그릴 수 있게 해 더 잘 대응합니다. 데이터에 직선을 억지로 끼워 넣는 대신, 관계의 형태를 따라갈 수 있는 곡선을 적합하는 것입니다.
다음은 다양한 분야에서 차이를 만들어내는 사례입니다:
- 생물학과 의학: 용량-반응 관계는 드물게 선형입니다. 저용량은 거의 효과가 없고, 중간 용량에서 잘 작동하며, 고용량에선 부작용이 발생할 수 있습니다. 이런 S자형 곡선을 포착하려면 다항 모델이 필요합니다
- 공학: 재료의 응력-변형률 관계, 공기역학적 항력, 열팽창 등은 모두 비선형 패턴을 따르며 다항 회귀로 잘 모델링됩니다
- 금융: 자산 수익률, 옵션 가격, 수요 곡선은 종종 직선으로 표현할 수 없는 체감·가속 효과를 보입니다
- 머신러닝 파이프라인: 다항 특성은 더 복잡한 알고리즘으로 바꾸지 않고도 선형 모델에 비선형성을 빠르게 추가하는 방법입니다
이 모든 사례의 공통점은 동일합니다. 입력과 출력 사이의 관계가 x의 값에 따라 달라진다는 것입니다. 선형 회귀는 그 변화가 일정하다고 가정하지만, 다항 회귀는 그렇지 않습니다.
그렇다고 다항 회귀가 만능은 아닙니다.
곡선 관계가 있을 것이라는 도메인 지식이 있거나, 잔차 플롯이 직선으로는 해결되지 않는 명확한 패턴을 보일 때 가장 효과적입니다. 단지 선형 모델의 R² 이 충분히 높지 않다는 이유만으로 사용하진 마세요.
다항 회귀의 수학 이해하기
다항 회귀의 기본 수학을 알면 이해에 도움이 됩니다.
다항 항
선형 회귀에서 모델은 다음과 같습니다:

선형 회귀 공식
입력 변수 하나, 계수 하나, 직선 하나입니다. 다항 회귀는 여기에 고차 항을 추가해 확장합니다:

다항 회귀 공식
각 새로운 항 - x², x³ 등 - 은 모델에 하나의 추가 "굽힘"을 제공합니다. 2차 다항식은 단일 곡선을 적합할 수 있고, 3차 다항식은 한 번 방향이 바뀌는 곡선을 적합할 수 있습니다. 차수 n은 모델의 유연성을 제어합니다.
근본적인 알고리즘은 동일합니다. 단지 새로운 특성을 추가하는 것입니다. x²는 x와 마찬가지로 독립적인 입력 변수로 취급됩니다. 모델은 여전히 선형 방정식을 적합하지만, 변환된 특성 위에서 수행합니다.
최소제곱 추정
다항 회귀 모델을 적합하는 방식은 선형 회귀와 같습니다. 즉, 최소제곱 추정을 사용합니다.
아이디어는 제곱 잔차합을 최소화하는 계수를 찾는 것입니다:

SSR 공식
각 제곱 차이는 잔차, 즉 모델의 예측과 관측값 간의 차이입니다. 제곱을 하면 음·양의 오차가 서로 상쇄되지 않고, 큰 오차에 더 큰 패널티를 부여합니다.
실제로는 라이브러리가 이 작업을 처리합니다. 하지만 최소제곱이 목적 함수라는 것을 알면 왜 이상치가 다항 모델에 큰 악영향을 주는지 이해할 수 있습니다. 하나의 큰 잔차가 제곱되어 계수를 그 방향으로 끌어당기기 때문입니다.
계수 해석
선형 회귀에서 b1은 간단히 해석됩니다. x가 한 단위 증가할 때, y가 b1만큼 변한다는 의미입니다.
다항 회귀는 조금 더 복잡합니다. 모델에 b_1x + b_2x^2가 포함되면, x가 y에 미치는 효과는 현재 x 값에 따라 달라집니다. b2만 따로 보고 결론을 내릴 수 없습니다. 곡선의 기울기는 계속 변하며, 이는 x에 대해 미분해 보면 알 수 있습니다:

x에 대한 도함수
기울기 자체가 x의 함수입니다. 즉, x가 한 단위 변할 때의 영향이 곡선의 각 지점마다 다릅니다.
이 때문에 다항 모델에서 개별 계수를 해석하려고 해서는 안 됩니다. 대신 곡선 전체를 보세요. 예측값을 데이터와 함께 플롯해 보세요.
데이터 과학에서의 다항 회귀 활용
현실 데이터에는 곡선 관계가 흔하기 때문에 다항 회귀는 다양한 분야에서 활용됩니다.
금융
금융 데이터는 거의 직선적으로 움직이지 않습니다.
자산 가격, 매출 성장, 수요 곡선은 시장 상황에 따라 가속·감속하거나 방향을 바꾸곤 합니다. 선형 모델은 변화율이 일정하다고 가정하는데, 이는 거의 사실이 아닙니다. 다항 회귀를 사용하면 이러한 변화를 모델링할 수 있습니다. 예를 들어, 가격이 일정 지점을 넘어 오르면 소비자 수요가 처음엔 천천히, 이후 급격히 떨어지는 현상 등을 포착할 수 있습니다.
시간에 따른 추세 분석에도 유용합니다. 과거 가격 데이터에 곡선을 적합하거나, 경기 사이클의 각 단계에서 어떤 지표가 성장하는 방식을 모델링할 때 2차나 3차 다항식이 직선보다 형태를 훨씬 잘 추정하는 경우가 많습니다.
공학
물리적 과정은 비선형 관계의 대표적 사례입니다.
재료의 응력과 변형, 유체역학, 열팽창, 공기역학적 항력 등은 모두 직선이 아닌 곡선을 따릅니다. 물리의 지배 방정식 중 다수는 본질적으로 다항식입니다. 측정값은 있지만 깔끔한 해석적 식이 없을 때, 다항 회귀는 그 곡선을 데이터 기반으로 적합하는 방법을 제공합니다.
좋은 예로 항력이 있습니다. 항력은 속도의 제곱에 따라 증가합니다. 선형 모델은 고속에서 항력을 과소추정하고, 2차 다항식은 관계를 올바르게 적합합니다.
머신러닝
머신러닝에서는 다항 회귀를 독립 모델이라기보다 특징 공학 기법으로 자주 사용합니다.
다항 항 - x², x³, 상호작용 항 - 을 특성 집합에 추가해, 더 복잡한 알고리즘으로 바꾸지 않고도 선형 모델이 비선형 패턴을 적합할 수 있게 합니다. 선형 모델이 과소적합일 때, 결정 트리나 신경망 같은 모델로 가기 전 유연성을 추가하는 일반적인 첫 단계입니다.
베이스라인 모델로도 유용합니다.
더 복잡한 모델을 학습하기 전에 다항 회귀를 적합해 간단한 곡선이 설명할 수 있는 분산의 정도를 파악합니다. 3차 다항식만으로도 대부분을 설명한다면, 더 복잡한 모델이 필요 없을 수 있습니다.
다항 회귀에서 적절한 차수 선택하기
다항식의 차수를 정하는 일은 가장 중요한 결정 중 하나입니다. 어느 한쪽으로 잘못 선택하면 정확도가 떨어진 모델이 됩니다.
다행히 Python 코드 몇 줄이면 해결할 수 있습니다.
과적합 vs. 과소적합
과소적합은 차수가 너무 낮을 때 발생합니다. 곡선 데이터에 1차 다항식을 쓰면 패턴을 놓쳐 편향이 크고 예측이 나빠지며, 학습·새 데이터 모두에서 성능이 저조합니다.
과적합은 그 반대 문제이며, 처음에는 더 위험합니다. 고차 다항식은 학습 세트의 모든 점을 거의 오차 없이 통과할 수 있습니다. 하지만 모델은 잡음을 외워버린 것입니다. 새 데이터에서는 무너집니다.
학습 오차와 테스트 오차를 차수별로 비교해 보면 분명합니다:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
np.random.seed(42)
# Generate sample data
x = np.linspace(-3, 3, 80).reshape(-1, 1)
y = 0.6 * x.ravel()**2 - x.ravel() + np.random.normal(0, 0.6, 80)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
for deg in [1, 2, 12]:
poly = PolynomialFeatures(deg)
model = LinearRegression()
model.fit(poly.fit_transform(x_train), y_train)
train_err = mean_squared_error(y_train, model.predict(poly.transform(x_train)))
test_err = mean_squared_error(y_test, model.predict(poly.transform(x_test)))
print(f"Degree {deg:>2} | Train MSE: {train_err:.4f} | Test MSE: {test_err:.4f}")

차수별 MSE
시각적으로 보면 다음과 같습니다:

서로 다른 다항 차수로 적합한 데이터
1차는 두 세트 모두에서 오차가 큽니다. 과소적합입니다. 2차는 균형이 좋습니다. 12차는 학습 오차가 더 낮지만 테스트 오차가 훨씬 큽니다. 과적합입니다.
교차 검증
최적의 차수를 찾는 올바른 방법은 교차 검증, 특히 k-겹 교차 검증입니다.
데이터를 k 개 부분집합으로 나누고, 그중 k-1개로 학습하고 하나를 검증에 사용합니다. 모든 부분집합이 한 번씩 테스트 세트가 되도록 반복합니다. 마지막으로 모든 폴드의 오차를 평균 내고, 후보 차수마다 이를 수행해 평균 테스트 오차가 가장 낮은 차수를 선택합니다.
구현은 설명보다 훨씬 간단합니다:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
np.random.seed(42)
# Generate sample data
x = np.linspace(-3, 3, 80).reshape(-1, 1)
y = 0.6 * x.ravel()**2 - x.ravel() + np.random.normal(0, 0.6, 80)
# Test degrees 1 through 10
degrees = range(1, 11)
mean_errors = []
for deg in degrees:
model = make_pipeline(PolynomialFeatures(deg), LinearRegression())
scores = cross_val_score(model, x, y, cv=5, scoring="neg_mean_squared_error")
mean_errors.append(-scores.mean())
print(f"Degree {deg:>2} | Mean error: {-scores.mean():.4f}")
best_degree = np.argmin(mean_errors) + 1

차수별 오차 비교
시각화하면 다음과 같습니다:

교차 검증 오차 비교
유용한 다항 항을 추가하면 CV 오차가 떨어지다가, 모델이 과적합을 시작하면 다시 증가합니다.
두 차수의 CV 오차가 비슷하면 더 낮은 차수를 선택하세요. 성능이 같은 단순한 모델이 언제나 더 좋은 선택입니다.
핵심 고려사항과 한계
다항 회귀는 몇 가지 방식으로 잘못된 결론에 이르게 할 수 있습니다. 지금부터 살펴보겠습니다.
이상치에 민감함
다항 회귀는 선형 회귀보다 이상치의 영향을 더 크게 받습니다.
최소제곱은 합산 전에 각 잔차를 제곱합니다. 추세에서 멀리 떨어진 단일 데이터 포인트가 불균형적으로 큰 오차를 만들어내고, 모델은 그 오차를 줄이기 위해 곡선을 굽힙니다. 그 과정에서 다른 구간의 적합이 왜곡될 수 있습니다.
차수가 높아질수록 이 효과는 더 커집니다. 고차 다항식은 이상치를 따라갈 만큼 유연해, 한 개의 불량 점을 맞추기 위해 데이터 대부분에서 곡선을 끌어당깁니다.
이를 피하는 방법은 적합 전에 데이터를 정리하는 것입니다. 데이터를 플로팅해 이상치를 식별하고, 그것이 실제 신호인지 잡음인지 판단하세요. 측정 오류, 입력 실수, 손상된 기록처럼 잡음이라면 제거합니다. 실제라면 RANSAC이나 Huber 회귀처럼 이상치에 더 강인한 적합 방법을 고려하세요.
과적합
다항 항을 추가할 때마다 모델에 유연성이 더해집니다. 어느 시점부터는 그 유연성이 도움이 되지 않고, 실제 패턴이 아니라 학습 데이터의 무작위 잡음을 적합하기 시작합니다. 결과적으로 학습 데이터에서는 잘 맞지만 새 데이터에서는 성능이 떨어지는 곡선이 됩니다.
문제는 학습 오차만 보면 과적합이 보이지 않는다는 것입니다. 10차 다항식은 거의 항상 2차 다항식보다 학습 MSE가 낮습니다. 그렇다고 더 좋은 모델이라는 뜻은 아닙니다.
다음과 같이 접근하세요:
- 낮은 차수부터 시작: 2차나 3차를 먼저 시도하세요. 대부분의 실제 곡선은 그 이상을 필요로 하지 않습니다
- 항상 홀드아웃 데이터로 평가: 학습 오차만으로는 일반화 성능을 알 수 없습니다.
- 교차 검증: 테스트 오차가 더 이상 개선되지 않는 차수를 찾는 데 사용하세요.
- 곡선 모양 관찰: 학습 데이터 범위를 벗어나는 구간에서 다항식이 이상하게 휘는 경우 과적합 신호일 수 있습니다.
다항 회귀는 곡선 관계가 있을 만한 분명한 이유가 있고, 차수를 낮게 유지할 수 있을 때 가장 잘 작동합니다.
다항 회귀의 대안
다항 회귀가 항상 정답은 아닙니다. 다음 대안들이 더 잘 맞을 수 있습니다.
스플라인
스플라인은 전역적 불안정성 문제를 해결합니다.
10차 다항식을 적합하면 모든 계수가 모든 데이터 포인트의 영향을 받습니다. 데이터의 한 구간 변화가 곡선 전체에 영향을 미칩니다. 스플라인은 데이터를 구간으로 나누고 각 구간에 저차 다항식을 별도로 적합해 이를 피합니다. 구간은 매듭(knots)이라 불리는 지점에서 연결되며, 연결부에서 전체 곡선이 매끄럽도록 제약을 둡니다.
그 결과 필요한 곳에서는 유연하고, 그 외 구간에서는 안정적인 곡선을 얻습니다.
Python에서는 scipy와 scikit-learn 모두 스플라인 구현을 제공합니다:
from scipy.interpolate import UnivariateSpline
spline = UnivariateSpline(x, y, k=3)
y_pred = spline(x_new)

스플라인과 고차 다항식 비교
요약하면, 데이터가 구간에 따라 다른 거동을 보이거나, 단일 다항 곡선으로는 고차가 아니면 형태를 포착할 수 없을 때 스플라인을 사용하세요.
서포트 벡터 회귀
서포트 벡터 회귀(SVR)는 다른 접근을 취합니다.
모든 포인트에서 제곱 오차를 최소화하는 곡선을 적합하는 대신, 가능한 한 많은 포인트에 대해 정의된 오차 여백 내에 머무르는 함수를 찾고, 그 여백 안에 있는 포인트는 무시합니다. 이로 인해 다항 회귀보다 이상치에 덜 민감합니다.
다항 회귀와의 연결 고리는 커널 트릭입니다. 다항 커널을 사용하는 SVR은 다항 회귀와 유사한 비선형 관계를 적합할 수 있지만, 정규화 파라미터를 통해 적합을 더 잘 일반화하고 제어할 수 있습니다.
from sklearn.svm import SVR
model = SVR(kernel="poly", degree=3, C=1.0, epsilon=0.1)
model.fit(x_train, y_train)

SVR과 고차 다항식 비교
SVR은 제거할 수 없는 이상치가 있거나, 편향-분산 균형을 더 정밀하게 제어해야 하거나, 교차 검증에도 불구하고 다항 회귀가 계속 과적합할 때 좋은 선택입니다.
결론
이 글에서는 선형 회귀를 확장해 곡선을 적합하는 방법, 최소제곱 추정이 최적의 계수를 찾는 방식, 그리고 개별 계수를 해석해도 얻을 수 있는 정보가 많지 않은 이유를 살펴봤습니다.
선택하는 차수가 무엇보다 중요합니다. 너무 낮으면 과소적합, 너무 높으면 과적합이 됩니다. 교차 검증은 최적점을 객관적으로 찾게 해줍니다. 그리고 다항 회귀가 맞지 않는다면 스플라인과 SVR은 알아둘 만한 탄탄한 대안입니다.
이 모든 것에 대한 직관을 쌓는 가장 좋은 방법은 직접 데이터에 적용해 보는 것입니다. 비선형 관계가 의심되는 데이터셋을 골라 먼저 선형 모델을 적합하고 잔차를 플롯한 뒤, 다항 회귀가 무엇을 다르게 하는지 확인해 보세요. 실제 파이프라인을 보려면 R을 사용한 비선형 모델과 인사이트 소개 가이드를 읽어 보세요.
다항 회귀 FAQ
다항 회귀란 무엇이며, 언제 사용해야 하나요?
다항 회귀는 직선 대신 곡선을 데이터에 적합하는 선형 회귀의 확장입니다. 입력과 출력 변수의 관계가 선형이 아닐 때 사용합니다. 예를 들어, 선형 모델의 잔차 플롯에서 패턴이 보이는 경우입니다. 결정 트리나 신경망 같은 더 복잡한 모델을 시도하기 전의 좋은 첫 단계입니다.
다항 회귀는 선형 회귀와 어떻게 다른가요?
선형 회귀는 y = b0 + b1x로 관계를 모델링해 직선을 적합합니다. 다항 회귀는 x²와 x³ 같은 고차 항을 추가해, 데이터의 곡선을 따라갈 만큼의 유연성을 부여합니다. 두 방법 모두 최소제곱 추정을 사용하며, 다항 회귀는 추가 항을 추가 입력 특성으로 취급할 뿐입니다.
다항 회귀 사용 시 가장 큰 위험은 무엇인가요?
두 가지 주요 위험은 과적합과 이상치 민감성입니다. 고차 다항식은 학습 데이터의 잡음을 외워 새 데이터에서 성능이 나빠질 수 있습니다. 이상치는 위험한데, 최소제곱은 각 잔차를 제곱하므로 단 하나의 불량 데이터 포인트가 곡선을 데이터의 나머지 부분에서 멀어지게 끌어당길 수 있습니다.
다항 회귀 모델의 적절한 차수는 어떻게 선택하나요?
2차 또는 3차부터 시작하세요. 대부분의 실제 곡선 관계는 그 이상을 필요로 하지 않습니다. 그다음 k-겹 교차 검증으로 후보 차수 전반의 평균 테스트 오차를 비교해, 테스트 오차가 더 이상 개선되지 않는 지점을 고르세요. 두 차수의 결과가 비슷하면 항상 더 낮은 차수를 선택합니다.
다항 회귀 대신 스플라인이나 SVR은 언제 사용해야 하나요?
데이터가 구간별로 다른 거동을 보이거나 단일 다항식이 데이터 범위의 모서리에서 불안정한 곡선을 계속 만든다면 스플라인을 사용하세요. 이상치를 제거할 수 없고, 그것들을 수용하느라 모델이 형태를 왜곡하지 않게 하려면 다항 커널의 SVR이 더 나은 선택일 수 있습니다. 두 대안 모두 해석 가능성은 다소 줄지만 적합을 더 정교하게 제어할 수 있습니다.