머신러닝(파이썬) - Naive Bayes Classifier _확률 업데이트(1)

LSH·2023년 7월 4일
0

교육 정보

  • 교육 명: 경기미래기술학교 AI 교육
  • 교육 기간: 2023.05.08 ~ 2023.10.31
  • 오늘의 커리큘럼:
    파이썬 기반의 머신러닝 이해와 실습 (06/14~07/07)
  • 강사: 양정은 강사님
  • 강의 계획:
    1. 개발환경세팅 - IDE, 가상환경
    2. 인공지능을 위한 Python
    3. KNN 구현을 위한 NumPy
    4. K Nearest Neighbors Classification 구현
    5. K Means Clustering Mini-project
    6. Scikit-learn을 이용한 SVM의 학습
    7. Decision Tree의 개념
    8. ID3 Algorithm
    9. Impurity Metrics - Information Gain Ratio, Gini Index
    10. Decision Tree 구현
    11. 확률 기초
    12. Bayes 정리 예시
    13. Naive Bayes Classifier
    14. Gaussian Naive Bayes Classifier

Naive Bayes Classifier

Bayes 이론 Pandas 적용하기

import pandas as pd

table = pd.DataFrame(index=['cancer', 'healthy'])
table['prior'] = 0.001, 0.999
table['likelihood'] = 0.95, 0.02

table['unnorm'] = table['prior'] * table['likelihood']
# 이 상태(joint prob)에서는 다 더해도 1이 아니므로 normailzation이 되지 않은것
norm_constant = table['unnorm'].sum()
table['posterior'] = table['unnorm'] / norm_constant

print(table)
print()

g_table = pd.DataFrame(index=['class1', 'class2', 'class3'])
g_table['prior'] = 1 / 3, 1 / 3, 1 / 3
g_table['likelihood'] = 0.6, 0.5, 0.4
g_table['unnorm'] = g_table['prior'] * g_table['likelihood']
g_norm_constant = g_table['unnorm'].sum()
g_table['posterior'] = g_table['unnorm'] / g_norm_constant

print(g_table)
print()
#
# 결과
         prior  likelihood   unnorm  posterior
cancer   0.001        0.95  0.00095   0.045389
healthy  0.999        0.02  0.01998   0.954611

           prior  likelihood    unnorm  posterior
class1  0.333333         0.6  0.200000   0.400000
class2  0.333333         0.5  0.166667   0.333333
class3  0.333333         0.4  0.133333   0.266667
  • 함수화 하기
def get_posterior(data):
    data['unnorm'] = data['prior'] * data['likelihood']
    norm_constant = data['unnorm'].sum()
    data['posterior'] = data['unnorm'] / norm_constant
    return data

table = pd.DataFrame(index=['cancer', 'healthy'])
table['prior'] = 0.001, 0.999
table['likelihood'] = 0.95, 0.02

table = get_posterior(table)
print(table, '\n')

g_table = pd.DataFrame(index=['class1', 'class2', 'class3'])
g_table['prior'] = 1 / 3, 1 / 3, 1 / 3
g_table['likelihood'] = 0.6, 0.5, 0.4

g_table = get_posterior(g_table)
print(g_table, '\n')
#
# 결과
         prior  likelihood   unnorm  posterior
cancer   0.001        0.95  0.00095   0.045389
healthy  0.999        0.02  0.01998   0.954611 

           prior  likelihood    unnorm  posterior
class1  0.333333         0.6  0.200000   0.400000
class2  0.333333         0.5  0.166667   0.333333
class3  0.333333         0.4  0.133333   0.266667 

📕 강사님 코드

def get_posterior(data, likelihood):
    data['likelihood'] = likelihood
    data['unnorm'] = data['prior'] * data['likelihood']
    norm_constant = data['unnorm'].sum()
    data['posterior'] = data['unnorm'] / norm_constant
    return data
table = pd.DataFrame(index=['cancer', 'healthy'])
table['prior'] = 0.001, 0.999
table = get_posterior(table, likelihood=[0.95, 0.02])
print(table, '\n')
g_table = pd.DataFrame(index=['class1', 'class2', 'class3'])
g_table['prior'] = 1 / 3, 1 / 3, 1 / 3
g_table = get_posterior(g_table, likelihood=[0.6, 0.5, 0.4])
print(g_table, '\n')
#
# 결과
         prior  likelihood   unnorm  posterior
cancer   0.001        0.95  0.00095   0.045389
healthy  0.999        0.02  0.01998   0.954611 
           prior  likelihood    unnorm  posterior
class1  0.333333         0.6  0.200000   0.400000
class2  0.333333         0.5  0.166667   0.333333
class3  0.333333         0.4  0.133333   0.266667 
  • point
  1. prior가 포함된 테이블을 인수로 넣음
    • prior는 계속 업데이트 되므로 처음 한번만 넣으면 됨
  2. likelihood를 따로 인수로 넣음
    • likelihood는 정보가 들어올때 바뀔 수 있으므로 인수로 넣음

Spam Ham 확률 계산

  • 정보 (스팸일 확률 기준)

    • prior probability: 스팸일 확률 0.5, 스팸일 확률 X 0.5
    • 1st 정보 (링크 포함 여부): 링크 있으면 0.6, 링크 없으면 0.2
    • 2nd 정보 (특정 단어 포함 여부): 특정 단어(W) 있으면 0.4, 특정단어(W) 없으면 0.05
  • 2개의 조건을 각각 사용

→ 두 조건을 하나씩 사용하여 확률을 업데이트 했을때는 W 조건이 더 높은 확률을 반환함


  • 2개의 조건을 같이 사용해보기

→ 두 조건을 동시에 적용해서 Posterior Probability를 구할 수 있음


  • 두 조건을 순차적으로 적용
    • 실제 bayes 알고리즘은 연쇄적으로 하나의 정보를 받아서 확률을 업데이트 하고
      업데이트 된 확률(Posterior Probability)을 Prior 값으로 사용해서 두번째 정보를 받아서 다시 확률을 업데이트 하는 순서로 진행
      → 정보가 들어올때 마다 확률이 업데이트 됨

1st step

2nd step

(참고) MLE, MAP

  • MLE, Maximum Likelihood Estimation
    : Likelihood 기반 판단
  • MAP, Maximum A Posterior Probability
    : Posterior Probabaility 기반 판단


    ex)
  • 연구실에 긴 머리카락
    → 여자가 떨어뜨렸을 확률이 높음 (MLE)

  • 연구실에 긴 머리카락 + 연구실 100 명이 있는데 그 중 여자는 한명, 긴 머리의 남자는 스무 명
    → 남자가 떨어뜨렸을 확률이 높음 (MAP)
profile
:D

0개의 댓글