Quiet Time

▦ 4장. 나이브 베이즈의 이해
□4장. 목차
     1.나이브 베이즈를 이해하기 위한 기본 통계개념
          - 1.1 확률로 인한 데이터 분류
          - 1.2 확률
          - 1.3 결합확률
          - 1.4 베이즈 이론과 조건부 확률
2.나이브 베이즈 알고리즘 
     - 2.1 나이브 베이즈 분류
     - 2.2 라플라스 추정기

3.나이브 베이즈 실습 예제 
     - 3.1 영화장르
     - 3.2 스팸메일 분류1 (다른 예제)
     - 3.3 스팸메일 분류2 (책)

  1. 나이브베이즈를 이해하기 위한 기본 통계개념 (p128)
-1.1 확률로 인한 데이터 분류
- 기상학자가 날시예보를 할대 일반적으로 '비올확률 70%'
라는 용어를 사용해 예측한다

이 70%는 과거의 사건 데이터를 사용한것인데 과거에 이런 경우 10번중 7번은 비가왔음을 의미하는것이다.
- 베이즈 기법 기반인 분류기는 분류되지 않은 데이터를 분류기가 분류할때 새로운 속성에 대한 가장 유사하나 범주를 예측하기위해 관찰된 확률을 사용하고 이 관찰된 확률은 훈련데이터에 의해 미리 계산되어진다

훈련데이터 -----> 관찰된 확률
실제데이터 -----> 관찰된 확률을 이용해 분류를한다.

무엇을 분류하는 것인가?

  1. 스팸 메일 분류
  2. 컴퓨터 네트워크에 침힙한 이상징후를 분류
  3. 관찰된 증상을 고려한 질병 관찰


스팸 vs 햄

2차 대전때 영국식당에 먹으렉 스팸밖에 없어서 스팸이라는 말을 끊임 없이 써서 희화된 단어 

□ 1.2확률 (p130)
- 사건 
     사건이란 ? 화창하거나 또는 비가 올 날씨 
               동전 던지기에서 동전의 앞면과 뒷면
               스팸 이메일과 햄 이메일이 같이 일어날 수 있는 결과 

1.독립사건 : 두 사건이 서로 전혀 연관되이 않는다면 그건 독립사건 ,동전던지기와 날씨
P(A ∩ B) = P(A) * P(B)
P(A | B) = P(A) B사건은 A에 영향을 주지 않는다. 
==  는 사건B가 일어날때 사건 A의 확률이라고 읽는다. 
P(A | B) = P(A)
== 는 사건A가 일어났을 때 사건 B의 확률

2.종속사건 : 
사건 A가 일어났을 경우와 일어나지 않았을 경우에 따라서
사건B가 일어날 확률이 다를때 B는 A의 종속사건
P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)
P(A | B) = P(A ∩ B) / P(B)
P(B | A) = P(A ∩ B) / P(A)
3.배반사건
P(A U B) = P(A) + P(B)

문제194. (점심시간문제) 스팸 메일일 확률이 20% 이고 햄 메일일 확률이 80%이면 
스팸이 아닐 확률은 얼마인가?

스팸일 확률 : P(스팸) = 0.2 
햄일 확률   : P(햄) = 0.8
P(~스팸) : 0.8

▩ 1.3 결합확률 
책 131 페이지에 나온것 처럼 일부사건이 흥미로운 사건과 함께 일어났다면 예측하기 위해 흥미로운 사건을 사용할 수 있을것이다. 
모든 메세지의 20% 는 스팸이고 모든 메세지의 5%는 비아그라가 들어있다.

P(스팸) 과 P(비아그라)가 함께 일어날 확률은 ? 

P(스팸 ∩ 비아그라) 로 추정한다 .
P(스팸 ∩ 비아그라) 를 계산하면 (점심시간문제) - 독립사건이라면 ? 
0.01 %

▩ 1.4 베이즈 이론과 조건부 확률 (종속사건) 

사건 B 가 일어날때 사건 A의 확률은 아래와 같이 표시한다. 
P(A | B) = P(A ∩ B) / P(B)

P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)

            P(A ∩ B)         P(B|A) *  P(B)
