Naive Bayes Classification을 공부해보자. 이 포스팅의 초점은 왜 Naive이고 왜 Bayes인지 아는 것이다. 우선 Bayes는 Bayes Rule의 Bayes이다. Bayes Rule은 우리가 고등학교 때 배웠던 조건부 확률(conditional probability)와 관련이 있는 원리이다. 우선 conditional probability에 대해서 먼저 공부해보도록 하자.


특별한 경우를 가정한(조건부) 확률을 구하는 것이 conditional probability이다. 다른 말로 말하면, 두 개 이상의 Case에 대하여 어떤 Case가 정해졌을 때, 나머지들의 확률을 물어보는 것이다. 예를 들어,  아래의 날씨 data를 봐보자. 이 data 역시 매우 유명한 data이다. 


위의 data에서 play가 yes일 때, outlook이 sunny일 확률은 얼마일까? 그냥 세서 나누면 된다. 우선 play=yes인 경우가 총 9개 있고, 그 중 outlook=sunny인 경우는 2개니까, 2/9가 답이다. 아주 쉽다. 그런데 이것을 conditional probability를 이용하면 아래와 같은 공식으로도 풀수 있다. 


이제 Bayes Rule을 설명해보자. Bayes Rule은 우선 아래와 같다.


B일 때, A가 일어날 확률은 P(B|A)와 P(A)와 P(B)를 구하면 알 수 있다는 뜻이다. 위의 날씨 data를 보자. play가 우리가 예측을 해야하는 class attribute이라고 해보자. 우리는 위에서 P(outlook=sunny|play=yes)는 쉽게 구할 수 있었다. 그런데 P(play=yes|outlook=sunny)는 무엇일까? Bayes Rule을 이용하면 아래와 같이 구할 수 있다.


우리는 위의 날씨 data에서 outlook, temperature, humidity, windy와 같은 attribute을 가지고 있다. 모두다 nominal value들이므로 아래의 확률들을 쉽게 구할 수 있다.


P(outlook=sunny|play=yes)

P(temperature=hot|play=yes)

P(humidity=high|play=yes)

P(windy=true|play=yes)


위의 값을 구했다면 아래의 값도 구할 수 있다.


P(play=yes|outlook=sunny)

P(play=yes|temperature=hot)

P(play=yes|humidity=high)

P(play=yes|windy=true)


이 말은 날씨 data가 아래와 같이 주어졌을 때,


sunny,hot,high,true,??


class attribute이 yes일 확률과 no일 확률을 구하여 비교한 후, 더 큰 확률로 예측하겠다는 것이다. 아래의 확률표를 보고 계산을 해보자.


class attribute=yes 일 때, 


class attribute=no 일 때,


p(play=yes|sunny and hot and high and true) < p(play=no|sunny and hot and high and true) 라는 것을 알 수 있다. 그런데 위의 식에서 하나 이상한 것이 있다. 


이것이 사실인가? 아니다. 사실은 위의 식은 틀린 것이다. 각각의 사건, 즉 outlook, temperature, humidity, windy가 각각 독립이라면,(서로 영향을 안 주는 사건) 위의 경우가 맞다. 그런데 사실 그렇지 않다. 일반적으로 temperature가 높을수록 humidity도 높다. 그래서 Naive라는 단어를 붙인 것이다. Naive하다. 즉 뭔가 어설프고 미숙하고 막 그렇다는 것이다. 그런데 이렇게 하더라도 실제로는 너무 너무 좋은 결과를 내놓더라. 그래서 그냥 쓰는 것이다.


자 여기서 질문, 만일 Numeric data가 나오면 어떻게 해야할까? 당황하지 말고, 우리는 정규분포를 이용해서 확률을 구하면 된다. 정규분포 그래프와 식은 아래와 같다.


위의 식만 있으면 numeric data에 대해서도 확률을 구해낼 수 가 있다. 아래와 같이 날씨 data를 추가해보자.


temperature=70일 경우에는 어떻게 확률이 계산되는지 확인해보자. play=yes일 경우에는 temperature numeric의 average와 standard deviation은 79.11111111, 10.21572861이므로, 공식에 집어넣으면 0.0262370186193가 나온다. 같은 방법으로 play=no일 경우에는 temperature numeric의 average와 standard deviation은 86.2와 9.731392501이므로, 공식에 집어넣으면 0.0102555691137가 나온다. play=yes일 확률이 더 높게 나온다.


Naive Bayes Classification에 대해서 전부 이야기를 해봤다. 자 그럼 이제 실제 구현을 통해 테스트를 해보자. 우선 classification이니까 training set과 test set으로 나누어야 한다. 67:33 비율로 나눠보자. 우리가 위에서 설명한 부분은 model building 과정이므로 당연히 training set에만 적용시키는 것이다. 그러면 아래와 같은 모델이 나온다.


이제 test set을 보자. 첫 번째 row는 아래와 같다.

'rainy', '68', 'cool', '80', 'normal', 'FALSE', 'yes'


이를 yes model과 no model에 적용을 시키면 아래와 같이 확률을 얻을 수 있다. 


yes가 더 크다. 따라서 yes로 예측을 한다. 그런데 이 값은 실제로 yes이므로 예측이 맞다고 볼 수 있다. 이와 같이 모든 test set에 대해서 수행을 하면 accuracy를 얻을 수 있다. data 개수가 14개 밖에 안 되니까 좀 별로다. 데이터를 크게 키워보자. 훨씬 더 안정적이다. 2551개의 data로 실행한 결과이다.

읽으면서 느꼈을 것이다. 오늘은 조금 계산이 많네? 그렇다 많다. 포스팅하는데도 3시간이나 걸렸다. 계산 결과가 조금 틀릴 수도 있다. 그런데 식은 맞을 것이다!! 그러니 계산결과에 너무 집착하지 마시고 식을 잘 이해하시길 바란다.


아우 힘들다. 다음 포스팅은 Decision Tree에 대해서 포스팅하려고 한다.

'Data Mining' 카테고리의 다른 글

[Data Mining] Support Vector Machine  (4) 2015.12.25
[Data Mining] Decision Tree  (4) 2015.12.24
[Data Mining] Measuring a classification model  (0) 2015.12.21
[Data Mining] kNN Classification  (0) 2015.12.21
[Data Mining] Logistic Regression  (3) 2015.12.20
Posted by 빛나유
,