기계학습/Intro to ML in Udacity

Naive Bayes (22/43) -> (43/43)

내꿈은자동화 2017. 3. 30. 21:58

이번 강의에서는 Bayes Rule 부터 시작해서 Naive Bayes 까지를 다룬다.



Bayes Rule 은 Thomas Bayes 에 의해 고안되었다. 처음 이 법칙은 신이 있음을 증명하기 위해 만들어졌는데 이후 통계뿐 아니라 많은 분야에서 사용되고 있다.


Bayes Rule 은 $P(A|B) = \frac{P(B|A)*P(A)}{P(B)}$ 이다.

(여기서 $P(A|B)$ 는 조건부 확률이라 하며 B 가 일어났다고 할 때 A 가 일어날 확률이다. 예를 들어 A 가 암에 걸릴 확률이고 B 가 남자일 확률이면 $P(A|B)$ 는 남자인 사람 중에 암에 걸릴 확률을 뜻한다.)

Bayes Rule 의 경우 $P(A|B)$ 와 $P(B|A)$ 중 직관적 혹은 쉽게 구할 수 없는 것을 다른 것을 통해서 쉽게 구할 수 있게 해주는 것이다.


Bayes Rule 를 <암> 에 대한 예를 통해 알아보자.


$P(C) = 0.01$ 를 도시에서의 암 환자의 비율이라 하자. 이 때 <Sensitivity> 와 <Spec> 에 대해 알아봐야 한다.

암 환자를 진단했을 때 양성 판정이 날 확률을 <Sensitivity> 라 하고 암에 걸리지 않은 사람을 진단했을 때 음성 판정이 날 확률을 <Spec> 이라 한다.


<그림 1> 도시에서 사람들이 암에 걸릴 확률


그리고 확률들을 Prior, Joint, Normalizer, Posterior 로 나누어 보아야 한다. 먼저 각각을 나타낸 후 설명하겠다.

Prior 의 경우 $P(C) {= P(Pos|C) + P(Neg|C)}, P(~C), P(Pos|C), P(Pos|~C)$ 이다.

Joint 는 $P(C,Pos) = P(C) * P(Pos|C), P(~C|Pos) = P(~C) * P(Pos|~C)$

Normalizer 은 $P(Pos) = P(C,Pos) + P(~C,Pos)$

Posterior 은 $P(C|Pos), P(~C|Pos)$ 이다.


위 경우 우리가 알고자 하는 것은 <양성 반응이 나왔을 때 실제로 암에 걸렸을 확률> 이다.

반대로 <암에 걸렸을 때 양성 반응일 확률> 은 <Sensitivity> 를 설명하며 알아보았고 쉽게 알 수 있는 확률이다.


<그림 2> 암으로 알아보는 Bayes Rule


<그림 2> 에 Prior 을 이용하여 Posterior 을 구하는 과정을 나타내었다.

(실제로 해보면 이해하기 쉬울 것이다.)


여기까지가 암에 대한 예시이다.


다음으로 문자 학습 (Text Learning) 에 대해 알아본다.


<그림 3> 철수와 영희의 문자학습 (철수와 영희가 말을 쓸 확률 $P(철수) = P(영희) = 0.5$)


Bayes Rule 를 이용해서 특정 단어가 나왔을 때 누가 사용했는지 알 수 있다. 

<Love Life> 라고 했을 때 누가 말했을 확률이 더 놓을까?

철수가 말했을 확률은 $0.5*0.5*0.3$, 영희가 말했을 확률은 $0.5*0.1*0.1$ 로 철수가 말했을 확률이 더 높다.


앞의 암 예제와 같은 방식으로 여러 경우를 생각해 볼 수 있다.


이러한 Bayes Rule 을 이용한 방법을 Naive Bayes 라 한다.

Naive Bayes 는 <무슨 단어가 나올지>, <단어가 몇 개가 나올지> 에 관해서는 알 수 있으나 <단어의 위치> 는 알 수 없다.

이름 앞에 Naive (순진한) 이 들어간 이유는 바로 이 때문이다.


Naive Bayes 는 문제점이 존재하지만 쓰기 쉽기 때문에 자주 사용된다.

(구글에서 Naive Bayes 를 사용하다 발생한 문제 중 하나는 <Chicago Bulls> 를 검색할 때 야구팀이 나오지 않고 <Chicago> 와 <Bull> 이 따로 나오는 것이다. 이 문제점은 관계없는 단어끼리 붙을 때 잘 연결되지 않는다는 것이다.)


**    강의에서 Katie malone 이 강조한 말은 Naive Bayes 를 Black Box 라 생각하지 말고 안을 파헤쳐 보자는 것이다.


**    Mini Project

이번 장에서 할 프로젝트는 단어를 학습시키고 누가 이 단어를 사용했나 알아보는 것이다.

강의에 필요한 프로그램은 Udacity 내 Git 저장소의 것을 클론해오면 된다.

Tool 폴더 내 StartUp 을 이용하여 컴퓨터에 설치되어있지 않은 라이브러리들을 추가한다. (글쓴이의 경우 아나콘다를 이용하여 설치했기 때문에 이 과정을 건너뛰었다.)


그리고 nb_author_id.py 파일 내 아래와 같이 추가한다.

from sklearn.naive_bayes import GaussianNB    # Gaussian NB class 추가

clf = GaussianNB()    #    Classifier 추가
t0 = time()           #    연산 시간 체크
clf.fit(features_train, labels_train)    #    fitting (Training)
print "training time:", round(time()-t0, 3), "s"    #    연산 시간 체크
t1= time()
pred = clf.predict(features_test)    #    예측값 입력
print "training time:", round(time()-t1, 3), "s"
print clf.score(features_test, labels_test)    #    예측값과

<코드 1> nb_author_id.py


단어 학습의 경우 해리포터 작가인 J.K. Rowling 이 다른 필명으로 출판한 책을 그녀의 책이라 주장한 것이 대표적이다.



이번 글에서는 Naive Bayes 까지 알아보았고, 다음 강의에서 SVM (Support Vector Machine) 에 대해 알아볼 것이다.




<참고 문헌>

1. Intro to ML in Udacity


<그림>


<코드>