확률 이론으로 분류하기
 확률 이론을 바탕으로 하는 분류 방법이다. 나이
브베이스는 베이스 정의 일부분이다.
 장점 : 소량의 데이터를 가지고 작업이 이루어지며,
여러 개의 분류 항목을 다룰 수 있다.
 단점 : 입력 데이터를 어떻게 준...
 두 확률 변수의 사전확률과 사후확률 사이의 관계
를 나타내는 정리이다. 베이즈 확률론 해석에 따르
면 베이즈 정리는 새로운 근거가 제시될 때 사후
확률이 어떻게 갱신되는지를 구한다.
 조건부 확률(Condition...
 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 c...
 어떤 사건 B가 일어났을 때(주어졌을 때) 사건 A가
일어날 확률을 의미한다. 사건 B가 발생했을 때 사
건 A가 발생할 확률은 사건 B의 영항을 받아 변하
는데 이를 조건부 확률이라 한다.
 기호 : P(A|B)...
 3개의 흰색 돌과 4개의 검은색 돌이 위 그림과 같
이 각각 A와 B 바구니에 들어있다고 한다면, B 바
구니에서 돌을 꺼냈을 때 그 돌이 흰색일 확률은?
Bucket A Bucket B
 구해야 하는 확률
)|( bucketBwhiteP
)(
)(
)|(
bucketBP
bucketBwhiteP
bucketBwhiteP


7
1
)( bucketBwhiteP
7
3
)( bucketBP
3
1
7
3
7
1

∴33.3%
)(
)()|(
)|(
BP
APABP
BAP 
)()|()()()|( APABBAPBPBAP 


n
i
ii cPcxPxP
1
)()|()(
분류항목벡터c※
 P(A), P(B), P(B|A)를 알고 있다면 이를 통해 P(A|B)
를 구할 수 있다.
 P(A) = A의 사전확률
 P(B) = B의 사전확률
 P(B|A) = A가 주어졌을때 B의 조건부 확률
 P(A...
 문제
인구의 1% 정도만이 걸리는 드문 질병에 대해 검사를 하고
있다. 검사는 매우 민감도가 높고 구체적이지만 완벽하지는
않아서,
-아픈 사람의 99%가 검사에서 양성반응(‘아프다’)을 보였다.
-건강한 사람의 99...
99.001.001.099.0
01.099.0
)(
)()|(
)|(






P
sickPsickP
sickP
50.0
∴50%
 각각의 사건들은 모두 독립적이라고 가정한다.
)()...()()()...,,,( nPcPbPaPncbaP 
 만약 P(A1|B) > P(A2|B)이면, 항목 A1에 속한다.
 만약 P(A1|B) < P(A2|B)이면, 항목 A2에 속한다.
)(
)()|(
)|(
BP
APABP
BAP 
 대소를 구분하는데 분모(P(B))는 필요하지 않다.
)(
)()|(
)|(
11
1
BP
APABP
BAP 
)(
)()|(
)|(
22
2
BP
APABP
BAP 
동일하다
 나이브 베이스는 문서 분류 문제를 해결하는데 인
기 있는 알고리즘이다.
 각 문서의 등장하는 단어들을 속성처럼 사용하여
해당 문서에 존재하는지 아닌지를 확인하여 분류
를 할 수 있다.
 Ex) 스팸 메일 분류, ...
 게시판에 올라온 게시글이 폭력적인지(abusive),
폭력적이지 않은지( not abusive)를 분류한다.
)|( docabusiveP
)|( docnotAbusiveP
)(
)()|(
)|(
docp
abusivePabusivedocP
docabusiveP 
doc = set of sentences = set of words
= vector of words
)()|( abusiveP...
)|()|( abusivewPabusivedocP 
)...( 21 nwwwwordsofvectorw 
by naïve…
)|(...)|()|()|( 21 abusivewPabusivewPabusivewPabusi...
)()|()|( abusivePabusivedocPdocabusiveP 
)()|( abusivePabusivewP
)()|(
1
abusivePabusivewP
n
i
i


)()|(...)|()|( 21...
 Puedo Code
Count the number of documents in each class
for every training document:
for each class:
if a token appears i...
 Python Code
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbu...
please dog flea problems not abusive
maybe park dog stupid not abusive
stop kill stupid garbage abusive
link steak stop do...
Training Data
listOfPosts = { { “please”, “dog”, “flea”, “problem”},
{“maybe”, “park”, “dog”, “stupid”},
{“stop”, “kill”, ...
please dog flea problems not abusive
maybe park dog stupid not abusive
stop kill stupid garbage abusive
link steak stop do...
vocaList = {“please”, “dog”, “flea”, “problem”, “maybe”, “park”, “stupid”,
“stop”, “kill”, “garbage”, “link”, “steak”, “wo...
def trainNB0(trainMatrix,trainCategory):
please dog flea problem maybe park stupid stop kill garbage link steak
worth
less...
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
numTrainD...
p0Num = zeros(numWords); p1Num = zeros(numWords)
p0Denom = 0.0; p1Denom = 0.0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 ...
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num...
p1Vect = p1Num/p1Denom
p0Vect = p0Num/p0Denom
return p0Vect,p1Vect,pAbusive
/11p0Vect =
=
/8p1Vect =
=
= P(w | notAbusive)...
 0 곱하기 문제
P(w1 | 1) * P(w2 | 1) * P(w3 | 1) ... * P(wn | 1)
위와 같은 연산 중 하나의 항이라도 0이 되면 결과값이 0이 되어
버린다.
 해결
초기값을 0으로 두지 않는...
 Underflow
P(w1 | 1) * P(w2 | 1) * P(w3 | 1) ... * P(wn | 1)
위와 같이 0와 1사이의 값를 계속해서 곱해나가면 0에 가까워지게
된다. 그런데 컴퓨터가 표현할 수 있는 수...
p1Vect = log(p1Num/p1Denom)
p0Vect = log(p0Num/p0Denom)
p1Vect = p1Num/p1Denom
p0Vect = p0Num/p0Denom
/13p0Vect =
/10p1Vec...
 Improved Python Code
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix...
 classify function
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p...
 입력
inX = 입력 데이터
= {“stupid”, “dog”, “garbage”, “worthless”}
vec2Classify = {0,1,0,0,0,0,1,0,0,1,0,0,1,0}
please dog flea...
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
vec2Classify =
p1Vec =
p...
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
vec2Classify =
p0Vec =
p...
if p1 > p0:
return 1
else:
return 0
p1 = P(abusive) = -7.6
p0 = P(notAbusive) = -9.2
p1 > p0 : p1분류 항목에 속한다.
∴ 폭력적인 게시물이다.
Naive Bayes by Seo
Naive Bayes by Seo
of 42

Naive Bayes by Seo

What is Naive Bayes? For my friends.
Published on: Mar 3, 2016
Published in: Data & Analytics      
Source: www.slideshare.net


Transcripts - Naive Bayes by Seo

  • 1. 확률 이론으로 분류하기
  • 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
  • 7.  구해야 하는 확률 )|( bucketBwhiteP
  • 8. )( )( )|( bucketBP bucketBwhiteP bucketBwhiteP   7 1 )( bucketBwhiteP 7 3 )( bucketBP 3 1 7 3 7 1  ∴33.3%
  • 9. )( )()|( )|( BP APABP BAP  )()|()()()|( APABBAPBPBAP    n i ii cPcxPxP 1 )()|()( 분류항목벡터c※
  • 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%가 검사에서 음성반응 보였다. 어떤 사람이 양성반응을 보였다면, 이 사람이 정말로 병에 걸렸을 확률은 얼마인가?
  • 12. 99.001.001.099.0 01.099.0 )( )()|( )|(       P sickPsickP sickP 50.0 ∴50%
  • 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
  • 18. )( )()|( )|( docp abusivePabusivedocP docabusiveP  doc = set of sentences = set of words = vector of words )()|( abusivePabusivedocP =(w1 w2 w3 … wn) 대소구분에 영향을 주지 않는다.
  • 19. )|()|( abusivewPabusivedocP  )...( 21 nwwwwordsofvectorw  by naïve… )|(...)|()|()|( 21 abusivewPabusivewPabusivewPabusivewP n   n i abusivewP i 1 )|( )|,...,( 21 abusivewwwP n
  • 20. )()|()|( abusivePabusivedocPdocabusiveP  )()|( abusivePabusivewP )()|( 1 abusivePabusivewP n i i   )()|(...)|()|( 21 abusivePabusivewPabusivewPabusivewP n
  • 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
  • 22.  Python Code def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = zeros(numWords); p1Num = zeros(numWords) p0Denom = 0.0; p1Denom = 0.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 = p1Num/p1Denom p0Vect = p0Num/p0Denom return p0Vect,p1Vect,pAbusive
  • 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
  • 24. Training Data listOfPosts = { { “please”, “dog”, “flea”, “problem”}, {“maybe”, “park”, “dog”, “stupid”}, {“stop”, “kill”, “stupid”, “garbage”}, {“link”, “steak”, “stop”, “dog”}, {“stupid”, “worthless”, “homeless”, “garbage”} } ClassVec = {0,0,1,0,1} 0 -> not abusive 1 -> abusive vocaList = {“please”, “dog”, “flea”, “problem”, “maybe”, “park”, “stupid”, “stop”, “kill”, “garbage”, “link”, “steak”, “worthless”, “homeless”}
  • 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
  • 26. vocaList = {“please”, “dog”, “flea”, “problem”, “maybe”, “park”, “stupid”, “stop”, “kill”, “garbage”, “link”, “steak”, “worthless”, “homeless”} trainingMatrix = { {1,1,1,1,0,0,0,0,0,0,0,0,0,0}, {0,1,0,0,1,1,1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,1,1,1,1,0,0,0,0}, {0,1,0,0,0,0,0,1,0,0,1,1,0,0}, {0,0,0,0,0,0,1,0,0,1,0,0,1,1} } trainCategory = {0,0,1,0,1} def trainNB0(trainMatrix,trainCategory):
  • 27. def trainNB0(trainMatrix,trainCategory): please dog flea problem maybe park stupid stop kill garbage link steak worth less home less 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 1 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 1 1 1 0 0 0 0 4 0 1 0 0 0 0 0 1 0 0 1 1 0 0 5 0 0 0 0 0 0 1 0 0 1 0 0 1 1 trainingMatrix 1= 등장, 0 = 미등장
  • 28. numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) numTrainDocs = 훈련데이터의 전체 게시글(행) 수 = 5 numWords = 훈련데이터 속성(열, 문자)의 수 = 14 trainCatrgory = { 0, 0, 1, 0, 1} sum(trainCategory) = 0+0+1+0+1 = 2 =폭력적인 게시글의 수 pAbusive = P(abusive) = 2/5
  • 29. p0Num = zeros(numWords); p1Num = zeros(numWords) p0Denom = 0.0; p1Denom = 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 p0Num = p1Num = p0Denom = 0.0 p1Denom = 0.0
  • 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
  • 31. p1Vect = p1Num/p1Denom p0Vect = p0Num/p0Denom return p0Vect,p1Vect,pAbusive /11p0Vect = = /8p1Vect = = = P(w | notAbusive) = P(w | abusive) pAbusive = P(abusive) = 2/5 0.090.270.090.090.090.090.000.090.000.000.090.090.000.00 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 0.000.000.000.000.000.000.250.130.130.250.000.000.130.13
  • 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))
  • 34. p1Vect = log(p1Num/p1Denom) p0Vect = log(p0Num/p0Denom) p1Vect = p1Num/p1Denom p0Vect = p0Num/p0Denom /13p0Vect = /10p1Vect = /13 /10 ln( ) ln( ) ∴ ∴ 2 4 2 2 2 2 1 2 1 1 2 2 1 1 2 4 2 2 2 2 1 2 1 1 2 2 1 1 -1.87-1.18-1.87-1.87-1.87-1.87-2.56-1.87-2.56-2.56-1.87-1.87-2.56-2.56 1 1 1 1 1 1 3 2 2 3 1 1 2 2 1 1 1 1 1 1 3 2 2 3 1 1 2 2 -2.30-2.30-2.30-2.30-2.30-2.30-1.20-1.61-1.61-1.20-2.30-2.30-1.61-1.61
  • 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
  • 38. p1 = sum(vec2Classify * p1Vec) + log(pClass1) p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) vec2Classify = p1Vec = pClass1 = P(abusive) = 2/7 = 0.29 0 1 0 0 0 0 1 0 0 1 0 0 1 0 -2.30-2.30-2.30-2.30-2.30-2.30-1.20-1.61-1.61-1.20-2.30-2.30-1.61-1.61 0 -2.30 0 0 0 0 -1.20 0 0 -1.20 0 0 -1.61 0 vec2Classify * p1Vec = p1 = sum(vec2Classify * p1Vec) + log(pClass1) = = -2.3 -1.2 -1.2 -1.61 -1.25 = -7.6
  • 39. p1 = sum(vec2Classify * p1Vec) + log(pClass1) p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) vec2Classify = p0Vec = pClass0 = P(notAbusive) = 1 - P(abusive) = 1 - 0.29 = 0.71 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 -1.18 0 0 0 0 -2.56 0 0 -2.56 0 0 -2.56 0 vec2Classify * p1Vec = p0 = sum(vec2Classify * p0Vec) + log(pClass0) = = -1.18 – 2.56 – 2.56 – 2.56 - 0.34 = -9.2 -1.87-1.18-1.87-1.87-1.87-1.87-2.56-1.87-2.56-2.56-1.87-1.87-2.56-2.56
  • 40. if p1 > p0: return 1 else: return 0 p1 = P(abusive) = -7.6 p0 = P(notAbusive) = -9.2 p1 > p0 : p1분류 항목에 속한다. ∴ 폭력적인 게시물이다.

Related Documents