EDUCATION/DSS Online 6기

DAY24 - 베이즈정리

Kululu_ 2021. 2. 22. 13:20

베이즈정리

- 베이즈정리는 조건부확률을 구하는 공식입니다.

- 사전확률(정보가 주어지기 전 확률)로부터 사후확률(정보가 주어진 후 확률)을 계산하는 과정입니다.

$$ P(A|B) = \frac{P(B|A)P(A)}{P(B)} $$

 

- $P(A)$ : 사전확률

- $P(A|B)$ : 사후확률

- $P(B|A)$ : 가능도

- $P(B)$ : 정규화 상수

 

 

베이즈정리의 확장

만약 여러 사건이 서로 배타적이고 합집합이 전체 표본공간이라면 전체확률의 법칙을 이용해 베이즈정리를 나타낼 수 있습니다.

$$ A_i \cap A_j = \varnothing $$

$$ A_1 \cup A_2 \cup \dots \A_N = \Omega $$

 

$$ P(A_1|B) = \frac{P(B|A_1)P(A_1)}{P(B)} \\ = \frac{P(B|A_1)P(A_1)}{\sum_{i=1}^N P(A_i,B)} \\ = \frac{P(B|A_1)P(A_1)}{\sum_{i=1}^N P(B|A_i)P(A_i)}$$

 

이러한 확장 형태는 보통 멀티클래스 분류문제(ex : 객관식 정답 맞추기)에서 많이 사용되는데 B라는 정보가 주어졌을 때 1, 2, 3, 4, 5 중에서 가장 정답일 확률이 높은 것을 고르는 문제입니다.

 

이 때 위의 확장 형태를 사용하게 되면 결국 분모의 값은 모두 똑같아져서 분자에 해당하는 $P(B|A_i)P(A_i)$ 값만 비교하면 어떤 보기가 가장 정답일 확률이 높은지 알 수 있습니다.

 

 

 

베이즈 정리 대표 문제

베이즈 정리하면 대표적으로 등장하는 문제는 "검사 시약"문제입니다.

문제를 다음과 같이 정의하겠습니다.

1. D : 병에 걸린 경우

2. S : 검사 시 양성 반응을 보이는 경우

3. $P(S|D) = 0.99,\ P(D) = 0.002,\ P(S|D^C) = 0.05$

 

현재 우리는 이 검사 시약이 잘 작동하는 지를 알고 싶습니다.

주어진 정보를 토대로 보았을 때 "병에 걸린 사람을 검사해서 병에 걸렸다"라고 올바르게 판단할 확률은 99%나 됩니다.

이것만 보았을 때 시약이 잘 작동하고 있다고 판단할 수도 있습니다.

 

하지만 실제로 검사 시약을 사용하는 절차를 생각해보면 이러한 정보는 충분하지 않다는 것을 알 수 있습니다.

 

아무런 정보가 없는 상태에서 검사 시약으로 검사를 진행하였을 때 그 결과가 실제 결과와 잘 일치해야 좋은 시약이라고 할 수 있습니다.

 

따라서 시약의 성능을 판단하기 위해서는 $P(D|S)$의 값을 계산해야 되는 것입니다.

$$ P(D|S) = \frac{P(S|D)P(D)}{P(S)} \\ = \frac{P(S|D)P(D)}{\sum P(D_i,S)} \\ = \frac{P(S|D)P(D)}{P(S|D)P(D) + P(S|D^C)P(D^C)} \\ = \frac{0.99 \times 0.002}{0.99 \times 0.002 + 0.05 \times 0.998} \\ = 0.038 $$

 

계산 결과를 보면 알 수 있듯이 이 시약을 통해 양성이라는 결과가 나와도 실제로 그 사람이 병에 걸려있을 확률을 3.8%밖에 되지 않으므로 시약의 성능이 그닥 좋지 않음을 알 수 있습니다.

 

 

베이즈정리도 pgmpy 패키지를 이용해 파이썬으로 구현할 수 있습니다.

우선 가장먼저 사전확률을 구현해줍니다.

 

두 번째로 가능도에 사용될 확률을 구현해줍니다.

이 때 '확률값'에 들어가는 값은 다음과 같이 입력해야 합니다.

$$ [ [P(S=0|D=0), P(S=0|D=1)], [P(S=1|D=0), P(S=1|D=1)] ] $$

 

 

앞서 구현했던 사전확률과 가능도를 이용해 베이지안 모델을 만들고 이를 이용해 베이즈정리에 따른 사후 확률을 계산할 수 있습니다.

 

최종적으로 P(D=1|S=1), 검사 시약 문제로 생각하면 검사 결과가 양성일 때 실제 병에 걸린 사람일 확률이 0.0382가 된다는 것을 알 수 있습니다.