비선형 회귀로 곡선·포화 패턴을 모델링하는 방법
비선형 회귀에서 다항 회귀, 로지스틱 성장 모델, 비선형 최소제곱을 선택하고 초기값·제약·검증·운영 전략을 설계하는 방법
2026-08-14 · 최초 발행 2024-04-29
곡선과 포화가 보일 때의 회귀 모델 선택
데이터가 직선적 추세를 벗어나 곡선을 그리거나 포화점에 가까워지고, 시간에 따라 S-커브 형태로 움직인다면 비선형 회귀를 검토할 시점이다. 핵심은 데이터의 형태와 해석에 필요한 수준에 맞춰 모델 프레임을 고르고, 적합 과정의 수렴 문제까지 설계에 포함하는 데 있다.
다항 회귀는 입력 특성을 다항식으로 늘린 뒤 선형 회귀 방식으로 계수를 구한다. 모델은 y ≈ β0 + β1x + β2x² + … + βdx^d 형태이며, 비선형 관계를 선형 회귀 프레임으로 다룰 수 있다. 파라미터 관점에서는 볼록 최적화 성질을 갖지만, 차수가 커질수록 과적합과 수치 불안정, 발산·진동 위험이 생길 수 있어 정규화와 스케일링이 필요하다.
로지스틱 성장 모델은 포화와 S-커브를 표현하는 데 적합하다. 기본식은 y(t) = K / (1 + A·e^(−r·t))이며, K는 포화수준, r은 성장률, A는 초기 조건과 관련된 상수다. 포화수준과 전환점처럼 해석에 쓸 수 있는 지표를 제공하지만, 비선형 파라미터 공간에서 동작하므로 초기 추정치와 경계조건의 영향이 크다.
일반 비선형 최소제곱은 함수 f(x; θ)와 관측값의 잔차 r_i = y_i − f(x_i; θ) 제곱합을 최소화한다. 목적함수는 min_θ Σ r_i(θ)^2다. 가우스–뉴턴, Levenberg–Marquardt(LM), Trust Region Reflective(TRF)가 대표적인 알고리즘이며, 수렴성·식별성·스케일링 전략이 결과를 좌우한다.
적합 전에 설계해야 할 조건
특성 확장으로 대응할지, 로지스틱처럼 구조를 가진 곡선을 명시할지부터 구분해야 한다. 다항 회귀는 패턴에 유연하게 반응하지만 고차수에서 불안정해질 수 있다. 로지스틱은 해석하기 쉽지만 표현 가능한 패턴에는 제약이 있다.
비선형 적합에서는 초기값, 파라미터 경계, 스케일링이 수렴성을 결정한다. 다중 시작(multi-start)이나 전역 탐색인 Differential Evolution을 지역 탐색인 LM/TRF와 조합할 수 있다. 잔차 노름, 파라미터 변화량, 최대 반복 횟수는 수렴 기준으로 관리하고, 수치 미분(Jacobian)의 안정화와 정칙화도 함께 고려한다.
노이즈와 헤테로스케다스틱에는 L2 정규화나 가중 최소제곱을 적용할 수 있다. K>0처럼 물리적 의미가 있는 값은 Bounds로 제한하며, 양수 또는 확률 제약은 로그·로지트 변환으로 연속 공간에서 다룰 수 있다.
검증 단계에서는 K-겹 교차검증과 잔차의 독립성·등분산성 점검, 고레버리지 포인트 탐지가 필요하다. 예측 구간과 부트스트랩은 불확실성을 정량화하는 수단이 된다. 이상치 영향이 크다면 Huber 또는 soft-L1 같은 강건 손실을 활용할 수 있다.
운영 환경에서는 배치 적합과 온라인 업데이트를 분리하고, 시드와 데이터·모델 버저닝으로 재현성을 확보한다. 잔차 분포 드리프트, 파라미터 변동률, 재적합 스케줄을 모니터링하며, 실패 시 사용할 폴백 모델도 미리 정한다.
입력부터 배포 판단까지의 흐름
입력으로는 원시 시계열 또는 단면 데이터, K 상한 같은 사업 제약, 초기값 후보를 받는다. 전처리에서 이상치를 필터링하고 스케일링과 가중치를 설계한 뒤, 다항 차수 또는 로지스틱·대안 곡선 후보를 비교한다.
최적화는 제약을 포함한 NLS(LM/TRF), 다중 시작, 강건 손실 옵션으로 수행한다. 교차검증과 잔차 진단, 예측 구간 산출을 거쳐 적합 파라미터와 RMSE·MAE·sMAPE 같은 성능 지표, 불확실성, 재학습 주기를 출력한다. 수렴하지 않으면 초기값 재시도, 알고리즘 교체, 모델 단순화 순으로 폴백한다.
모델별 선택 기준
| 모델 | 성능(곡선적합) | 확장성(특성수/데이터량) | 일관성(수렴/재현성) | 안정성(노이즈/이상치) | 운영 편의 |
|---|---|---|---|---|---|
| 다항 회귀 | 중~고, 패턴 유연 | 고, 선형해 닫힘 | 높음, 볼록 문제 | 중, 고차수 민감 | 높음, 파이프라인 단순 |
| 로지스틱 성장 | 고, 포화·S-커브 강점 | 중, 비선형 최적화 비용 | 중, 초기값 의존 | 중~고, 강건 손실 유효 | 중, 파라미터 해석 용이 |
| 일반 NLS(사용자 정의) | 케이스 의존, 최고 잠재 | 케이스 의존 | 케이스 의존, 국소해 리스크 | 강건-손실 설계 필요 | 중, 도메인 지식 요구 |
성장·수요·공정·운영 지표에 적용하는 방식
제품 또는 사용자 성장 예측에서는 로지스틱 모델로 월간 활성 사용자(MAU)의 포화 수준과 전환점을 추정하고, 캠페인 시나리오에 따른 성장률 r의 감응도를 분석할 수 있다.
할인율 증가에 따라 판매량 포화가 관측되는 수요·가격 관계에서는 로지스틱 또는 미하일리스-멘텐 형태를 적용할 수 있다. 가격 범위별 최적 포인트를 도출한 뒤 재고·공급 계획과 연결하는 방식이다.
바이오와 제조 공정에서는 세포 성장이나 반응 속도를 모델링해 배치 종료 시점을 최적화한다. 센서 노이즈가 존재하면 가중 또는 강건 NLS로 적합을 안정화할 수 있다.
운영 지표에서는 지연시간-부하 곡선의 비선형 구간을 포착해 용량 계획에 반영한다. 경계조건에 기반한 파라미터 제약은 과도한 예측을 막는 데 쓸 수 있다.
Python으로 적합과 수렴을 확인하기
전제조건은 Python 3.10+, numpy 1.26+, scipy 1.11+, scikit-learn 1.3+이며, 재현성 시드를 고정하고 예제 생성 방식의 데이터를 사용한다.
다항 회귀에서는 차수 선택과 정규화 파이프라인을 함께 구성한다.
# Python 3.10
import numpy as np
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error
rng = np.random.default_rng(42)
# 곡선 데이터 생성: y = 0.5x^3 - x^2 + 2x + noise
X = rng.uniform(-3, 3, size=400).reshape(-1, 1)
y = 0.5*X[:,0]**3 - 1.0*X[:,0]**2 + 2.0*X[:,0] + rng.normal(0, 2, size=X.shape[0])
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)
pipe = Pipeline([
("poly", PolynomialFeatures(include_bias=False)),
("scale", StandardScaler(with_mean=False)), # 다항항 희소성 고려
("ridge", Ridge(random_state=42))
])
param_grid = {
"poly__degree": [2, 3, 4, 5],
"ridge__alpha": [0.01, 0.1, 1.0, 10.0]
}
cv = GridSearchCV(pipe, param_grid, cv=5, scoring="neg_root_mean_squared_error", n_jobs=-1)
cv.fit(X_tr, y_tr)
y_pred = cv.best_estimator_.predict(X_te)
rmse = mean_squared_error(y_te, y_pred, squared=False)
mae = mean_absolute_error(y_te, y_pred)
print("Best params:", cv.best_params_)
print(f"Test RMSE={rmse:.3f}, MAE={mae:.3f}")
로지스틱 성장 모델은 curve_fit에 초기값과 경계를 전달해 NLS 적합을 수행한다.
import numpy as np
from scipy.optimize import curve_fit
from sklearn.metrics import mean_absolute_percentage_error
rng = np.random.default_rng(7)
t = np.linspace(0, 20, 80)
K_true, r_true, A_true = 100.0, 0.35, 5.0
def logistic(t, K, r, A):
return K / (1 + A * np.exp(-r * t))
y_clean = logistic(t, K_true, r_true, A_true)
y = y_clean + rng.normal(0, 2.0, size=t.size)
# 초기값·경계 설정
p0 = [y.max()*1.1, 0.2, 1.0]
bounds = ([0.0, 0.0, 0.0], [np.inf, 5.0, np.inf])
p_opt, cov = curve_fit(logistic, t, y, p0=p0, bounds=bounds, maxfev=10000)
K_hat, r_hat, A_hat = p_opt
y_hat = logistic(t, *p_opt)
mape = mean_absolute_percentage_error(y, y_hat)
print(f"Estimated K={K_hat:.2f}, r={r_hat:.3f}, A={A_hat:.2f}, MAPE={mape*100:.2f}%")
강건 손실과 다중 시작이 필요한 경우에는 least_squares로 적합 결과 중 비용이 가장 낮은 결과를 선택한다.
import numpy as np
from scipy.optimize import least_squares
rng = np.random.default_rng(123)
t = np.linspace(0, 10, 60)
K_true, r_true, A_true = 50.0, 0.6, 3.0
def logistic(t, K, r, A):
return K / (1 + A * np.exp(-r * t))
y = logistic(t, K_true, r_true, A_true) + rng.standard_t(df=3, size=t.size) # 두꺼운 꼬리 노이즈
def residuals(theta):
K, r, A = theta
return logistic(t, K, r, A) - y
bounds = ([1e-3, 1e-6, 1e-6], [1e3, 5.0, 1e3])
best = None
for seed in [0, 1, 2, 3, 4]:
rng2 = np.random.default_rng(seed)
p0 = [y.max()*rng2.uniform(0.8, 1.5),
rng2.uniform(0.05, 1.0),
rng2.uniform(0.5, 5.0)]
res = least_squares(residuals, p0=p0, bounds=bounds, loss="soft_l1", f_scale=1.0, max_nfev=20000)
if best is None or res.cost < best.cost:
best = res
K_hat, r_hat, A_hat = best.x
print("Converged:", best.success, "Message:", best.message)
print(f"Best cost={best.cost:.3f}, K={K_hat:.2f}, r={r_hat:.3f}, A={A_hat:.2f}")
입력 표준화, K/100 같은 파라미터 리스케일링, Jacobian 스케일 조정은 수치 안정화에 도움이 된다. 비수렴이 발생하면 초기값을 라틴하이퍼큐브 샘플링으로 구성하고, 경계를 완화한 다음 모델을 단순화하는 순서로 대응할 수 있다. 난수 시드, 데이터·코드 해시, 하이퍼파라미터 스냅샷도 기록한다.
정확도와 운영 안정성에 미치는 영향
곡선 또는 포화 패턴 데이터에서는 선형 모델 대비 RMSE가 10~30% 개선될 수 있으며, 효과는 도메인과 노이즈 수준에 의존한다. 로지스틱 모델의 K, r, 전환점은 전략 수립에 활용할 수 있는 해석 가능성을 제공한다.
강건 손실과 제약을 도입하면 이상치 민감도를 잔차 IQR 기준 2040% 완화할 수 있다. 재고와 캠페인 타이밍을 최적화하면 손실율이 515% 감소할 수 있다.
곡률·포화·S-커브가 데이터에 존재한다면 다항 회귀의 유연성, 로지스틱의 해석성, 일반 NLS의 표현력을 비교해 선택한다. 초기값·스케일링·제약·강건 손실을 포함한 최적화 설계와 교차검증·잔차 진단·폴백 체계가 함께 있어야 성능, 안정성, 재현성을 운영 환경에서도 유지할 수 있다.