Naive Bayes

Rainy Night for Sapientia·2023년 7월 9일

NLP demystified

목록 보기
5/8

Naive Bayes

베이즈이론을 이용한 직관적인 모델 중 하나인 나이브베이즈입니다.
여러 분류문제에 사용될 수 있고 기본적인 자연어처리 모델에도 이용될 수 있습니다.

분류 : Supervised learning
형태 : Generative model
용도 : Classification
장점 : 간결함(베이스라인), 빠름
단점 : 피처간 독립을 가정, 낮은 정확도, 지정한 분포(정규분포 등)를 따르지 않으면 성능 매우 안좋음, 데이터 희소문제

Model

원리는 베이즈이론을 기반으로 하는 확률 모형을 만드는 것입니다.

Bayes' Theorem

다음과 같이 확률의 곱 정리로 간단하게 증명됩니다.

P(A,B)=P(A)P(BA)P(A, B) = P(A)\: P(B|A)
P(B,A)=P(B)P(AB)P(B, A) = P(B)\: P(A|B)

But,

P(A,B)=P(B,A)P(A, B) = P(B, A)

Such that,

P(B)P(AB)=P(A)P(BA)P(B)\: P(A|B) = P(A)\: P(B|A)
P(AB)=P(A)P(BA)P(B)P(A|B) = \frac{P(A)\:P(B|A)}{P(B)}

자 좀 더 분해해서 의미를 살펴봅시다.
사건 B를 가설(H, Hypothesis)라 하고 사건A를 현재 가지고 있는 데이터(D)라고 생각해봅시다.

다음과 같이 표현될 수 있습니다.

P(HD)=P(H)P(DH)P(D)P(H|D) = \frac{P(H)\:P(D|H)}{P(D)}

여기서 우리가 구하고자 하는 값, 특정 데이타 분포에서 가설(H)의 발생확률 P(HD)P(H|D)은 베이즈이론에서 사후확률(Posterior)이라고 합니다.
이를 구하기 위한 우변을 봅시다.
어떠한 조건이나 데이터도 고려되지 않은 최초 가설 P(H)P(H)은 사전확률(Prior)라고 표현합니다.
그리고 가설(H)하에 특정한 데이터값(D)가 관측될 확률을 우도(Likelihood)라고 표현합니다.

그리고 베이즈 이론은 가설의 Posterior = Prior * Likelihood로 정리됩니다. 다만 여기에 값을 Normalizing 하기위해 P(D)P(D)로 나누기 때문에 다음과 같은 식이 완성되는 것입니다.

posterior=priorlikelihoodnormalizing constant\text{posterior} = \frac{\text{prior} * \text{likelihood}}{\text{normalizing constant}}

Applied to text classification

간단한 텍스트 분류를 통해 구현 원리를 살펴봅시다.
우선 특정 document(row)가 어떤 클래스(class, target col)로 분류되는지에 대한 베이즈확률을 계산해야 합니다.

다음과 같이 argmaxargmax를 이용해서 특정 document(d)가 주어졌을때 확률을 max로 만드는 class(c)값을 추출해야 합니다. 이 값을 c^\hat{c}라 합시다.
이는 normalizing constant P(d)P(d)는 필요하지 않아 다음과 같이 표현됩니다.

argmaxcCP(cd)=argmaxcCP(c)P(dc)P(c)=argmaxcCP(c)P(dc)\underset{c \in C}\text{argmax}\:P(c|d) = \underset{c \in C}\text{argmax}\:\frac{P(c)\:P(d|c)}{P(c)} = \underset{c \in C}\text{argmax}\:P(c)\:P(d|c)

이므로,

c^=argmaxcCP(c)P(dc)\hat{c} = \underset{c \in C}\text{argmax}\:P(c)\:P(d|c)

이제 우변의 각각 확률에 대해 봅시다.
먼저 prior인 P(c)P(c)는 target column의 전체 수, 즉 전체 documents의 수 중 해당 클래스(c)의 수 입니다.

P(c)=Number of documents of class cTotal number of documentsP(c) = \frac{\text{Number of documents of class c}}{\text{Total number of documents}}

likelihood인 P(dc)P(d|c)는 좀 까다롭습니다. d를 나타내는 하나의 document는 각 워드 벡터들의 집합이므로 다음과 같이 표현될 수 있습니다.

P(dc)=P([w1,w2,...,wn]c)P(d|c) = P([w_1, w_2, ..., w_n] |c)

이를 특정 class가 주어졌을때 특정한 워드들의 조합이 나타날 확률을 일컫는 것입니다. 이를 계산을 편하게 하기위해 Naive Bayesa 모델은 다음과 같은 조건을 가정합니다.
1. 워드들의 순서를 무시합니다. (BoW 나 TF-IDF과 같은 벡터라이제이션)
2. 각 워드들의 출현 확률은 각각 독립(Independent) 사건임을 가정합니다.(Naive)

이러한 2가지 조건하에 위 수식을 다음과 같이 분해될 수 있습니다.

P([w1,w2,...,wn]c)=P(w1c)P(w2c)P(w3c)...P(wnc)P([w_1, w_2, ..., w_n] |c) = P(w_1|c)\:P(w_2|c)\:P(w_3|c)\:...\:P(w_n|c)

분해된 각 항들은 주어진 데이터들로 부터 계산 가능합니다.
예를들어 P(w1c)P(w_1|c)는 class가 c인 모든 documents들의 모든 word 수에서 w1w_1를 세면 됩니다.
이를 세부 수식으로 보면 다음과 같습니다.

P(wic)=count of wi in ccount of all w in cP(w_i|c)= \frac{\text{count of }w_i \text{ in c}}{\text{count of all } w \text{ in c}}

근데 이 수식에는 문제가 한 가지 있습니다. 만약에 특별한 단어가 코퍼스에 하나도 존재하지 않았다면 이는 해당 Likelihood를 0으로 만들어버려 향후 수식을 수행하지 못하게 만듭니다. 이를 조정하기 위해 다음과 같이 작은 상수 α\alpha를 더해서 조정합니다. V|V|는 해당 c에 존재하는 총 word의 수 입니다.

P(wic)=count of wi in c+αcount of all w in c+αVP(w_i|c)= \frac{\text{count of }w_i \text{ in c} + \alpha}{\text{count of all } w \text{ in c} + \alpha |V|}

자 이제 이를 감안하고 다시 수식을 정리하면 다음과 같습니다.

c^=argmaxcCP(c)i=1nP(wic)\hat{c} = \underset{c \in C}\text{argmax}\:P(c)\:\prod_{i=1}^{n} P(w_i|c)

계산의 편의를 위해 양변에 로그를 취해도 최대로하는 c를 찾는 수식에는 변함이 없을 겁니다. 다음 식이 Naive Bayes classifier의 모델이라 할 수 있습니다.

c^=argmaxcClogP(c)+i=1nlogP(wic)\hat{c} = \underset{c \in C}\text{argmax}\:\text{log}P(c) +\sum_{i=1}^{n} \text{log}P(w_i|c)

References

[1] nlpdemystified, https://www.nlpdemystified.org

profile
Artificial Intelligence study note

0개의 댓글