콘텐츠로 이동
Data Prep
상세

베이지안 방법론 개요

베이지안 방법론(Bayesian Methods)은 확률을 불확실성의 척도로 해석하고, 사전 지식과 관측 데이터를 결합하여 추론하는 통계적 접근법. 불확실성 정량화, 작은 데이터, 의사결정에 강점이 있음.


핵심 개념

베이즈 정리

\[P(\theta | D) = \frac{P(D | \theta) P(\theta)}{P(D)} = \frac{\text{Likelihood} \times \text{Prior}}{\text{Evidence}}\]
구성 요소 기호 의미
Prior \(P(\theta)\) 사전 지식/믿음
Likelihood $P(D \theta)$
Posterior $P(\theta D)$
Evidence \(P(D)\) 정규화 상수

빈도주의 vs 베이지안

관점 빈도주의 베이지안
확률 해석 장기적 빈도 불확실성/믿음
파라미터 고정된 미지 상수 확률 변수
추정 점추정 (MLE) 분포 추정 (Posterior)
불확실성 신뢰구간 신용구간 (Credible Interval)
사전 지식 사용 안 함 Prior로 반영

알고리즘 분류 체계

Bayesian Methods
├── Inference
│   ├── Exact
│   │   └── Conjugate Priors
│   ├── Sampling (MCMC)
│   │   ├── Metropolis-Hastings
│   │   ├── Gibbs Sampling
│   │   ├── Hamiltonian Monte Carlo (HMC)
│   │   └── No-U-Turn Sampler (NUTS)
│   └── Variational Inference
│       ├── Mean-field VI
│       └── Automatic Differentiation VI (ADVI)
├── Bayesian Models
│   ├── Bayesian Linear Regression
│   ├── Bayesian Neural Networks
│   ├── Gaussian Processes
│   └── Hierarchical Models
├── Bayesian Optimization
│   ├── Gaussian Process surrogate
│   └── Acquisition Functions (EI, UCB)
└── Applications
    ├── A/B Testing
    ├── Hyperparameter Tuning
    └── Decision Making

베이지안 추론

Conjugate Priors

사후분포가 사전분포와 같은 가족이 되는 편리한 조합:

Likelihood Conjugate Prior Posterior
Bernoulli/Binomial Beta Beta
Poisson Gamma Gamma
Normal (mean) Normal Normal
Normal (variance) Inverse Gamma Inverse Gamma
Multinomial Dirichlet Dirichlet

예: Beta-Binomial

\[\text{Prior: } \theta \sim Beta(\alpha, \beta)$$ $$\text{Likelihood: } x | \theta \sim Binomial(n, \theta)$$ $$\text{Posterior: } \theta | x \sim Beta(\alpha + x, \beta + n - x)\]

MCMC (Markov Chain Monte Carlo)

복잡한 사후분포에서 샘플링:

Metropolis-Hastings:

