jc.jang

나를 괴롭히는 Naive Bayes 정리 본문

카테고리 없음

나를 괴롭히는 Naive Bayes 정리

jangstory 2018. 7. 4. 17:23

Naive Bayes를 이용해서 Classifier를 구현하는 중 이론 정리를 해야겠다는 생각이 들어서 글을 쓰게 되었다.


목표: Naive Bayes 이해


많은 Classifier가 있는데 그 중 Naive Bayes Classifier를 이해한다..

참고 https://www.youtube.com/watch?v=ndvZKwZw5tQ



X데이터가 들어오면, 그것이 빨간색에 속하는지, 초록색에 속하는지 분류하는 확률 함수를 생각해본다.

위의 그래프에서 Y축은 확률이고, X축은 데이터이다. X값이 0에 가까운 데이터가 들어오면 Y가 초록색이라고 분류할 것이고. X값이 큰 데이터가 들어오면 Y가 빨간색이라고 분류할 것이다.

P(Y=y | X)는 X라는 조건이 주어졌을 때, 어떤 Y인지 뜻하는 것이다. 조건부 확률.


우리의 목표는 f*을 optimal하게 만드는 것이다.

즉 f* = argmin_f P(f(x) != Y) 를 만족하게 하는 것이다.


f*는 우리의 optimal 함수이다. P(f(x) != Y)가 의미 하는 것은 x라는 데이터로 예측한 결과 f(x)와 정답인 Y의 차이를 말한다. 이것을 argmin하면 흔히 말하는 오차를 줄인다는 말이다.

즉, x라는 데이터가 주어졌을 때, 예측한 y값과 실제 Y값과의 차이를 줄이는 것이 목표이다.


이것을 다르게 표현하면

f(x)* = argmax_Y=y P(Y=y | X=x)로 표현이 가능하다. x가 주어졌을 때 출력한 y값이 Y와 비슷한 정도가 크도록, 해주는 것으로도 생각할 수 있다.



위의 그래프를 보면 X축에 중앙에 Xm이 있다. 이 Xm을 기준으로 X가 왼쪽이면 초록색, 오른쪽이면 빨간색이라고 예측할 것이다.

그래프에서 점선과 실선은 확률 분포인데, 둘 중 어떤 것이 더 좋을지 생각해보자.


우선 실선이 더 좋다. 왜냐하면 


첫 번째, Xm 옆에 있는 Xn데이터를 보자.

Xn 데이터가 주어졌을 때 우리는 초록색이라고 예측할 것이다. 근데 이때 error를 생각해보자.

확률의 합은 항상 1이기 때문에 P(Y=초록색 | x) + P(Y=빨간색 | x) = 1이다.

따라서 둘 중 큰 쪽을 선택하기 때문에 error는 항상 1에서 나머지를 뺀 값이 된다.

실선에서 Xn을 예측했을 때, 초록색이 나오고 그 때 error는 P2가 나온다. (빨간 동그라미)

점선에서 Xn을 예측했을 때, 초록색이 나오고 그 때 error는 P2보다 높게 나온다 (빨간 네모칸)

즉, 실선 일 때 error가 더 작다는 것을 의미한다.


두 번째,

데이터가 Xm에 가까워 질 수록 점선은 선형이라서 빨간색일 확률과 초록색일 확률의 차이가 적지만,

실선은 비선형이라서 그 차이가 더 크게 나타난다.

Xm 근처에서 차이가 더 크게 나타나기 때문에 조금 더 명확하게 예측이 가능하다.

그리고 그래프에서 보면 밑에 색칠된 부분 베이지색으로 색칠된 부분이 error이다.

내가 어떤 점 Xi에서 P(Y=초록 | x)일 확률이 0.75가 나왔다면 P(Y = 빨강 | x)일 확률은 error가 된다. 이때 에러는 0.25이고

1-P(Y=초록 | x)로 표현이 가능하다. 베이지색으로 색칠 된 부분도 그 영역을 의미한다.



그럼 다시 수식으로 돌아와서

우리의 목표는 다음과 같다.

f*(x)  = argmax_Y=y P(Y=y|X=x) 

P(Y=y|X=x)는 bayes 정리를 이용해서 다시 쓸 수 있다.



P(Y=y|X=x) = P(X=x|Y=y) * P(Y=y)

이게 좋은점은 우리가 바로 못 구하는 확률을 이미 알고 있는 것을 이용해서 구할 수 있다는 것이다.

이게 무슨말인지 이해하기 위해 수학 문제를 몇개 풀어봤다.


쿠키 문제

쿠키가 들어 있는 그릇 두개가 있다.

첫번째 그릇에는 바닐라 쿠키 30개, 초콜렛 쿠키 10개가 있다.

두번째 그릇에는 바닐라 쿠키 20개, 초콜렛 쿠키 20개가 있다.


어떤 그릇인지 보지 않고 한 그릇에서 임의로 쿠키를 집었는데 바닐라 쿠키였다고 한다.

그렇다면 이 때 '이 바닐라 쿠키가 그릇 1에서 나왔을 가능성'은 얼마인가?


다음과 같이 용어를 정의한다.


P(H=1) : 그릇 1을 골랐을 확률

P(V) : 바닐라 쿠키를 골랐을 확률


그럼 우리가 구하고자 하는 것은 P(H=1 |V)이다.

이것은 

P(H=1)*P(V |H=1)

P(H=1 |V) = --------------------

       P(V)

