2. 확률 이론을 바탕으로 하는 분류 방법이다. 나이
브베이스는 베이스 정의 일부분이다.
장점 : 소량의 데이터를 가지고 작업이 이루어지며,
여러 개의 분류 항목을 다룰 수 있다.
단점 : 입력 데이터를 어떻게 준비하느냐에 따라
민감하기 작용한다.
적용 : 명목형 값
3. 두 확률 변수의 사전확률과 사후확률 사이의 관계
를 나타내는 정리이다. 베이즈 확률론 해석에 따르
면 베이즈 정리는 새로운 근거가 제시될 때 사후
확률이 어떻게 갱신되는지를 구한다.
조건부 확률(Conditional probability)
베이즈 규칙(Bayes’ rule)
4. x, y = 속성
p1(x, y) = p1일 확률
p2(x, y) = p2일 확률
if p1(x, y) > p2(x, y), then class1
if p1(x, y) < p2(x, y), then class2
-> 더 높은 확률을 가지는 분류항목을 선택한다.
5. 어떤 사건 B가 일어났을 때(주어졌을 때) 사건 A가
일어날 확률을 의미한다. 사건 B가 발생했을 때 사
건 A가 발생할 확률은 사건 B의 영항을 받아 변하
는데 이를 조건부 확률이라 한다.
기호 : P(A|B)
정의 :
)(
)(
)|(
BP
BAP
BAP
6. 3개의 흰색 돌과 4개의 검은색 돌이 위 그림과 같
이 각각 A와 B 바구니에 들어있다고 한다면, B 바
구니에서 돌을 꺼냈을 때 그 돌이 흰색일 확률은?
Bucket A Bucket B
10. P(A), P(B), P(B|A)를 알고 있다면 이를 통해 P(A|B)
를 구할 수 있다.
P(A) = A의 사전확률
P(B) = B의 사전확률
P(B|A) = A가 주어졌을때 B의 조건부 확률
P(A|B) = 사후확률
11. 문제
인구의 1% 정도만이 걸리는 드문 질병에 대해 검사를 하고
있다. 검사는 매우 민감도가 높고 구체적이지만 완벽하지는
않아서,
-아픈 사람의 99%가 검사에서 양성반응(‘아프다’)을 보였다.
-건강한 사람의 99%가 검사에서 음성반응 보였다.
어떤 사람이 양성반응을 보였다면, 이 사람이 정말로 병에
걸렸을 확률은 얼마인가?
13. 각각의 사건들은 모두 독립적이라고 가정한다.
)()...()()()...,,,( nPcPbPaPncbaP
14. 만약 P(A1|B) > P(A2|B)이면, 항목 A1에 속한다.
만약 P(A1|B) < P(A2|B)이면, 항목 A2에 속한다.
)(
)()|(
)|(
BP
APABP
BAP
15. 대소를 구분하는데 분모(P(B))는 필요하지 않다.
)(
)()|(
)|(
11
1
BP
APABP
BAP
)(
)()|(
)|(
22
2
BP
APABP
BAP
동일하다
16. 나이브 베이스는 문서 분류 문제를 해결하는데 인
기 있는 알고리즘이다.
각 문서의 등장하는 단어들을 속성처럼 사용하여
해당 문서에 존재하는지 아닌지를 확인하여 분류
를 할 수 있다.
Ex) 스팸 메일 분류, 게시판 카테고리 분류 등
)|( emailspamP
17. 게시판에 올라온 게시글이 폭력적인지(abusive),
폭력적이지 않은지( not abusive)를 분류한다.
)|( docabusiveP
)|( docnotAbusiveP
21. Puedo Code
Count the number of documents in each class
for every training document:
for each class:
if a token appears in the document
-> increment the count for that token
increment the count for tokens
for each class:
for each token:
divide the token count by the total token count
to get conditional probabilities
return conditional probabilities for each class
23. please dog flea problems not abusive
maybe park dog stupid not abusive
stop kill stupid garbage abusive
link steak stop dog not abusive
stupid worthless homeless garbage abusive
Training Data
25. please dog flea problems not abusive
maybe park dog stupid not abusive
stop kill stupid garbage abusive
link steak stop dog not abusive
stupid worthless homeless garbage abusive
Training Data
5
2
)( abusiveP
5
3
)(1)( abusivePnotAbusiveP
30. for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p0Num =
p1Num =
p0Denom = 11
p1Denom = 8
폭력적이지 않은 게시글에서 각 단어의 등장 횟수
폭력적이지 않은 게시글에서 모든 단어의 등장 횟수
폭력적인 게시글에서 각 단어의 등장 횟수
폭력적인 게시글에서 모든 단어의 등장 횟수
1 3 1 1 1 1 0 1 0 0 1 1 0 0
0 0 0 0 0 0 2 1 1 2 0 0 1 1
32. 0 곱하기 문제
P(w1 | 1) * P(w2 | 1) * P(w3 | 1) ... * P(wn | 1)
위와 같은 연산 중 하나의 항이라도 0이 되면 결과값이 0이 되어
버린다.
해결
초기값을 0으로 두지 않는다.
p0Num = zeros(numWords)
p1Num = zeros(numWords)
p0Denom = 0.0; p1Denom = 0.0
p0Num = ones(numWords)
p1Num = ones(numWords)
p0Denom = 2.0; p1Denom = 2.0
33. Underflow
P(w1 | 1) * P(w2 | 1) * P(w3 | 1) ... * P(wn | 1)
위와 같이 0와 1사이의 값를 계속해서 곱해나가면 0에 가까워지게
된다. 그런데 컴퓨터가 표현할 수 있는 수의 범위에는 한계가 있기
때문에 결과값이 이 범위를 넘어선다면 언더플로우가 발생하여 올바
르지 않은 값을 산출하게 된다.
해결
ln를 취하도록 한다. ln을 취하면 곱셈은 덧셈으로 바뀌지만 결과값
은 서로 비례한다. f(x)와 ln(f(x))는 함께 증가한다.
ln(a * b) = ln(a) + ln(b)
ln(P(w1|1)*P(w2|1) ... * P(wn|1))
= ln(P(w1|1))+ln(P(w2|1)) ... +ln(P(wn|1))
35. Improved Python Code
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
p0Num = ones(numWords); p1Num = ones(numWords) #change to ones()
p0Denom = 2.0; p1Denom = 2.0 #change to 2.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = log(p1Num/p1Denom) #change to log()
p0Vect = log(p0Num/p0Denom) #change to log()
return p0Vect,p1Vect,pAbusive
36. classify function
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0
※ vec2Classify = 입력 데이터.
새로 등록된 게시글에 등장한 문자에 대한 벡터)
37. 입력
inX = 입력 데이터
= {“stupid”, “dog”, “garbage”, “worthless”}
vec2Classify = {0,1,0,0,0,0,1,0,0,1,0,0,1,0}
please dog flea problem maybe park stupid stop kill garbage link steak
worth
less
home
less
0 1 0 0 0 0 1 0 0 1 0 0 1 0