베이즈 정리와 베이즈 네트워크로 불확실성을 갱신하는 법
베이즈 정리의 사전 확률·가능도·사후 확률 관계와 베이즈 네트워크의 조건부 독립, 추론 방식, 운영상 고려사항을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
증거가 들어올 때 확률을 갱신하는 규칙
베이즈 정리는 관측 증거 E가 주어졌을 때 가설 H의 확률을 다시 계산하는 규칙이다. 데이터만 보지 않고 기존 지식과 함께 판단해야 하는 상황에서 확률적 추론의 기준점이 된다.
사전 확률, 가능도, 사후 확률의 관계
공식은 다음과 같다.
P(H|E) = P(E|H) × P(H) / P(E)
여기서 P(H)는 관측 이전의 신념인 사전 확률(Prior)이다. P(E|H)는 가설이 참일 때 증거가 나타날 가능도(Likelihood)이며, P(H|E)는 증거를 반영한 사후 확률(Posterior)이다. 분모 P(E)는 증거의 주변확률로, ΣH P(E|H)P(H)로 계산한다.
사전 확률은 도메인 지식이나 과거 데이터에서 설정한다. 사후 확률은 증거가 추가될 때마다 다시 갱신할 수 있으므로 온라인 업데이트에도 연결된다.
조건부 독립성을 그래프로 다루는 베이즈 네트워크
베이즈 네트워크(Bayesian Network)는 변수 간 조건부 독립성을 DAG(유향 비순환 그래프)로 표현하는 확률 그래픽 모델이다. 노드는 변수를, 엣지는 인과 또는 의존 관계를 나타내며, 각 노드는 조건부 확률표(CPD)를 가진다.
전체 변수의 관계를 한 번에 모델링하지 않고 지역적 의존성에 집중하므로 차원을 줄이고 추론 계산량을 낮출 수 있다.
모델링과 추론에서 선택할 지점
입력은 사전 확률, 가능도, 관측된 증거다. 정규화 항인 P(E)를 통해 확률을 갱신하며, 수치 안정성이 필요할 때는 로그 확률을 사용한다.
데이터가 희소하거나 노이즈가 큰 경우에는 사전 분포가 완충 역할을 한다. 전문가 지식과 데이터를 함께 반영할 수 있고, 베타-베르누이 또는 디리클레-다항 같은 공액 사전을 사용하면 닫힌형 해를 구할 수 있다.
네트워크 구조는 도메인 지식으로 직접 설계하거나 점수기반·제약기반 방식으로 학습할 수 있다. 추론은 Variable Elimination, Junction Tree 같은 정확 추론과 MCMC, 변분 추론 같은 근사 추론 중에서 선택한다. 이 선택에는 정확도와 계산비용, 실시간성과 모델 복잡도, 설명가능성과 표현력의 균형이 따른다. 온라인 업데이트가 필요하면 순차적 베이즈(Streaming) 설계를 고려한다.
확률 갱신이 쓰이는 문제
A/B 테스트에서는 베타-베르누이 모델로 전환율의 사후 분포를 추정하고, 순차 실험에서 탐색과 활용의 균형을 다룰 수 있다. 스팸이나 사기 탐지에는 피처 독립 가정을 활용하는 나이브 베이즈가 실시간 분류와 고속 추론에 쓰인다.
의료 진단 의사결정지원에서는 검사 민감도·특이도와 질병 유병률을 함께 반영하고, 검사 결과를 순차적으로 업데이트한다. 예측 유지보수에서는 센서 이벤트를 베이즈 네트워크로 통합해 장애 원인을 추론하고 부품 교체 우선순위를 정한다.
관측 데이터가 부족한 구간은 사전 분포로 보강할 수 있다. 이는 콜드스타트 리스크를 완화하는 방법이기도 하다.
입력부터 예외 처리까지의 흐름
관측 증거 스트림을 처리하려면 사전 확률과 가능도 모델을 먼저 준비한다. 이후 결측치·이상치를 처리하고 스케일링한 뒤, 정확 추론 또는 근사 추론을 선택한다. 로그 확률과 스무딩을 적용하며, 교차검증과 분포 합이 1인지 확인하는 정합성 검사를 수행한다.
결과물은 사후 확률과 결정 경계 또는 정책, 불확실성 구간이다. 확률이 0이 되는 경우에는 라플라스 스무딩을 적용하고, 언더플로는 로그-합-지수(log-sum-exp)로 다룬다. 증거가 상충하면 강건 사전(heavy-tailed) 또는 온도 조절을 사용할 수 있다.
유병률까지 반영한 계산 예시
유병률을 P(D)=0.01, 민감도를 P(+|D)=0.95로 둔다. 특이도 P(-|¬D)=0.90이면 위양성률은 P(+|¬D)=0.10이다.
양성 결과가 나왔을 때 분자는 P(+|D)P(D)=0.95×0.01=0.0095다. 분모는 0.0095 + P(+|¬D)P(¬D)=0.0095 + 0.10×0.99=0.0095+0.099=0.1085가 된다. 따라서 사후 확률은 P(D|+)=0.0095/0.1085≈0.0876(8.76%)이다.
유병률이 낮으면 위양성의 영향이 커진다. 사후 확률은 검사 성능만으로 정해지지 않으며, 독립적인 추가 증거를 반영해 순차 업데이트하면 정확도를 높일 수 있다.
정확 추론과 근사 추론의 운영상 차이
| 방법 | 성능(정확성) | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| 정확 추론(Variable Elimination/Junction Tree) | 높음 | 제한됨(트리폭 민감) | 이론적 보장 | 결정적 결과 | 구현 복잡, 메모리 부담 |
| MCMC(샘플링) | 중~높음(충분 표본 시) | 높음(병렬화 용이) | 점근적 보장 | 수렴 민감(혼합도) | 튜닝 필요(체인, 번인) |
| 변분 추론(Mean-field, SVI) | 중 | 매우 높음(대규모 데이터) | 근사 해, 편향 가능 | 수렴 안정성 필요 | 배치/온라인 운영 용이 |
베이즈 네트워크 구현 예시
환경은 Python 3.9+와 pgmpy 0.1.25를 사용하며, 설치 명령은 pip install pgmpy다.
# 베이즈 네트워크 예제: Rain → Sprinkler → WetGrass, Rain → WetGrass
from pgmpy.models import BayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
model = BayesianNetwork([('Rain', 'Sprinkler'),
('Rain', 'WetGrass'),
('Sprinkler', 'WetGrass')])
cpd_rain = TabularCPD(variable='Rain', variable_card=2,
values=[[0.8], [0.2]]) # [False, True]
cpd_sprinkler = TabularCPD(variable='Sprinkler', variable_card=2,
values=[[0.6, 0.99], # S=False | R=False/True
[0.4, 0.01]], # S=True | R=False/True
evidence=['Rain'], evidence_card=[2])
cpd_wet = TabularCPD(variable='WetGrass', variable_card=2,
values=[
[0.99, 0.10, 0.10, 0.01], # W=False
[0.01, 0.90, 0.90, 0.99] # W=True
],
evidence=['Sprinkler', 'Rain'], evidence_card=[2, 2])
model.add_cpds(cpd_rain, cpd_sprinkler, cpd_wet)
assert model.check_model()
infer = VariableElimination(model)
posterior_rain = infer.query(variables=['Rain'], evidence={'WetGrass': 1})
print("P(Rain | WetGrass=True) =", posterior_rain.values[1])
실행하면 P(Rain | WetGrass=True)는 0과 1 사이의 확률로 반환된다. 파라미터를 바꾸면 사후 확률도 즉시 갱신된다.
사전 정보와 온라인 갱신이 주는 효과
사전 정보를 활용하면 오검출·미검출률을 줄이고 A/B 테스트 전환율 추정 오차를 10~30% 축소할 수 있다. ROC와 비용민감 베이즈 의사규칙을 이용하면 의사결정 임계값을 조정해 비용과 위험을 최소화할 수 있다.
조건부 구조와 사후 확률을 근거로 설명 가능한 추론 체계를 구성할 수 있으며, 데이터가 부족한 구간에서도 합리적인 추정을 제공한다. 온라인 업데이트는 최신성을 유지하고 변경 감지에 강건한 모델 운영을 뒷받침한다.