[ML] Naïve Bayes

김선형·2025년 9월 19일

ML

목록 보기
1/6

개요

Naïve Bayes는 nn개의 특성을 지닌 샘플 데이터 x\mathbf{x}가 주어졌을 때, 이 샘플 데이터가 KK개의 클래스 y1,y2,yky_1, y_2, \dots y_k 중 하나에 속할 확률을 결정한다. 즉, 각 클래스에 대해

P(ykx)=P(ykx1,x2,,xn)P\left(y_k|\mathbf{x}\right)=P\left(y_k|x_1,x_2,\dots,x_n\right)

을 계산하고, 위 확률값이 최대인 클래스를 샘플의 최종 클래스로 할당한다.

arg maxykP(ykx)=arg maxykP(xyk)P(yk)P(x)where P(xyk)=P(x1yk)×P(x2yk)××P(xnyk)\begin{aligned} \argmax\limits_{y_k} P\left(y_k|\mathbf{x}\right)&=\argmax\limits_{y_k} \frac{P\left(\mathbf{x}|y_k\right)P\left(y_k\right)}{P\left(\mathbf{x}\right)} \\ &\text{where } P\left(\mathbf{x}|y_k\right)=P\left(x_1|y_k\right)\times P\left(x_2|y_k\right)\times \cdots \times P\left(x_n|y_k\right) \end{aligned}

예시: Spam/Ham 이메일 예측

클래스별 확률 계산

스팸 메일을 S (Spam), 햄 메일을 NS (Not Spam)로 정의하고, 출현한 단어를 x1,,xnx_1, \dots, x_n이라 하면, 테스트 데이터의 이메일이 각 클래스에 속할 확률은 아래와 같다.

P(Sx1,x2,,xn)P(NSx1,x2,,xn)\begin{aligned} & P\left(S|x_1,x_2,\dots,x_n\right)\\ & P\left(NS|x_1,x_2,\dots,x_n\right) \end{aligned}
arg maxy{S,NS}P(yx1,x2,,xn)=arg maxy{S,NS}P(x1,x2,,xny)P(y)P(x1,x2,,xn)where P(x1,x2,,xnyk)=P(x1yk)×P(x2yk)××P(xnyk)\begin{aligned} \argmax\limits_{y \in \left\lbrace S, NS\right\rbrace} &P\left(y|x_1,x_2,\dots,x_n\right) =\argmax\limits_{y \in \left\lbrace S, NS\right\rbrace} \frac{P\left(x_1, x_2, \dots, x_n|y\right)P\left(y\right)}{P\left(x_1, x_2, \dots, x_n\right)}\\ &\text{where } P\left(x_1,x_2,\dots,x_n|y_k\right)=P\left(x_1|y_k\right)\times P\left(x_2|y_k\right)\times \cdots \times P\left(x_n|y_k\right) \end{aligned}

Smoothing

만약 P(xiyk)=0P\left(x_i|y_k\right)=0이라면, 즉 단어 하나가 해당 클래스에서 관측되지 않은 경우, 다른 단어의 Likelihood 값과 무관하게 P(xyk)P\left(\mathbf{x}|y_k\right)가 0이 된다. 따라서 Smoothing 기법을 적용하여 이를 방지한다.

Laplace Smoothing

모든 클래스에서 단어들이 한 번씩 출현했다고 가정한다. 단어의 종류가 nn개일 때, 각 단어가 해당 클래스에서 한 번씩은 등장했다는 가정에 따라, 단어 당 한 번씩 분모에 단어의 개수 nn을 더해준다.

✏️ 분모에도 1을 더하거나, 분모는 모든 단어에 대해 동일하므로 아무것도 더하지 않는 방법도 가능하다.

Log() 사용

P(xyk)=P(x1yk)×P(x2yk)××P(xnyk)P\left(\mathbf{x}|y_k\right)=P\left(x_1|y_k\right)\times P\left(x_2|y_k\right)\times \cdots \times P\left(x_n|y_k\right)

단어들이 매우 많은 경우, 0~1의 값을 가지는 Likelihood 식을 곱하다 보면 매우 작은 값을 가지게 된다. 일정 수준 이상 작아지면 Underflow되어 모두 같은 값으로 치환되므로, log를 취해 덧셈 연산으로 바꾸어 이를 방지한다.

P(xyk)=exp(log(P(x1yk))+log(P(x2yk))++log(P(xnyk)))P\left(\mathbf{x}|y_k\right)=\exp{\left(\log{\left(P\left(x_1|y_k\right)\right)}+ \log{\left(P\left(x_2|y_k\right)\right)}+\cdots+ \log{\left(P\left(x_n|y_k\right)\right)}\right)}
arg maxykP(ykx)=arg maxykP(xyk)P(yk)P(x)=arg maxyk(logP(yk)+logP(xyk))=arg maxyk(logP(yk)+ilogP(xiyk))\begin{aligned} \argmax\limits_{y_k} P\left(y_k|\mathbf{x}\right)&=\argmax\limits_{y_k} \frac{P\left(\mathbf{x}|y_k\right)P\left(y_k\right)}{P\left(\mathbf{x}\right)} \\ & =\argmax\limits_{y_k}\left(\log P\left(y_k\right)+\log P\left(\mathbf{x}|y_k\right)\right) \\ & =\argmax\limits_{y_k}\left(\log P\left(y_k\right)+\sum_i\log P\left(x_i|y_k\right)\right) \end{aligned}
profile
선형의 비선형적 기록 🐜

0개의 댓글