본문 바로가기
머신러닝

[머신러닝] 나이브 베이즈 (Naive Bayes)

by Gom Guard 2017. 11. 29.



지도학습 알고리즘

나이브 베이즈(Naive Bayes) - 이론 : 베이즈 정리

  • 나이브 베이즈 분류를 이해하기 위해선 나이브 베이즈의 기본이 되는 베이즈 정리에 대해서 먼저 알아볼 필요가 있습니다.

  • 조건부 확률 P(A|B) 는 사건 B 가 발생한 경우 A 의 확률 을 나타냅니다.

  • 베이즈 정리는 P(A|B) 의 추정이 P(A∩B) 와 P(B) 에 기반을 두어야한다는 정리 입니다.

  • 예제를 통해 하나씩 살펴보겠습니다.

  • 전체 사건 중 비가 온 확률은 P(비) = 7/20 입니다. 그렇다면 비가 안온 확률은 얼마일까요? 

  • P(~비) = 13/20 이겠죠. 비가 오는지 안오는지 같이 둘 중 하나의 상태만 가능한 사건들은 모든 경우의 수를 더했을 때 1이 됩니다.

  • 그렇다면 이제 P(비|맑은날) 의 값은 얼마일지 알아볼까요?

  • 위 식을 통해 P(비|맑은날) 을 구하기 위해선 P(맑은날|비), P(비), P(맑은날) 이 세개의 값만 알아내면 됩니다.

  • P(비|맑은날) = P(맑은날|비) * P(비) / P(맑은날)

    • = (2/7) * 0.35 / 0.5 = 0.2

  • 전체중에서 맑은날 이면서 비가올 확률은 20% 정도 된다고 볼 수 있을 것 같습니다.

나이브 베이즈(Naive Bayes) - 예제1 : 비오는 날

  • 나이브 베이지안에서 나이브(Naive) 는 순진하다 라는 뜻을 가지고 있습니다. 이런 수식어가 붙은 이유는 데이터셋의 모든 특징들이 동등하고 독립적이라고 가정하기 때문입니다. 예를들어 비가 오는 날에는 시간보다는 습도가 더 중요한 변수가 될 수 있지만 나이브베이지안 에서는 이런 사실을 무시하기 때문입니다. 하지만 이런 가정에도 불구하고 분류학습에서 매우 정확한 결과 값을 내놓기 때문에 자주 사용되고 있습니다.

  • 위의 비 & 맑은날 데이터를 확장해서 진행해보겠습니다.

  • 만약 오늘 날씨가 좋고, 바람이 많이 불지 않고, 기압은 높은데, 온도가 낮다면 오늘은 비가 올것인가? 안올것인가?  - 이 질문을 식으로 바꿔보면.


  • 오늘 날씨가 좋고, 바람이 많이 불지 않고, 기압은 높은데, 온도가 낮다면 비가 올 확률은 2.7%이고 비가 안 올 확률은 97.3% 로 계산됩니다. 이 데이터에 따르면 날씨 좋고, 바람 안불고, 기압 높은데, 온도 낮은날은 비가 안 올 가능성이 높은 것 같습니다.


나이브 베이즈(Naive Bayes) - 예제2 : Spam 메일

  • 스팸메일을 분류하는 서비스는 나이브베이즈를 이용하는 대표적인 서비스 입니다. 관련 데이터는 이곳에서 받으셔서 진행하실 수 있으며 이곳에서는 세부 코드를 보실 수 있습니다.

  • 데이터는 TYPE 과 TEXT 컬럼으로 구성되어 있으며 총 5559개의 SMS 를 포함하고 있습니다.



  • 위의 예제1 에서 날씨가 오는지 안오는지, 온도가 높은지 낮은지 등등에 따라 분류 했던 것 처럼 Hope 라는 단어가 들어갔는지, food 라는 단어가 들어갔는지 등 단어별로 컬럼을 구성해주어야 나이브 베이즈 분류를 사용할 수 있습니다.

  • 이를 위해 데이터 정제 작업을 거치는데 이 과정에는 type 팩터화, 숫자 제서, 소문자화, 불용어 제거, 구두점 제거 형태소 분석 등의 작업을 진행합니다. 이 세부 방법은 다른 포스트에서 진행하겠습니다. 이 모든 과정을 거친 뒤의 행렬인 DTM(Document Term Matrix) 은 다음과 같습니다.



  • 각 idx(메시지) 마다 어떤 단어가 들어가 있는지 1과 0으로 표현되는 Matrix 를 Train 데이터(4169개)와 Test 데이터(1390개)로 나누어 e1071 라이브러리에서 제공하는 나이브베이즈 모델로 분류해보면 결과는 다음과 같습니다.


  • 1390개 중 1353개가 올바르게 분류하고, 37개가 오분류를 하였습니다. 실제로는 스팸인데 햄이라고 분류한 34개의 메일도 줄여야 하지만 실제 서비스에선 실제로는 햄인데 스팸이라고 분류한 3개의 결과를 줄이는 것이 무엇보다 중요합니다. 

  • 간단한 모델로 97.3%의 정확도를 갖는 모델을 얻었는데, 이보다 더 높은 정확도를 갖기위해선 자주등장하는 단어의 개수를 변경하거나 라플라스 상수를 추가하는 방법 또는 기존 데이터를 셔플해서 모델을 구성하는 등의 각종 방법을 사용해볼 수 있습니다.

