Dirichlet Process와 Gaussian Process Regression으로 복잡한 데이터 다루기
Dirichlet Process와 Gaussian Process Regression의 모델링 방식, 불확실성 추정, 확장 전략과 운영 시 고려할 점을 정리한다.
2026-08-14 · 최초 발행 2025-10-14
데이터가 모델의 복잡도를 정하게 두는 방법
데이터 분포나 함수 형태를 미리 고정하지 않고 복잡한 구조를 학습하려면, 모델이 필요한 복잡도를 데이터에서 찾을 수 있어야 한다. 비모수 베이지안은 사전분포에서 무한 차원을 가정하지만 유한한 데이터에 대해서는 유효 차원이 자동으로 제한되는 모델 계열이다. 이 특성은 과적합과 과소적합 사이의 균형을 잡는 데 쓰인다.
대표적인 방법이 Dirichlet Process(DP)와 Gaussian Process Regression(GPR)이다. DP는 혼합모형의 구성요소 수를 추론하는 데 초점이 있고, GPR은 함수 공간을 확률적으로 모델링해 예측값과 불확실성을 함께 다룬다.
DP는 기준분포 G0와 집중도 α로 정의되는 확률적 과정이다. Chinese Restaurant Process(CRP)와 막대자르기(Stick-Breaking, GEM) 표현을 통해 클러스터 수를 자동으로 추론할 수 있다.
GPR은 평균함수 m(x)와 커널 k(x, x')를 바탕으로 함수 공간에 사전을 두는 회귀 방법이다. 커널 설계로 평활성, 주기성, 비선형성을 제어하며 예측 평균과 분산을 동시에 산출한다.
DP와 GPR이 복잡도를 다루는 방식
DP에서는 데이터가 클러스터 수를 결정한다. α가 클수록 새로운 클러스터를 생성하는 경향이 높아진다. G0의 선택은 군집 중심 분포의 특성을 정하며, 혼합 구성요소에는 Gaussian이나 Multinomial 등을 적용할 수 있다.
GPR의 유효 자유도는 커널과 하이퍼파라미터가 규제한다. 마진 likelihood 최대화로 이를 자동 조정하고, RBF·Periodic·Linear 커널을 조합해 다양한 함수 패턴을 표현할 수 있다. 입력 스케일링과 ARD는 중요한 변수를 식별하는 데 사용된다.
추론과 확장 방식도 다르다. DP는 깁스 샘플링, 변분 추론(SVI), Truncated DP를 사용하며, 대용량 환경에서는 미니배치 SVI와 병렬 샘플링을 활용한다. GPR은 O(N^3) 계산 병목이 있어 Inducing points를 사용하는 Sparse GP, KISS-GP, SKI로 O(NM^2) 근사 확장을 고려한다.
불확실성의 형태도 구분된다. DP는 클러스터 할당 확률과 혼합 가중치의 불확실성을 제공하며, 신규 데이터가 새 클러스터를 만들 확률도 추정한다. GPR은 예측 평균과 분산을 출력하므로 베이지안 최적화에서 탐색과 활용의 균형을 잡는 기반이 된다.
군집, 주제, 고비용 실험에서의 적용
DP 기반 혼합모형은 고객 행동이나 거래 피처를 자동 클러스터링하는 데 사용할 수 있다. 결과로 클러스터 수, 고객별 소속 확률, 이상치 후보를 얻는다. 운영에서는 α를 조정해 세분화의 과분해와 소분해를 제어하고, 신규 고객을 실시간으로 할당한다. 희소 군집이 과도하게 생성되면 Truncation을 증가 또는 감소시키거나 SVI로 안정화할 수 있다. 피처의 스케일 차이로 분리가 실패한다면 표준화나 로버스트 스케일러를 적용한다.
문서-단어 행렬을 입력으로 하는 HDP-LDA에서는 HDP가 주제 수를 자동으로 추정한다. 문서별 주제 분포와 주제별 키워드가 출력되며, 드리프트에는 주기적 재학습 또는 온라인 변분 업데이트로 대응한다. 품질은 토픽 코히런스 점수와 퍼플렉시티를 추적한다.
제한된 실험점과 비용이 높은 평가 함수에는 GPR로 대체모형을 구축할 수 있다. 평균과 분산을 바탕으로 한 획득함수(EI/UCB)가 다음 실험점을 추천한다. Sparse GP에서 Inducing M=500~2,000을 사용해 속도를 개선할 수 있으며, 배치 최적화에서는 페널티나 페어와이즈 DPP로 다양성을 확보한다. 데이터가 누적되면 커널을 재적합하고 하이퍼파라미터 사전 설정으로 과적합을 방지한다.
센서 원시값과 소수의 정확 참값이 있을 때는 GPR로 보정 함수를 학습할 수 있다. 보정값과 신뢰구간을 얻어 경보 임계값 자동화에 연결한다. 잡음 분산 추정이 실패하면 WhiteKernel을 포함하고, 이상점의 영향은 Huber 손실과 유사한 효과를 내는 커널 또는 전처리로 완화한다.
비용과 리스크를 함께 다루는 효과
DP를 사용하면 사전 클러스터 수 탐색을 줄여 모델 선택 비용을 낮출 수 있으며, 튜닝 반복 횟수는 3050% 절감 가능하다(실무 경험 기반 추정). 함수의 매끄러움을 가정할 수 있는 경우 GPR과 베이지안 최적화는 평가 횟수를 2060% 줄일 수 있다.
GPR의 불확실성을 의사결정에 반영하면 과감한 실험의 실패율을 낮추고 품질 경보의 민감도와 특이도를 개선할 수 있다. 클러스터 특성이나 커널 분해는 해석을 돕고, 데이터 증가에 따른 자동 복잡도 조정은 운영 민첩성에 기여한다. 예측 분산과 할당 확률을 KPI에 통합하면 책임성 측면에서도 활용할 수 있다.
| 관점 | Dirichlet Process | Gaussian Process Regression |
|---|---|---|
| 성능 | 복잡한 혼합분포와 자동 군집 수 결정에 강점 | 소표본 고정밀 회귀와 예측 불확실성에 강점 |
| 확장성 | SVI, Truncation, 분산 샘플링으로 확장 | 기본 O(N^3) 한계를 Sparse/성긴 커널로 완화 |
| 데이터 증가 | 군집 구조가 점진적으로 정교화 | 함수 근사의 정밀도 향상 |
| 민감도 | α와 G0에 민감해 적절한 사전·정규화 필요 | 커널과 노이즈 설정에 민감해 하이퍼파라미터 최적화 중요 |
| 운영 | 신규 데이터 온라인 할당이 자연스러움 | 예측과 불확실성을 즉시 의사결정에 연결 가능 |
코드로 보는 DP 혼합모형
사전조건: Python 3.10+, scikit-learn >= 1.3, numpy, matplotlib
# pip install scikit-learn numpy matplotlib
import numpy as np
from sklearn.mixture import BayesianGaussianMixture
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
# 합성 데이터
rng = np.random.RandomState(42)
X = np.vstack([
rng.normal(loc=[0, 0], scale=0.5, size=(150, 2)),
rng.normal(loc=[3, 3], scale=0.7, size=(120, 2)),
rng.normal(loc=[-3, 3], scale=0.6, size=(100, 2)),
])
# DP-가우시안 혼합 (변분 추론, Stick-Breaking 근사)
dpgmm = BayesianGaussianMixture(
n_components=15, # Truncation 상한
weight_concentration_prior_type="dirichlet_process",
weight_concentration_prior=1.0, # α에 상응
covariance_type="full",
max_iter=1000, tol=1e-3,
random_state=42
)
model = make_pipeline(StandardScaler(), dpgmm).fit(X)
# 유효 클러스터 수 추정
bgm = model.named_steps['bayesiangaussianmixture']
effective = np.sum(bgm.weights_ > 0.01)
print("유효 클러스터 수:", effective)
# 신규 샘플 군집 할당 확률
proba = model.predict_proba([[0.2, -0.1]])
print("클러스터 확률:", np.round(proba, 3))
n_components는 충분히 크게 두고 weight_concentration_prior로 과분해와 소분해를 제어한다. 피처 스케일은 표준화한다.
불확실성을 반환하는 GPR 회귀
# pip install scikit-learn numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel, ConstantKernel
rng = np.random.RandomState(0)
X = np.linspace(0, 10, 30)[:, None]
y = np.sin(X).ravel() + rng.normal(0, 0.2, size=X.shape[0])
kernel = ConstantKernel(1.0, (1e-2, 1e2)) * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2)) \
+ WhiteKernel(noise_level=0.2, noise_level_bounds=(1e-3, 1e1))
gpr = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=5, random_state=0)
gpr.fit(X, y)
X_star = np.linspace(-1, 11, 200)[:, None]
y_mean, y_std = gpr.predict(X_star, return_std=True)
print("학습된 커널:", gpr.kernel_)
# 시각화
plt.figure(figsize=(7,4))
plt.plot(X, y, 'kx', label='Train')
plt.plot(X_star, y_mean, 'b-', label='Pred mean')
plt.fill_between(X_star.ravel(), y_mean-2*y_std, y_mean+2*y_std, color='b', alpha=0.2, label='95% CI')
plt.legend(); plt.tight_layout(); plt.show()
데이터가 많아지면 GaussianProcessRegressor 대신 Sparse GP 라이브러리인 GPyTorch나 GPflow를 검토한다. WhiteKernel을 포함하면 잡음 추정을 안정화하는 데 도움이 된다.
사전, 커널, 근사 전략을 운영에 연결하기
전처리에서는 표준화와 정규화를 우선 적용하고, 이상값의 영향을 낮춰야 한다면 로버스트 스케일러를 검토한다.
DP에서는 G0를 문제 도메인의 분포에 맞추고 α 사전에 하이퍼사전(Gamma)을 부여해 안정적인 추정을 시도할 수 있다. GPR에서는 커널 합성으로 도메인 지식을 반영하고 ARD로 변수 중요도를 학습한다.
대규모 DP 처리에는 Truncated 변분 추론과 미니배치를, 수렴 가속에는 샘플링 병렬화를 고려한다. GPR에서는 Inducing points 선택에 KMeans 초기화를 사용하고 M 갱신 빈도를 조절해 시간과 정확도를 맞춘다.
평가와 모니터링도 모델마다 달라진다. DP는 실루엣, 정규화 상호정보량, 혼합 성분의 책임도를 점검한다. GPR은 로그마진 likelihood, 예측 적중률, PICP(예측구간 포괄확률), CRPS를 활용한다.
DP는 군집 해석이 쉽지만 성분 해석을 과신할 위험이 있다. GPR은 불확실성을 제공한다는 장점이 있지만 커널 설계에 민감하다. 두 방법 모두 계산량과 하이퍼파라미터 민감도가 있으므로 자동화와 휴리스틱을 함께 사용한다.