으로 표현 가능하다.


P(H=1) = 1/2 , 그릇 두개중 첫번째 그릇을 고를 확률

P(V| H=1) = 3/4, 첫번째그릇을 골랐을 때 바닐라 쿠키를 고를 확률, (40개의 쿠키중 30개를 고를 확률이므로)

P(v) = 5/8,바닐라 쿠키를 고를 확률, (전체 80개의 쿠키중 첫번째 그릇에 30개, 2번째 그릇에 20개 총 50개의 바닐라 쿠키를 고를 확률이므로 50/80)


이렇게 우리는 우리가 이미 알고있는 것으로 우리가 원하는 것을 구할 수 있다.


P(H=1)*P(V |H=1)

P(H=1 |V) = --------------------

       P(V)


미리 말하자면 P(V)를 evidence (그릇에 상관없이 바닐라가 나올 확률 / H에 상관없음)

P(H=1)를 prior probability 사전 확률(x에 상관없음)

P(V|H=1)를 likelihood라고 한다.



우리는 bayes 이론 덕분에 우리가 알고 있는 것을 이용해 모르는 값을 구할 수 있게 되었다.



우리의 목표인


f*(x)  = argmax_Y=y P(Y=y|X=x) 이것을

P(Y=y|X=x) = P(X=x|Y=y) * P(Y=y)로 바꾼다.

그런데, 여기서 문제가 생겼다. 위의 표 처럼 고려해야 할 x가 너무 많다는 것이다.

Sky, temp, Humid, 등등 고려해야할 feature가 있는데 이에 따라 P(X=x|Y=y) , P(Y=y)를 계산할 때 생기는 문제에 대해 알아보자.


우선 P(Y=y)는 쉽다. x에 관계 없이 모든 y에대해 구해주면 된다. 여기서는 EnjoySpt 전체가 4개, yes가 3개 이므로 3/4이 된다.

이렇게 하나만 구하면 나머지하나는 1-3/4으로 1/4인 것을 알 수 있다.

그래서 클래스 갯수가 k개 일 때 k-1번만 계산하면 된다.

문제는 P(X=x|Y=y)이다. 고려해야할 대상이 Sky 하나만 있을 때 경우의수는 2가지이다.


Sky, Temp가 있을 때는 경우의 수가 3가지이다. 


sunny warm

sunny cold

rainy warm


rainy cold는 1 - 이미 위에서 구한 3개의 확률 로 계산하면 된다.


이렇게 feature가 d개이면 2^d -1 개를 계산해야하고 (2의 제곱인 경우는 아마 feature도 확률로 생각해서 맞다 아니다 식으로 계산하기 때문인것같다.)

그때 EnjoySpt가 가능한지 안한지도 곱해줘야한다.

그래서 (2^d-1)*k 가 된다.


2의 제곱 형식으로 증가하기 때문에 상당히 계산량이 많아져서 좋지 않다.

그럼 이제 어떻게 해야할까?

데이터를 표현하는 d(dimension)를 줄여 볼까? Sky 정보 빼고, Temp 정보 빼고... 그렇게 해야할까?

근데 어렵게 구한 데이터에서 d를 빼고 싶지는 않을 것이다.

그래서 우리는 Conditional Independence라는 가정을 한다.


여러 X feature(Sky, Temp 등)들이 있는데, 이것들이 모두 독립적이라고 가정하는 것이다. 확률에서 독립이라고 하면 P(X,Y) = P(X)*P(Y)를 의미한다.

그런데 실제로 독립적일까?


혹시 여자친구 있으세요?

여자친구의 유무는 키, 몸무게, 피시방 방문 빈도수에 비례한다고 가정해보자.

근데 피시방에 자주 가면 컵라면을 먹어서 몸무게가 증가하는 상관관계가 있다.

하지만 우리는 순진하게 상관관계가 없다고 가정한다.


순진하게. Naive하게.


ex)

P(Thunder | Rain, Lightning) = P(Thunder | Lightning)


비가내리고 번개(Lightning)가 칠 때 천둥이 칠 확률은

번개가 칠 때 천둥이 칠 확률과 같다면


천둥과 비가오는 것은 conditional independence하다.


이제 우리는 모든 x feature들 끼리는 독립이라고 가정하자.



저기 식에 보면 ㅠ P(Xi= xi | Y =y) 이렇게 되있는데 이건 확률 곱을 의미한다. 즉



이 확률을 P(X1=sunny |Y=y) * P(X2 = warm | Y=y) * ... P(X6=same | Y=y)로 나타낸 것이다.

이렇게 계산량이 줄어든다.

feature의 갯수를 d라고 하고 d가 2가지 경우만 존재할 때, x1이 sunny일 확률을 구하고, x2가 warm일 확률을 구하고 등등...

을 하면 총 d번 연산을 하면 된다. 여기에 Y가 yes인지, no인지 Y의 클래스 갯수 k를 곱해주면 되므로 계산량은

dk로 줄어든다. 그림에서 (2-1)dk라고 표현한 이유는 x1에서 d가 sunny, rainy처럼 2가지 가 존재하는데 한가지만 구하면 나머지 확률은 1-이미 알고 있는 것을 하면 되므로 (2-1)이라고 했다.

그림에서 보면 물결표시가 있는데 어느정도 오차가 있다는 말이다. 당연히 conditional independence를 만족하지 않은데 만족한다고 가정했기 때문이다. 



Comments