본문 바로가기
머신러닝

머신러닝 - Naive Bayes Classifier(분류) 정리

by Tiabet 2023. 6. 17.

 

 

 

 

이번 포스팅에선 Naive Bayes, 나이브 베이즈 분류의 이론적인 면에 대해서 정리해보고자 한다. 참고한 자료는 수업시간에 배운 내용인데, 출처는 아래 책이다.

https://www.wiley.com/en-br/Data+Mining+for+Business+Analytics:+Concepts,+Techniques+and+Applications+in+Python-p-9781119549840 

 

코드와 이미지 또한 출처가 명시되어 있지 않다면 책에서 제공하는 파이썬 코드를 사용했음을 명시한다.

Bayes 확률론

베이즈 정리는 고등학교 수학 시간에 조건부 확률을 배우면서 등장하는 이론이다. 수학자 베이즈가 정리한 이론이어서 이러한 이름이 붙었다. 워낙 유명해서 자세한 설명은 건너뛰고, Posterior 와 Prior 의 개념만 짚고 넘어가고 싶다. Posterior는 우리말로 사후 확률, Prior는 사전 확률을 의미한다. Bayes 확률론으로 어떤 데이터에 대해 분류를 실행하고 싶다면, 우선 데이터셋의 predictor들이 모두 categorical한 값인지 확인해주어야 한다. Numerical 한 변수들은 반드시 Data Binning 이란 작업을 거쳐서 categorical 하게 바꿔줘야 한다. Numerical 한 변수들을 확률로 처리하기가 불가능하기 때문이다.

출처 : https://www.youtube.com/watch?v=wJgto87zEEs&ab_channel=Coder%27sDigest

 

Bayes 확률론으로 Classifier를 만들 때 생기는 문제

다음과 같은 데이터셋에서 Bayes 확률론을 통해 classifier를 만든다고 가정해보자. 

 

delays_df = dmba.load_data('FlightDelays.csv')
delays_df.head()

현재는 variable이 반응 변수인 Flight Status를 제외하면 12개 정도가 된다. 이 중에서 유의미한 Predictor는 총 5개, 'DAY_WEEK', 'CRS_DEP_TIME', 'ORIGIN', 'DEST', 'CARRIER' 를 꼽을 수가 있다. 이 데이터셋을 Bayes 확률 정리를 통해 classifier를 만들었다고 가정하자. 이제 새로운 데이터셋 혹은 테스트셋으로 이 분류기를 테스트해보려고 한다. 그런데, Predictor의 순서대로 "11, 1540, IAD, JFK, OH" 를 분류하려는 순간, 이 5개 조건과 똑같은 데이터가 존재하지 않음을 발견했다. 조건부 확률을 따지는 베이즈 확률론의 특성상, 새로운 데이터가 갖고 있는 데이터셋에 일치하는 데이터가 없다면, Flight Status가 ontime 일지 delayed 일지 그 확률을 알려줄 수가 없다.

 

위 데이터셋에선 Predictor로 5개만 사용했지만, 만약 10개, 100개를 사용한다면? 그 수가 커지면 커질수록 정확하게 일치하는 경우를 찾기 힘들 것이다.

 

따라서 일반적인 Bayes 확률론이 아닌, Naive Bayes 확률론을 통하여 Classifier를 만드는 것이다. 그리고 일반적인 Bayes 확률론은 Exact Bayes 라고 부른다.

 

Naive Bayes 확률론과 Classifier

Naive Bayes 확률론을 설명하기 전, 아주 중요한 가정이 하나 있다. 바로 모든 Predictor 들은 서로 독립이어야 한다는 점이다. 서로 독립이 아니라면 선형 회귀의 Co-linearity, 즉 공분산성이 있을 때 성능 저하가 나타나는 것과 똑같은 안 좋은 현상이 나타날 수 있다.

 

그러면 이제 Naive Bayes 확률론이 무엇인지 살펴보자. 그 이름에서 짐작할 수 있듯, Naive Bayes는 대략적으로 그 결과를 추론한다는 점에서 Exact Bayes와 차이가 있다. 정확하게 Naive Bayes를 설명하려면 그 기초가 되는 단계별로 하나하나 짚고 넘어가는 것이 좋을 것 같다.

 

 

1단계

이미 갖고 있는 데이터셋 $(x_{i}, c_{i} ), i=1, …, n$ 에서 새로운 데이터가 하나 들어왔다고 가정하자. 그 데이터의 확률을 추론하기 위해 아래와 같은 Bayes 적인 접근을 시도할 수 있다.

 

