참고문헌 Show
Naive Bayes Classifier from Scratch<목차>
1.Naive Bayes Classifer란?1.1 Naive Bayes Classifer 원리나이브 베이즈 분류기를 간단히 이야기하면 '베이즈 정리를 활용한 분류기'이다. 텍스트 분류나, multi class분류에 쓰인다. 왜 나이브인가? 에 대한 답은 뒤에서 다루겠다. 나이브 베이즈 분류기의 원리를 예를 들어 설명해보겠다. 예) class(c) : spam/ham , : 단어 가 메일에 등장하는가: 단어 '당첨'이 메일에 등장하는가 1) '당첨'이라는 단어가 나올 때 spam일 확률() 을 알고 싶다고 하면,
이 세가지와 베이즈 정리를 통해 p(c|x)를 구할 수 있다. 2) 하지만 내가 단순히 '당첨'이라는 단어가 나올때 spam인지 ham인지 "분류"하고 싶은 것이라면, 를 계산하지 않고 만 계산해도 된다. 즉, 과 둘 중 어느 것이 더 큰지만 알고 싶으면, 상단의 식에서 분모 가 동일하므로 를 고려하지 않아도 된다. 3) 우선 구현할 때는 를 살려서 를 구해보겠다...(1)번 1.2 왜 "Naive" 인가? : Conditional Independence나이브 베이즈 분류기는 강력한 가정을 가지고 있는데, 앞의 예를 들면, 이 스팸 메일에서 '당첨'이란 단어가 나왔다는 사실이, 같은 스팸 메일에서 '로또'란 단어가 나올 것인지에 대해 아무 정보도 주지 않는다는 것이다. : 단어 '당첨'이 메일에 등장하는가 : 단어 '로또'가 메일에 등장하는가 즉, 이란 가정을 가진다. 이러한 가정 때문에 "Naive"하다고 이름이 붙여졌다.(이런 naive한 가정에도 불구하고 나름 잘 작동한다고 함) 이를 일반화하면, 일 때, by NAIVE assumption 1.3 Naive Bayes Classifier의 장점과 단점장점: - class를 쉽고 빠르게 예측한다. - 가정한 독립성이 충족되는 경우 분류기가 더 좋은 성능을 보인다. - 연속형 예측 변수보다, 범주형 예측 변수일 경우에 더 좋은 성능을 보인다. 단점: - zero frequency : 만약 training data set 중 스팸 메일에서 '당첨'이라는 단어가 없었다면, 분류기는 항상 으로 취급하여 '당첨'이라는 단어가 들어가면 무조건 스팸이 아니라고 분류해버린다. 이것을 'Zero Frequency'라고 부르는데, 이것을 해결하는 방법이 'Laplace Smoothing'이다.바로 뒤에서 다루도록 하겠다. - 분류기에서 보여주는 클래스에 대한 확률은 크게 믿을만하지 못하니 분류 결과만 보는게 낫다. (estimation 좋지 않음) - independence에 대한 가정이 비현실적이다. 1.4 Laplace Smoothingp(x|c) 를 계산할 때 분모와 분자에 임의의 상수 k를 더하는 것이다. 기존에 였다면 Laplace Smoothing은 '당첨'이라는 단어가 들어간 2k개의 메일을 추가적으로 봤다면 k개 스팸 메일, k개의 스팸이 아닌 메일을 봤다고 생각하면 된다. k=1 또는 0.5를 주로 쓴다, 예를 들어 = 0 / 98 이었다면 k=1일 때 1 + 0 / 2 + 98 = 1/100 = 0.01이다. 1.5 underflow 방지하는 법underflow란 산술연산의 결과가 컴퓨터가 취급할 수 있는 수의 범위 보다 작아지는 현상을 말한다. 즉, 0에 너무 가까워져 컴퓨터가 표현할 수 있는 영역을 넘어서게 된다. 확률을 여러번 곱하는 과정에서 underflow가 생길 수 있다. 이를 방지하기 위해 exp와 log를 사용한다. 1.6 나올 수 있는 질문Q: 을 직접 구해도 되는데 왜 를 일일이 곱하나? A: 추정해야 하는 parameter의 개수가 기하급수적으로 증가하기 때문 만약 가 해당 단어가 나왔다(1), 나오지 않았다(0)로 두 가지 케이스이고 는 spam이다(1), 아니다(0) 두 가지 케이스라면 의 경우 개의 parameter를 필요로 한다. 반면, 는 의 parameter를 필요로 한다. x variable들의 개수가 늘어날 수록 개의 parameter를 추정하는 것은 어렵게 되므로 naive assumption을 적용하는 것이다. 2.1 Naive Bayes 확률 구해보기구현에 앞서, 쉬운 예로 직접 확률을 구해보자. class = 13기 준현이가 졸았다/ 안 졸았다 x = 세션주최팀이라고 하자. 다음 데이터는 준현이의 세션 주최팀별 졸았던 기록이다. 내가 알고 싶은 것은 만약 팀세션을 사이언스팀이 주최한다면, 13기 준현이는 졸 것인지!가 궁금한 것이다. (* 예시는 픽션입니다. ) 를 구하면 된다. 이므로 이 된다. 반대로 를 구해보면 약 0.4가 나온다. 즉, 만약 팀세션을 사이언스팀이 주최한다면, 13기 준현이는 (슬프게도) 졸 것이다라는 class가 나온다.. 여러분 집중 잘하고 있죠.?ㅎㅎㅎ 2.2 Naive Bayes 구현 with python맨 처음 설명했던 spam, ham인지 분류하는 데이터를 가지고 Naive Bayes Classifer를 만들어봅시다 데이터 셋 출처: https://www.kaggle.com/prafulbhoyar/spam-or-ham-using-nltk
2.2.1 데이터를 불러와서 tuple형태로 바꿔주기
2.2.2 train test split 이 책은 train test split도 구현해놓았다..
2.2.3 token 만들어주는 함수 정의 tokenization 은 간단히 문장을 단어로 쪼개는 것이라고 생각하면 된다.
2.2.4 word count 함수 정의 단어마다 스팸이었는지 아닌지 담아주는 역할을 한다. word : [spam_count, non_spam_count]
2.2.5 확률 계산하기 (word, prob_if_spam, prob_if_not_spam) prob_if_spam = = '당첨'단어가 들어간 메일 중 스팸의 개수 / 전체 스팸 메일 수 = word count 함수의 spam_count/ total_spams = word count 함수의 ham_count/ total_non_spams
2.2.6 확률 log 변환 log 변환에 앞서, 본 책에서 p(spam) = p(~spam) = 0.5라고 가정하여 함수를 짰기 때문에 수정필요 즉, 책에서는 에서 p(c)=p(~c)=0.5 로 가정했기 때문에, 를 이용해 함수를 짰다. 하지만 책과 다른 데이터를 구했으므로 p(c) 와 p(ㄱc)를 0.5라고 가정하기 어렵기에 p(c) 와 p(ㄱc)를 구하여 를 계산한다. p(c), p(~c) 구하기
2.2.7 Naive Bayes Classifier
2.2.8 Training
p(x)를 빼고 확률을 계산해도 잘 분류할까?
|