본문 바로가기
AI & 머신러닝 coding skill

머신러닝 분류 - 나이브 베이즈 분류

by 호빵님 2022. 5. 24.
반응형

베이즈 정리로 나이브 베이즈 분류 구현하기

나이브 베이즈 분류는 데이터의 확률적 속성을 가지고 클래스를 판단하는, 꽤 높은 성능을 가지는 머신러닝 알고리즘입니다.

이를 이해하기 위해서 Bayes’ Theorem에 친숙해 질 필요가 있습니다.

간단한 나이브 베이즈 분류 구현을 통해 베이즈 정리에 대해 이해해보도록 하겠습니다.


data set 내에서 X와 Y의 빈도수를 활용하여 연산에 필요한 각각의 확률값을 계산 할 수 있습니다.

엘리스의 이메일을 한 번 들여다 보면서 Bayes’ theorem을 이해해 볼까요? 엘리스의 이메일은 다음과 같은 텍스트 목록을 가지고 있습니다.

타입텍스트

Spam “(광고) XXX 지금 확인 해보세요.” 첨부파일 : exe
Ham “[긴급]엘리스님, 확인 부탁드립니다.” 첨부파일 : exe
Ham “Git 오프라인 수업을 3일 간 합니다”
Spam “제목없음” 첨부파일 : exe
Spam “놓칠 수 없는 기회, 확인 해보세요.”

 

실습

엘리스의 메일함에는 총 20개의 메일이 들어있습니다. 그중 스팸 메일은 8개, 정상 메일은 12개로 분류되어 있습니다. “확인” 키워드를 가지는 메일이 7개, “확인”을 제외한 메일이 13개라고 할 때, 다음과 같은 분포를 가집니다.

스팸 메일정상 메일개수

“확인” 5 2 7
나머지 3 10 13
개수 8 12 20

스팸 메일과 정상 메일에서 공통적으로 나타나는 키워드인 “확인“이 등장했을 때, 이 메일이 스팸 메일 인지, 정상 메일이 되는지에 대해 판별해 보도록 하겠습니다.

>>> P( "스팸 메일" | "확인" ) = ?
>>> P( "정상 메일" | "확인" ) = ?
  1. bayes_theorem() 함수를 완성합니다.
  2. 실행 버튼을 눌러 확인 키워드가 들어있는 메일이 정상 메일일 확률과 스팸 메일일 확률을 확인합니다.

 

import numpy as np

"""
1. "확인" 이라는 키워드가 등장했을 때 
    해당 메일이 스팸 메일인지 정상 메일인지
    판별하기 위한 함수를 구현합니다.
"""
def bayes_theorem():
    # 1. P(“스팸 메일”) 의 확률을 구하세요.
    p_spam = 8/20
    
    # 2. P(“확인” | “스팸 메일”) 의 확률을 구하세요.
    p_confirm_spam = 5/8
    
    # 3. P(“정상 메일”) 의 확률을 구하세요.
    p_ham = 12/20
    
    # 4. P(“확인” | "정상 메일" ) 의 확률을 구하세요.
    p_confirm_ham = 2/12
    
    # 5. P( "스팸 메일" | "확인" ) 의 확률을 구하세요.
    p_spam_confirm = p_confirm_spam * p_spam / (7/20)
    
    # 6. P( "정상 메일" | "확인" ) 의 확률을 구하세요.
    p_ham_confirm = p_confirm_ham * p_ham / (7/20)
    
    return p_spam_confirm, p_ham_confirm

def main():
    
    p_spam_confirm, p_ham_confirm = bayes_theorem()
    
    print("P(spam|confirm) = ",p_spam_confirm, "\nP(ham|confirm) = ",p_ham_confirm, "\n")
        
    # 두 값을 비교하여 확인 키워드가 스팸에 가까운지 정상 메일에 가까운지 확인합니다.
    value = [p_spam_confirm, p_ham_confirm]
    
    if p_spam_confirm > p_ham_confirm:
        print( round(value[0] * 100, 2), "% 의 확률로 스팸 메일에 가깝습니다.")
    else :
        print( round(value[1] * 100, 2), "% 의 확률로 일반 메일에 가깝습니다.")


if __name__ == "__main__":
    main()

 

 

*본 포스팅은 DX기업교육 플랫폼인 Elice academy의 머신러닝 심화 과정에서 실습한 코드를 이용해서 작성되었습니다.

https://elice.io/

 
 
 

올인원 디지털 교육 플랫폼 - 엘리스

우리 모두를 위한 교실, 엘리스와 함께 더 나은 기회를 만들어보세요

elice.io

 

 

반응형