반응형
베이즈 정리로 나이브 베이즈 분류 구현하기
나이브 베이즈 분류는 데이터의 확률적 속성을 가지고 클래스를 판단하는, 꽤 높은 성능을 가지는 머신러닝 알고리즘입니다.
이를 이해하기 위해서 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( "정상 메일" | "확인" ) = ?
- bayes_theorem() 함수를 완성합니다.
- 실행 버튼을 눌러 확인 키워드가 들어있는 메일이 정상 메일일 확률과 스팸 메일일 확률을 확인합니다.
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()
반응형
'AI & 머신러닝 coding skill' 카테고리의 다른 글
머신러닝 분류 - 정확도(accuracy), 정밀도(precision), 재현율(recall) (0) | 2022.05.24 |
---|---|
머신러닝 분류 - 혼동 행렬(Confusion matrix) (0) | 2022.05.24 |
머신러닝 분류 - 사이킷런을 활용한 나이브 베이즈 분류 (0) | 2022.05.24 |
머신러닝 분류 - SVM(Support Vector Machine) (0) | 2022.05.24 |
머신러닝 Decision tree - 앙상블(Ensemble) 기법 - Bagging (0) | 2022.05.24 |
머신러닝 Decision tree - 앙상블(Ensemble) 기법 - Voting (0) | 2022.05.24 |
머신러닝 의사결정 나무(DecisionTree Classifier) - 분류 (0) | 2022.05.24 |
머신러닝 의사결정 나무(DecisionTree Regressor) - 회귀 (0) | 2022.05.24 |