Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.
Photo by Edgar Chaparro / Unsplash

Bayesian P- Value

  • Bayesian P-Value는 **모델의 적합도(goodness-of-fit)**를 평가하는 데 사용됩니다.
  • 사후 분포(posterior distribution)를 이용하여 실제 데이터와 모델이 생성한 예상 데이터를 비교함으로써, 관측된 데이터가 모델에 의해 얼마나 잘 설명되는지를 평가합니다.
  • 빈도주의 p-값은 "관찰된 데이터보다 극단적인 데이터가 나올 확률"을 계산하지만, Bayesian P-Value는 "모델이 실제 데이터를 얼마나 잘 설명하는지"를 평가하는 데 중점을 둡니다.

계산 방법

  • Bayesian P-Value는 주로 두 가지 값을 비교합니다:
    • 관측된 통계량(Observed Test Statistic): 실제 데이터에서 계산한 통계량입니다
    • 예측된 통계량(Predicted Test Statistic): 사후 분포를 기반으로 모델이 예측한 데이터에서 계산한 통계량입니다.
  • 이 두 통계량을 비교하여 모델이 실제 데이터를 얼마나 잘 설명하는지 평가할 수 있습니다. $$P_B = P(T(\tilde{y}) \geq T(y) \mid y)$$
  • $T(\tilde{y})$: 모델에 의해 예측된 데이터 $\tilde{y}$에서 계산된 통계량
  • $T(y)$: 실제 관측 데이터 $y$에서 계산된 통계량
  • 베이지안 p-값은 예측된 데이터의 통계량이 실제 관측 데이터보다 크거나 같은 확률로 정의됩니다.

장단점

장점

  • 베이지안 방식의 장점 반영: 불확실성을 자연스럽게 모델링하고, 사전 정보(prior knowledge)를 반영할 수 있습니다.
  • 적합도 평가: 모델이 데이터를 얼마나 잘 설명하는지 평가하는 유연한 도구로 활용될 수 있습니다.

단점

  • 직관성 부족: 빈도주의적 p-값처럼 단순히 임계값(예: 0.05)을 넘으면 가설을 기각하는 명확한 기준이 없습니다. 대신, 적합도를 상대적으로 평가해야 합니다.
  • 계산 복잡성: 사후 분포를 샘플링하고, 이를 바탕으로 통계량을 계산하는 과정이 빈도주의적 방법에 비해 더 복잡하고 시간이 소요될 수 있습니다.

코드

  • P-value가 0.75라는 것은, 모델이 예측한 값들이 실제 관측 데이터와 매우 유사하거나 더 나은 설명을 제공할 수 있는 확률이 75%라는 의미입니다. 즉, 모델이 우리가 관측한 데이터를 비교적 잘 설명하고 있다는 신호로 볼 수 있습니다.
import pymc as pm  
import numpy as np  
import arviz as az  
  
# 가상의 데이터 생성  
true_mu = 5  
observed_data = np.random.normal(true_mu, 1, size=100)  
  
# 모델 정의  
with pm.Model() as model:  
    # 사전 분포 정의  
    mu = pm.Normal('mu', mu=0, sigma=10)  
    sigma = pm.HalfNormal('sigma', sigma=1)  
      
    # 가능도 정의  
    y = pm.Normal('y', mu=mu, sigma=sigma, observed=observed_data)  
      
    # 사후 분포에서 샘플링  
    trace = pm.sample(1000)  
      
    # 사후 예측 분포에서 샘플링  
    posterior_predictive = pm.sample_posterior_predictive(trace, var_names=['y'])  
  
# Bayesian P-value 계산  
discrepancy = lambda x: np.mean(x)  
T_obs = discrepancy(observed_data)  
  
# posterior_predictive에서 'y' 추출  
pp_y = posterior_predictive.posterior_predictive['y'].values  
  
# T_rep 계산  
T_rep = np.array([discrepancy(y) for y in pp_y])  
  
p_value = np.mean(T_rep >= T_obs)  
  
print(f"Bayesian P-value: {p_value}")  
  
# 추가 정보 출력  
print(f"\nPosterior predictive shape: {pp_y.shape}")  
print(f"T_rep shape: {T_rep.shape}")  
print(f"Observed data shape: {observed_data.shape}")

Read more

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non Identifiability * Non-Identifiability는 주어진 데이터와 모델에 대해 특정 파라미터를 고유하게 식별할 수 없는 상황을 의미합니다. 즉, 여러 파라미터 값들이 동일한 데이터를 생성할 수 있으며, 이로 인해 특정 파라미터 값을 확정적으로 추정하기 어렵게 됩니다. * 베이지안 추론에서 Non-Identifiability는 사후 분포가 특정 파라미터 값에 대해 명확하게 수렴하지 않고, 여러 값들에 대해 비슷한 확률을

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram * 히스토그램의 변형으로 데이터가 비정규적이거나 큰 분산을 가지는 경우, 정확한 분포를 파악하기 위해 사용됩니다. * 일반적으로 히스토그램은 데이터의 빈도를 직접적으로 나타내기 때문에, 큰 값이 빈번하게 발생하는 경우 상대적으로 작은 값을 잘 드러내지 못하는 경향이 있습니다. 반면, Rootgram은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서

ML 코드 작성시 유의사항

ML 코드 작성시 유의사항

유의사항 * 코드의 작성방식: 다른사람이 코드를 읽고 이해할 수 있는가? * 코드의 성능: 의도치 않은 부작용이 발생하는가? * 코드의 복잡성: 유스케이스에 비해 설계가 과도하고 부족한가 * 개선의 용이성: ML코드가 지속적으로 리팩토링 되는가? 코드 작성방식에 따른 개발자(+데이터과학자)의 유형 분류 출처 * 머신러닝 엔지니어링 인 액션