P(A | B) = ------------ = ------------------
              P(B)            P(B)

                  P(스팸 ∩ 비아그라)      P(비아그라|스팸) * P(스팸)
P(스팸|비아그라) = ------------------- = -------------------------
                     P(비아그라)                P(비아그라)

설명 : 비아그라가 메일 메세지에 있을 때 스팸일 확률은 ? 

 우도 ? 가능도 (Likelyhood) 

  사건에는 1. 셀 수 있는 사건 ( 가능도 = 확률 )
          예 : 주사위를 던져서 나올 수 있는 숫자 1,2,3,4,5,6
               숫자가 나올 확률이 1/6로 모두 같고 각각의 확률을 합하면 
               확률은 1이 된다. 

          2.연속사건 (가능도 !=  확률) 
          예 : 1에서 6사이의 숫자중에 랜덤으로 아무 숫자를 뽑는다고 할때
               정확히 5가 뽑힐 확률은 얼마인가?

               1
            -------  = 0  <---- 연속사건은 확률이 0으로 계산이 된다.
             무한대
               
               그래서 사건이 일어날 가능성을 비교하는게 불가능하며 
               가능도 (likelyhood)라는 개념을 적용해야 이를 비교할 수 있다.

            우도 * 사전확률
사후 확률 = ----------------- 
              주변우도

  • 내일 시험문제지롱!!!
      비아그라
우도  YES  NO      총합
스팸  4/20 16/20    20
 햄   1/80 79/80    80
     5/100 95/100  100
                  P(비아그라|스팸) * P(스팸)      0.2 * 0.2
P(스팸|비아그라) = -------------------------  =  --------- = 0.8
                    P(비아그라)                    0.05

비아그라가 메세지 단어에 포함되어있으면 스팸일 확률이 80%가 된다.


문제195. 미진누나가 올려준 실습예제1의 메일에서 비아그라가 메세지에 포함되어 있으면 스팸일 확률은 어떻게 되는가?
           

                  P(비아그라|스팸) * P(스팸)      2/3 * 0.3
P(스팸|비아그라) = -------------------------  =  ---------- = 0.5
                    P(비아그라)                     0.4

▩ 2. 나이브 베이즈 알고리즘 (p 135) 

나이브 베이즈 알고리즘은 분류를 위해 베이즈 이론을 사용하는 애플리케이션이다

이름 그대로 순진한 가정을 하는것으로 데이터의 모든 속성을 동등하게 중요하며 독립적이라고 가정한다

장점: 1. 단순하고 빠르며 매우 효과적이다.
     2.결측데이터가 있어도 잘 수행된다.
     3.예측에 대한 추정된 확률을 얻기쉽다. 

단점: 1.모든 속성을 동등하게 중요하고 독립적이라는 알려진 결함에 의존한다. 

▩2.1 나이브 베이즈 분류

이번에는 비아그라라는 단어 하나만 가지고 스팸과 햄을 구분하느 
확률을 구하는게 아니라 다른 단어들도 포함 시켜봅시다.

비아그라 = yes, 돈 = no, 식료품 = no, 주소삭제 = yes 

문제196. 비아그라와 주소삭제는 포함하고 돈과 식료품은 포함하지 않는 
        메세지가 스팸일 확률은 어떻게 되는가. 

¬ : not sign

P(스팸|비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  = 


 P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  * P(스팸)
-------------------------------------------------
  P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)
               
                 ↓                             

 P(A ∩ B) = P(A) * P(B) <------- 이 공식을 염두해두고 다시 정리하면 

                 ↓    
                    
   P(비아그라|스팸)*P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
-----------------------------------------------------------------
         P(비아그라) * P(¬돈) * P(¬식료품)  * P(주소삭제)



          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

스팸의 우도 : (4/20) * (10/20) * (20/20) * (12/20) * (20/100) = 0.012

햄의 우도 : (1/80) * (66/80) * (71/80) * (23/80) * (80/100) = 0.002

                  0.012
스팸일 확률 : ------------------ = 0.85
               0.012 + 0.002
                  0.002