여기서 MAP은 Maximum a Posterior를 의미하는고, $c$는 반응 변수, $x$는 설명변수, $C$는 반응 변수의 가능한 경우 집합이다. $MAP$ 은 Maximum a Posterior의 약자로, 새로운 데이터셋이 많은 반응변수 (위 예제에선 Ontime과 Delayed 2 개) 중 각각의 반응변수로 분류될 확률을 구한 뒤, 그 중 최대로 새로운 데이터를 분류한다는 의미에서  $c_{MAP}$ 개념을 사용한 것이다. 당연히 Posterior가 가장 큰 쪽으로 분류해야할 것이다. (Ontime의 Posterior가 70%, Delayed가 30% 로 계산된다면 당연히 Ontime으로 분류해야함)

 

 $P(c_{j} | x_{1}, x_{2}, ... , x_{n})$ 이 $P(x_{1}, x_{2}, ... , x_{n} | c_{j} )P(c_{j})$ 로 변환되는 과정을 살펴보자. $P(x_{1}, x_{2}, ... , x_{n})$ 는 Prior, 즉 이미 갖고 있는 데이터셋으로 정확히 몇 인지 알고 있는 고정된 값이기 때문에 argmax, 최댓값을 고르는 함수 안에선 제거해도 된다. 

 

따라서 어떤 새로운 데이터를 분류할 때, 우리가 고려해야 하는 것은 $P(x_{1}, x_{2}, ... , x_{n} | c_{j} )P(c_{j})$ 라고 정리 가능하다.

 

2단계

1단계에서 Naive Bayes 의 가장 중요한 가정이 모든 Predictor들은 상호 독립어야 한다는 점을 짚고 넘어갔다. 여기서 독립인 점이 중요한 이유가 나온다. $x$ 들이 서로 독립이라면 $P(x_{1}, x_{2}, ... , x_{n} | c_{j} )$ 는 $P(x_{1} | c_{j})$, $P(x_{2} | c_{j})$, ... , $P(x_{n} | c_{j})$ 의 곱으로 변환이 가능하다! 최종적으로, $argmax P(c_{j} | x_{1}, x_{2}, ... , x_{n})$ 는 $argmax P(c_{j})\prod_{i}P(x_{i}|c_{j})$ 로 변환이 가능하다.  $P(c_{j})\prod_{i}P(x_{i}|c_{j})$ 에 대해서 모든 확률을 계산한 뒤, 가장 확률이 높은 반응 변수로 새로운 데이터셋을 분류할 수 있을 것이다.

 

핵심은, Exact Bayes와는 다르게 $P(x_{i}|c_{j})$ 들만 구해주면 되기 때문에 Predictor가 아무리 늘어나도 확률을 구해낼 수 있다는 점이다.

 

예제

짧은 예제 하나를 살펴보고 마치려 한다. 위와 같은 상황에서, $P(fraud | charges=y, size=small)$ 를 구하고 싶다고 하자. Exact Bayes 를 사용하면, $charges=y, size=small$ 인 상황이 단 2가지밖에 없고, 이때 한 가지는 Outcome이 truthful, 다른 하나는 fraud로 나오기 때문에 구하고자 하는 확률 $P(fraud | charges=y, size=small)$은 0.5가 된다.

 

이번엔 Naive Bayes를 사용해서 확률을 구해보자. $P(c_{j})\prod_{i}P(x_{i}|c_{j})$ 에서, $P(truthful) = 6/10, P(size=small | truthful) = 4/6, P(charges = y | truthful)$ = 1/6 $이 된다. 따라서 $c_{truthful} = 6/10 * 4/6 * 1/6 = 0.067$ 이라는 결론을 얻을 수 있다. 마찬가지로 $P(fraud) = 4/10, P(size=small | fraud) = 1/4, P(charges = y | fraud) = 3/4$ 로 구할 수 있고, $c_{fraud} = 4/10 * 3/4 * 1/4 = 0.075$ 가 된다.

 

따라서 최종적으로 $P(fraud | charges = y, size = small) = 0.075/(0.075+0.067) = 0.53$ 이라고 구할 수 있다.

 

이렇게 Naive Bayes를 이용해 계산상의 이점, 그리고 Predictor가 늘어날수록 Exact Bayes 에 비해 갖는 이점에 대해 알아보았다. 나중에 기회가 된다면 파이썬 코드로 직접 Naive Bayes Classifier를 사용해보려고 한다.