R을 사용한 베이즈 분류/예측 모델 (Naive Bayes classification in R)

베이지언 확률 모델은 전통적인 피셔리언 확률 모델인 빈도주의와 함께 현대 확률 통계학의 중요한 축을 구성하고 있습니다.

빈도주의가 오차범위, 통계적 유의성 검증 등으로 불확실성을 객관적으로 제거해나갈 수 있다고 믿은 반면 베이지언 확률 모델에서는 주관적인 추론을 바탕으로 한 “사전확률”을 추가적인 관측으로 “사후확률”로 업데이트 해 나가는 방법으로 불확실성을 제거해 나가려는 접근 방법을 취합니다.

베이즈 추론을 기반으로 한 방법론의 정확도는 일반적으로 머신러닝의 대표적인 방법인 랜덤포레스트나 트리 분류 방법 보다도 높다고 평가받고 있습니다.

이번 포스팅에서는 베이즈 추론의 기본 개념에 대해 알아보고, R을 통해 나이브 베이지언 방법론에 기반한 분류/예측 모델을 만들어 보는 예제를 소개해 드리려고 합니다.

Bayes Classification R
몬티홀 문제 – 어떤 문을 선택해야 스포츠카를 받을 수 있을까?

베이즈 추론의 기본 개념 – 몬티홀 문제

몬티홀 문제는 미국의 TV쇼 Let’s Make a Deal에서 유래한 문제로, 문제는 매우 간단합니다.

당신은 세 개의 문 중 하나를 선택 해서 그 뒤의 상품을 가져갈 수 있습니다.  문 뒤에는 스포츠카 한 대와 염소 두마리가 있습니다.

그래서 당신은 1번을 선택합니다. 그러자 갑자기 진행자가 3번 문을 열어서 문 뒤에 염소가 있음을 보여줍니다. 사회자는 당신에게 물어봅니다.  1번대신 2번을 선택하지 않겠냐고 말이죠. 이때 선택을 바꾸는 것이 유리할까요?

각 문 뒤에 스포츠카가 있을 확률은 1/3인데, 3번방에 없으니 1, 2번방에 스포츠카가 있을 확률은 각각 1/2로 같을 것 같은 생각이 들기 마련인데요, 사실은 선택을 바꾸는 것이 자동차를 받을 수 있는 확률을 1/3에서 2/3으로 높이는 방법입니다.

기존의 확률 1/2를 새롭게 관찰된 사실 “3번 문 뒤에는 염소가 있고, 사회자가 그 문을 열어서 보여주었다”를 바탕으로 업데이트 한 결과, 각 문뒤에 스포츠카가 있을 확률이 변했기 때문입니다.
(자세한 풀이는 몬티홀 문제 참고)

R을 사용한 나이브 베이지언 분류 (Bayes Classification in R)

R에는 베이지언 분류 모델을 지원해 주는 e1071, STAN같은 다양한 패키지가 있습니다. 오늘 포스팅에서는 그 중 가장 자주 사용되는 David Meyer의 e1071 패키지를 사용해 보겠습니다. 데이터셋은 지난 포스팅인 R을 사용한 의사결정나무 분석에서 사용한 심장병 환자 데이터를 사용하겠습니다.

우선 패키지를 설치하고, 데이터셋을 불러와 보겠습니다.

Heart 데이터는 흉부외과 환자 303명을 관찰한 데이터입니다. 각 환자의 나이, 성별, 검진 정보 컬럼 13개와 마지막 AHD 칼럼에 각 환자들이 심장병이 있는지 여부가 기록되어 있습니다. 

이제 데이터셋을 학습을 위한 train 셋과 test셋으로 구분해 보겠습니다.

이제 e1071패키지의 naiveBayes 함수를 사용해서 베이지언 분류 모델을 만들어 보겠습니다.

모델 객체를 호출할 경우 사전 확률과, 각 변수에서 관측된 결과에 따른 (여기서는 심장병 여부가 기록된 AHD)에 대한 사후 확률을 확인할 수 있습니다.

모델의 성능은 결국 이 모델이 새로 접하는 데이터 셋을 얼마나 잘 예측해 내는지 여부입니다. 준비해 둔 test 데이터셋을 예측하라고 명령하고 결과를 확인해 볼까요?

예측 정확도는 85.5%로 보이네요.

예전 포스팅인 R을 사용한 의사결정나무에서 확인했던 의사결정나무 분류 방법의 정확도가 76.6~84.4% 사이였던 것과 비교하면 약 1% 정도 정확성이 향상되었다고 볼 수 있겠습니다.  물론 사용하는 데이터셋, 변수에 따라 모델의 예측 정확도는 변할 수 있지만요.

마치며

미국 대선 결과를 정확히 예측하며 주목을 받았던 네이트 실버의 “신호와 소음”에서는 세상에는 신호를 가리는 수많은 소음이 있기 때문에 모든 예측 모델은 불확실성을 가지고 있으며, 베이지언 확률 모델은 이러한 불확실성을 줄이는 좋은 도구라고 이야기 합니다.

객관성을 중시했던 피셔의 빈도주의 확률론에 대세를 내어 주기는 했지만, 다양한 변수를 고려해야 하는, 게다가 그 변수가 시시각각 변하기 까지 한다면 베이지언 확률 모델에 기반한 예측 모델의 중요성도 더 커지리라라고 봅니다.

이 포스팅이 R과 베이즈 추론에 관심이 있는 많은 분들에게 도움이 되길 바랍니다.

 

참고 자료

1) https://xkcd.com/1282/

2) 위키피디아, 나이브 베이즈 분류

3) 위키피디아, 몬티홀 문제

4) R-bloggers, R and Bayesian Statistics

5) Sumsar.net, Three Ways to Run Bayesian Models in R

6) Cran.r-project, e1071