햄일 확률 : ------------------- = 0.1429
               0.012 + 0.002


 위의 해당 단어들을 포함하고 포함하지 않은 메일이 스팸이 될 확률 85% 햄일 확률이 14.2%가 된다. 

 

비아그라(w1)   

돈(w2)    

식료품(w3)  

주소삭제(w4)


우도   
Yes   
No     
Yes   
No     
Yes   
No     
Yes   
No     

스팸   
4/20 
16/20 
10/20
10/20 
0/20 
20/20  
12/20 
8/20 
20
햄     
1/80
79/80
14/80
66/80
8/80 
71/80 
23/80
57/80
80
총합 
5/100 
95/100
24/100
76/100
8/100 
9/100
35/100
65/100  
100


   P(비아그라|스팸)P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
   P(비아그라|햄) P(¬돈|햄 ) *P(¬식료품|햄 ) *P(주소삭제|햄 )*P(햄 )

문제197. 미진누나가 만든 실습예제2 메일 데이터를 보면 비아그라와 쿠폰이라는
        단어가 포함되어 있는 메일 스팸이 될 확률은 어떻게 되는가? 
p(비아그라|스팸) * p(쿠폰|스팸) * p(스팸) = ?
(4/6) * (3/6)* (6/14) = 0.14

p(비아그라|햄) * p(쿠폰|햄) * p(햄) = ?
(3/8) * (1/8) * (8/14) = 0.026
                   0.14
스팸 확률 =  ----------------------- = 0.84
              0.14 + 0.026
   
              0.026
햄 확률 = ----------------- = 0.15
           0.14 + 0.026
결론 : 쿠폰과 비아그라가 메일 메세지에 포함되어있으면 스팸일 확률이 84% 이다. 



       


▩ 2.2 라플라스 추정기 (p139) 

이번에는 비아그라 , 주소삭제, 식료품, 돈이 메일 메세지에 다 포함되어 있다고 했을때 스팸일 확률을 구해보자 


          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      4/20  *    10/20 *  0/20 * 12/20 * 20/100                  =0
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     1/80     *    14/80  *  8/80   *  23/80 *(80/100) =0.0005

                   0
스팸일 확률 : --------------- = 0
               0 + 0.0005
                0.0005
햄일 확률 : ---------------- = 1
               0 + 0.0005
식료품과 돈때문에 햄일 확률이 100% 되어 다른 증거까지 모두 무효로 만들어 버림 .ㅋ.,ㅡ.,


이를 해결하기위해 프랑스의 수학자 피에르 시몬 라플라스가 확률이 0 이 되지 않기 위해서 빈도표의 각 값에 작은 수를 추가했따

각각의 값에 1을 더했다. 



   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      5/24  *    11/24 *  1/24 * 13/24 * 20/100                  =0.0004
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     2/84     *    15/84  *  9/84   *  24/84 *(80/100) =0.0001


                  0.0004
스팸일 확률 : ------------------- = 0.8
             0.0004 + 0.0001
햄일 확률 :                      = 0.2

스팸일 확률이 80% 이며 햄일 확률이 20%임을 의미한다. 


쉬운예제 돌려보고 교재있는거 다음에 

▦ 나이브 베이즈 실습 1 (영화장르)

1.데이터 : 카페에 data 게시판 : 선호하는 영화장르 데이터
2.코드   : 아래 실습


movie <- read.csv ( 'movie.csv', header=T)

install.packages("e1071") # 오스트리아 수도 빈 비엔나 기술대학의 통계학과에서 개발함
library(e1071)
movie


 nm <- naiveBayes(movie[1:5],movie$장르 ,laplace=0)


> nm


Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = movie[1:5], y = movie$장르, laplace = 0)

A-priori probabilities:
movie$장르
        SF       공포     로맨틱    로맨틱s       무협     스릴러       액션     코미디
0.12820513 0.12820513 0.20512821 0.02564103 0.12820513 0.12820513 0.12820513 0.12820513

Conditional probabilities:
          나이
