본문 바로가기
개발/Python

로버스트 피팅

by 피로물든딸기 2025. 10. 25.
반응형

전체 링크

로버스트 피팅 (Robust Fitting)

- 이상치(outlier)에 덜 민감한 회귀 기법

- 일반적인 최소제곱법(OLS)이 이상치에 의해 회귀선이 크게 왜곡되는 문제를 완화

- 잔차 제곱합을 최소화하는 대신, 이상치에 덜 민감한 손실 함수를 사용

 

장점

- 이상치(outlier)에 대한 높은 견고성(robustness)

- 데이터의 잡음(noise)나 오염이 있는 경우 보다 안정적인 모델 생성

- 실제 산업 데이터(예: 센서 오차, 금융 데이터)에서 유용

 

단점

- 손실 함수가 비선형이라 계산량 증가

- 하이퍼파라미터(예: Huber의 δ) 튜닝 필요

- 이상치가 아닌 정상 데이터까지 영향력을 약화시킬 수 있음

- 예측 성능은 OLS보다 일반적으로 약간 낮음

 

한계 및 주의점

- 이상치가 너무 많거나 패턴이 복잡하면 로버스트 피팅조차 실패할 수 있음

- 이상치가 구조적 패턴(예: 다른 집단)이라면 제거하거나 무시하기보다 클러스터링이나 혼합모형 접근이 더 적합

- 모든 로버스트 모델은 일반적인 최소제곱보다 느림

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, HuberRegressor, RANSACRegressor, TheilSenRegressor
from sklearn.datasets import make_regression

# 1. 기본 데이터 생성
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2.5 * X.squeeze() + np.random.randn(100) * 2

# 2. 이상치 추가 (로버스트 피팅이 빛나는 부분)
outliers_X = np.random.uniform(0, 10, 10).reshape(-1, 1)
outliers_y = np.random.uniform(30, 50, 10)
X_out = np.vstack([X, outliers_X])
y_out = np.hstack([y, outliers_y])

# 3. 모델 정의
models = {
    "OLS (LinearRegression)": LinearRegression(),
    "HuberRegressor": HuberRegressor(),
    "RANSACRegressor": RANSACRegressor(),
    "TheilSenRegressor": TheilSenRegressor()
}

# 4. 학습 및 예측
x_line = np.linspace(0, 10, 100).reshape(-1, 1)

plt.figure(figsize=(10, 6))
plt.scatter(X_out, y_out, color='gray', alpha=0.6, label='data (with outlier)')

colors = ['r', 'g', 'b', 'orange']

for (name, model), color in zip(models.items(), colors):
    model.fit(X_out, y_out)
    y_pred = model.predict(x_line)
    plt.plot(x_line, y_pred, color=color, lw=2, label=name)

# 5. 그래프 설정
plt.title("compare")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()

반응형

'개발 > Python' 카테고리의 다른 글

가설검정  (0) 2025.10.25
마할라노비스 거리  (0) 2025.10.25
하이퍼 파라미터 튜닝  (0) 2025.10.25
기본 문법  (0) 2025.10.25
데이터 변환  (0) 2025.10.25

댓글