댓글14

  • 나인 2018.04.16 08:05

    좋은 글이네요.^^
    답글

  • 지나가며 2018.04.28 14:40

    어려운 내용을 정말 쉽게 잘 설명해주시네요.^^ 잘 보고 갑니다.
    다만 숫자가 조금 다른 것 같아 궁금하넫요.
    아래의 내용에서 P(비)=7/20, P(~비)=13/20인 것 같은데요.(표를 보면)
    혹시 제가 잘 못 이해했다면 설명해주시면 좋겠어요.
    -------------------------------------------------------
    전체 사건 중 비가 온 확률은 P(비) = 9/20 입니다. 그렇다면 비가 안온 확률은 얼마일까요?
    P(~비) = 11/20 이겠죠. 비가 오는지 안오는지 같이 둘 중 하나의 상태만 가능한 사건들은 모든 경우의 수를 더했을 때 1이 됩니다.
    답글

    • Gom Guard 2018.04.28 14:44 신고

      지나가며님 안녕하세요. ^^
      만씀해주신 부분이 제가 실수를 한 것 같습니다. 오류 찾아주셔서 감사합니다.

      좋은 하루 되세요. ^^

  • 희도뤼 2018.07.02 10:57

    안녕하세요..
    글 보다가 궁금한게 있어서요.
    날씨부분 식 전개하면서
    P(날씨∩~바람∩기압∩~온도) 이 부분이 근사화가 되어 사라지게 되는데...
    이 값은 어떤 이유로 1로 간주될 수 있나요?
    답글

    • fistful 2018.07.11 18:37 신고

      자세히 보면 이후 수식에서 모두 그녀석이 분모로 쓰이니 날려버릴 수 있을것 같습니다.

    • Gom Guard 2018.07.11 18:55 신고

      희도뤼님. 안녕하세요.

      댓글이 너무 늦었네요. fistful 님 께서 너무 잘 설명해주셨네요. ^^

      댓글 달아주셔서 감사합니다.

  • fistful 2018.07.11 17:57 신고

    하나하나 따라가며 정리해보려 합니다. 감사합니다. :-)
    답글

    • Gom Guard 2018.07.11 18:56 신고

      fistful 님 안녕하세요.
      도움이 되었다니 다행이네요 ㅎㅎㅎ
      댓글 달아주셔서 감사합니다. ^^

      좋은 하루 되세요~~

  • 안녕하세요 2018.07.25 00:59

    혹시 세부 코드를 볼 수 있는 곳이 지워졌나요? 제가 찾질 못하는건지 아님 링크가 사라진건지 세부 코드를 확인하고 싶은데 그러질 못해서요ㅎㅎ
    답글

  • 김경호 2019.06.10 01:47

    이해하기 참 쉽게 설명해주셔서 감사합니다!
    답글

  • ㄴㅇㄹ 2019.09.16 14:48

    계산을 잘 못 하신거 같은데...
    (8/12)*(10/12)*(2/12)*(6/12)*(12/20) = 0.0278이 아닐까요...?
    0.3333은 어떻게 나온 값이죠?
    답글

  • 유정 2020.05.15 11:38

    감사드립니다. 도움이 되었어요 :)
    답글

  • 박재성 2020.09.10 04:43 신고

    안녕하세요? 좋은 글 감사합니다.

    예제 1. 비오는 날 예제에서,

    '만약 오늘 날씨가 좋고, 바람이 불지 않고, 기압이 높고, 온도가 낮다면 비가 올까' 확률은
    = P(비|날씨∩~바람∩기압∩~온도) / (P(비|날씨∩~바람∩기압∩~온도) * P(~비|날씨∩~바람∩기압∩~온도))

    라고 되어 있는데,

    '만약 오늘 날씨가 좋고, 바람이 불지 않고, 기압이 높고, 온도가 낮다면 비가 올까' 확률은
    = P(비|날씨∩~바람∩기압∩~온도)

    이거 아닌가요?


    답글