movie$장르 10대 10대  20대 30대 40대
   SF       0.0   0.0  0.0  1.0  0.0
   공포     0.0   0.0  0.0  0.0  1.0
   로맨틱   0.5   0.0  0.5  0.0  0.0
   로맨틱s  0.0   0.0  1.0  0.0  0.0
   무협     0.2   0.0  0.2  0.2  0.4
   스릴러   0.0   0.0  0.0  1.0  0.0
   액션     0.2   0.8  0.0  0.0  0.0
   코미디   0.0   0.0  0.4  0.4  0.2

          성별
movie$장르  남  여
   SF      0.4 0.6
   공포    1.0 0.0
   로맨틱  0.0 1.0
   로맨틱s 0.0 1.0
   무협    1.0 0.0
   스릴러  1.0 0.0
   액션    1.0 0.0
   코미디  1.0 0.0

          직업
movie$장르    IT 디자이너  무직  언론  영업 자영업  학생 홍보/마케팅
   SF      1.000    0.000 0.000 0.000 0.000  0.000 0.000       0.000
   공포    0.000    0.000 0.000 0.000 0.200  0.400 0.000       0.400
   로맨틱  0.000    0.375 0.000 0.000 0.000  0.000 0.375       0.250
   로맨틱s 0.000    0.000 0.000 0.000 0.000  0.000 0.000       1.000
   무협    0.000    0.000 1.000 0.000 0.000  0.000 0.000       0.000
   스릴러  0.000    0.000 0.000 1.000 0.000  0.000 0.000       0.000
   액션    0.000    0.000 0.000 0.000 0.000  0.000 1.000       0.000
   코미디  0.000    0.000 0.000 0.000 0.400  0.000 0.400       0.200

          결혼여부
movie$장르    NO   YES
   SF      0.200 0.800
   공포    1.000 0.000
   로맨틱  0.625 0.375
   로맨틱s 0.000 1.000
   무협    1.000 0.000
   스릴러  0.400 0.600
   액션    1.000 0.000
   코미디  1.000 0.000

          이성친구
movie$장르    NO   YES
   SF      0.800 0.200
   공포    1.000 0.000
   로맨틱  0.375 0.625
   로맨틱s 1.000 0.000
   무협    1.000 0.000
   스릴러  0.600 0.400
   액션    1.000 0.000
   코미디  1.000 0.000

result <- predict(nm, movie[1:5])

cbind(movie, result)

sum(movie$장르 != result)

문제198. 오늘 아침에 쪽지시험으로본 zoo 데이터의 100번재 동무링 어떤 종류인지 조류(2)가 맞는지 나이브 베이즈로 확인해보시오 

나이브 베이즈 알고리즘 문제를 풀기 위해서 아래의 zoo2 를 전부 팩터화 하세요 ~

zoo2 <- read.csv("zoo2.csv", stringsAsFactors = FALSE)


zoo2$X1 <- as.factor(zoo2$X1)
zoo2$X0 <- as.factor(zoo2$X0)
zoo2$X0.1 <- as.factor(zoo2$X0.1)
zoo2$X1.1 <- as.factor(zoo2$X1.1)
zoo2$X0.2 <- as.factor(zoo2$X0.2)
zoo2$X0.3 <- as.factor(zoo2$X0.3)
zoo2$X1.2 <- as.factor(zoo2$X1.2)
zoo2$X1.3 <- as.factor(zoo2$X1.3)
zoo2$X1.4 <- as.factor(zoo2$X1.4)
zoo2$X1.5 <- as.factor(zoo2$X1.5)
zoo2$X0.4 <- as.factor(zoo2$X0.4)
zoo2$X0.5 <- as.factor(zoo2$X0.5)
zoo2$X0.6 <- as.factor(zoo2$X0.6)
zoo2$X0.7 <- as.factor(zoo2$X0.7)
zoo2$X1.6 <- as.factor(zoo2$X1.6)
zoo2$X1.7 <- as.factor(zoo2$X1.7)


str(zoo2)


 

 nm <- naiveBayes(zoo2[2:17] ,zoo2[,18] ,laplace=0)
result <- predict(nm, zoo2[2:17] )

cbind(zoo2 , result)

sum(na.omit(zoo2[-100,18])  != result[c(1:99)])

> sum(na.omit(zoo2[-100,18])  != result[c(1:99)])
[1] 22