1. 현재 상태 θ에서 제안 θ' ~ q(θ'|θ) 샘플
2. 수락 확률 계산:
   α = min(1, [p(θ'|D)q(θ|θ')] / [p(θ|D)q(θ'|θ)])
3. u ~ Uniform(0,1) < α이면 수락 (θ = θ')
4. 반복

Hamiltonian Monte Carlo (HMC):

물리적 시뮬레이션으로 효율적 탐색

import pymc as pm
import arviz as az

# PyMC 모델 정의
with pm.Model() as model:
    # Prior
    mu = pm.Normal('mu', mu=0, sigma=10)
    sigma = pm.HalfNormal('sigma', sigma=10)

    # Likelihood
    y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=data)

    # MCMC 샘플링 (NUTS)
    trace = pm.sample(2000, tune=1000, cores=4, return_inferencedata=True)

# 결과 분석
az.summary(trace)
az.plot_trace(trace)
az.plot_posterior(trace)

Variational Inference

사후분포를 간단한 분포로 근사:

\[q^*(\theta) = \arg\min_{q \in Q} KL(q(\theta) \| p(\theta|D))\]

ELBO 최대화로 동치:

\[ELBO = \mathbb{E}_q[\log p(D|\theta)] - KL(q(\theta) \| p(\theta))\]
with pm.Model() as model:
    # ... 모델 정의 ...

    # ADVI
    approx = pm.fit(method='advi', n=30000)
    trace = approx.sample(2000)

Gaussian Processes

함수에 대한 분포:

\[f(x) \sim GP(m(x), k(x, x'))\]

예측 분포:

\[f_* | X, y, X_* \sim \mathcal{N}(\bar{f}_*, cov(f_*))\]
\[\bar{f}_* = K_*^T (K + \sigma_n^2 I)^{-1} y\]
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel

kernel = RBF(length_scale=1.0) + WhiteKernel(noise_level=1.0)
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(X_train, y_train)

# 예측 + 불확실성
y_pred, y_std = gp.predict(X_test, return_std=True)

# 신뢰구간
lower = y_pred - 1.96 * y_std
upper = y_pred + 1.96 * y_std

베이지안 최적화

비용이 큰 블랙박스 함수 최적화:

1. Surrogate Model (GP) 학습
2. Acquisition Function 최대화 → 다음 평가점 선택
3. 실제 함수 평가
4. Surrogate Model 업데이트
5. 반복

Acquisition Functions:

함수 수식 특성
Expected Improvement \(\mathbb{E}[\max(f(x) - f^+, 0)]\) Exploitation + Exploration
Upper Confidence Bound \(\mu(x) + \kappa \sigma(x)\) 탐색-활용 균형 조절
Probability of Improvement \(P(f(x) > f^+ + \epsilon)\) 보수적
from bayes_opt import BayesianOptimization

def objective(x, y):
    return -((x - 2) ** 2 + (y - 3) ** 2)

optimizer = BayesianOptimization(
    f=objective,
    pbounds={'x': (-5, 5), 'y': (-5, 5)},
    random_state=42
)

optimizer.maximize(init_points=5, n_iter=25)
print(optimizer.max)

베이지안 A/B 테스트

import pymc as pm
import numpy as np

# 데이터
control_conversions = 120
control_total = 1000
treatment_conversions = 145
treatment_total = 1000

with pm.Model() as ab_model:
    # Prior (무정보적)
    p_control = pm.Beta('p_control', alpha=1, beta=1)
    p_treatment = pm.Beta('p_treatment', alpha=1, beta=1)

    # Likelihood
    obs_control = pm.Binomial('obs_control', n=control_total, p=p_control, 
                               observed=control_conversions)
    obs_treatment = pm.Binomial('obs_treatment', n=treatment_total, p=p_treatment,
                                 observed=treatment_conversions)

    # 차이 및 상대 효과
    diff = pm.Deterministic('diff', p_treatment - p_control)
    relative_lift = pm.Deterministic('relative_lift', (p_treatment - p_control) / p_control)

    # 샘플링
    trace = pm.sample(5000, return_inferencedata=True)

# 결과 해석
posterior_diff = trace.posterior['diff'].values.flatten()
prob_treatment_better = (posterior_diff > 0).mean()
print(f"P(Treatment > Control) = {prob_treatment_better:.2%}")

# 95% 신용구간
print(f"Lift 95% CI: [{np.percentile(posterior_diff, 2.5):.4f}, {np.percentile(posterior_diff, 97.5):.4f}]")

계층적 모델 (Hierarchical Models)

그룹 간 정보 공유 (부분 풀링):

\[y_{ij} | \theta_j \sim p(y | \theta_j)$$ $$\theta_j | \phi \sim p(\theta | \phi)$$ $$\phi \sim p(\phi)\]
with pm.Model() as hierarchical_model:
    # Hyperpriors
    mu_global = pm.Normal('mu_global', mu=0, sigma=10)
    sigma_global = pm.HalfNormal('sigma_global', sigma=5)

    # Group-level parameters
    mu_group = pm.Normal('mu_group', mu=mu_global, sigma=sigma_global, shape=n_groups)

    # Likelihood
    y = pm.Normal('y', mu=mu_group[group_idx], sigma=sigma, observed=data)

    trace = pm.sample(2000)

참고 문헌

교과서

  • Gelman, A. et al. (2013). "Bayesian Data Analysis" (3rd ed). CRC Press.
  • McElreath, R. (2020). "Statistical Rethinking" (2nd ed). CRC Press.
  • Murphy, K.P. (2023). "Probabilistic Machine Learning: Advanced Topics". MIT Press.

핵심 논문

  • Hoffman, M.D. & Gelman, A. (2014). "The No-U-Turn Sampler". JMLR.
  • Blei, D.M. et al. (2017). "Variational Inference: A Review for Statisticians". JASA.

라이브러리

  • PyMC: https://www.pymc.io/
  • Stan: https://mc-stan.org/
  • NumPyro: https://num.pyro.ai/
  • ArviZ: https://arviz-devs.github.io/arviz/