스플라인 회귀
- 스플라인 회귀(Spline Regression)는 데이터를 여러 구간으로 나누고 각 구간에 다항식을 적용하여 모델링하는 기법
- 이를 통해 비선형적인 관계를 보다 유연하게 모델링
- 스플라인 회귀는 특히 데이터가 특정 구간에서 다른 패턴을 보일 때 유용
파이썬 실습
1. 필요 라이브러리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
from sklearn.metrics import mean_squared_error, r2_score
scipy.interpolate.make_interp_spline: 스플라인 회귀를 위한 함수로, 주어진 데이터에 대해 스플라인 곡선을 생성합니다.
sklearn.metrics.mean_squared_error, r2_score: 회귀 모델의 성능을 평가하기 위해 평균 제곱 오차(MSE)와 결정 계수(R²)를 계산하는 함수입니다.
2. 예시 데이터
# 예시 데이터 생성
np.random.seed(0)
X = np.linspace(-3, 3, 100)
y = X**3 - 2*X + np.random.normal(0, 1, 100)
# X를 2D 배열로 변환 (scipy의 make_interp_spline 함수는 1D 배열을 요구하지 않음)
X = X[:, np.newaxis]
np.linspace(-3, 3, 100): -3에서 3까지 균등하게 분포된 100개의 값을 생성합니다. 이 값들이 독립 변수
X가 됩니다.
y = X**3 - 2*X + np.random.normal(0, 1, 100): 종속 변수 y는 X**3−2X의 비선형 관계를 따르며, 여기에 정규분포에서 샘플링한 노이즈(잡음)를 추가하여 현실적인 데이터를 만듭니다.
X = X[:, np.newaxis]: X를 열 벡터로 변환하여 다차원 배열로 만듭니다. 이는 scipy.interpolate.make_interp_spline() 함수가 요구하는 입력 형식입니다.
3. 스플라인 회귀 모델링
# Cubic Spline 적용 (3차 스플라인)
spline_model = make_interp_spline(X.flatten(), y, k=3)
# 새로운 X 값에 대한 예측 (더 부드러운 선을 그리기 위해 더 많은 점을 생성)
X_new = np.linspace(X.min(), X.max(), 300)
y_spline_pred = spline_model(X_new)
make_interp_spline 함수를 사용하여 Cubic Spline(3차 스플라인)을 적용합니다. 이 함수는 주어진 데이터에 맞춰 스플라인을 생성합니다.
make_interp_spline(X.flatten(), y, k=3): 주어진 X와 y값에 대해 3차 스플라인(Cubic Spline)을 적용합니다. 여기서 k=3은 스플라인의 차수를 나타내며 기본값은 3차입니다.
flatten()은 다차원 배열을 일차원으로 변환하는 함수입니다. make_interp_spline()은 일차원 배열을 요구하므로 이를 사용해 X를 평탄화합니다.
X_new = np.linspace(X.min(), X.max(), 300): 더 부드러운 곡선을 그리기 위해 X의 최소값부터 최대값까지 균등하게 분포된 300개의 새로운 값을 생성합니다.
y_spline_pred = spline_model(X_new): 생성된 스플라인 모델을 사용하여 새로운 X 값들에 대한 예측값 y를 계산합니다.
4. 시각화
# 시각화
plt.scatter(X, y, color='blue', label='Data Points')
plt.plot(X_new, y_spline_pred, color='red', label='Cubic Spline')
plt.title('Cubic Spline Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()
5. 모델 평가
# 원래 X 값에 대한 예측값 계산 (평가를 위해)
y_pred = spline_model(X.flatten())
# 모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R²):", r2)
출력 예시:
평균 제곱 오차(MSE): 2.6247543017928905e-31
결정 계수(R²): 1.0
'[업무 지식] > Statistics' 카테고리의 다른 글
[비모수상관계수] 상관관계 (0) | 2024.11.12 |
---|---|
[피어슨 상관계수] 상관관계 (0) | 2024.11.12 |
[다항회귀] 비선형 관계 회귀 (0) | 2024.11.12 |
[회귀 - 범주형] 다중선형회귀에서의 범주형 변수 (0) | 2024.11.12 |
[분산팽창요인] VIF(Variance Inflation Factor) (0) | 2024.11.12 |