1. naive Bayes 

- optimal classify => 오류를 줄여야 한다 => y면 y가 최대의 확률이 나오도록 함

 

1). MLE and MAP

- MLE는 이미 나온 결과만 가지고 확률을 측정(만약 학습 데이터에서 한쪽의 확률이 100%이면 나머지는 0%가 되어버린다)

 

2) Bayes Risk

- disicion boundary : 사전확률과 예측값이 같아지는 확률

 

3) optimal 방법

- 결과에 맞게 분류되도록 하는 최대 값이 나오도록 함

 

 

2. 핵심 pseudo code

 

 

1) 학습용 데이터, 테스트용 데이터

trainingData = [
    (1, "Chinese Beijing Chinese", True),
    (2, "Chinese Chinese Shanhai", True),
    (3, "Chinese Macao", True),
    (4, "Tokyo Japan Chinese", False),
]

testingData = (5, "Chinese Chinese Chinese Tokyo Japan")

 

2) 데이터셋

V = list(set([term for _ in trainingData for term in _[1].lower().split()]))
N = len(trainingData)
trueData = [_ for _ in trainingData if _[2] == True]
falseData = [_ for _ in trainingData if _[2] == False]

 

3) Textc

from collections import defaultdict

Tct = defaultdict(int)
for data in trueData:
    Nc = len(data)
    PriorC = Nc/N
    for term in data[1].lower().split():
        Tct[term] += 1
        
_Tct = defaultdict(int)
for data in falseData:
    _Nc = len(falseData)
    _PriorC = _Nc/N
    for term in data[1].lower().split():
        _Tct[term] += 1

 

4) 누적 데이터 만들기

condProbC = defaultdict(float)
_condProbC = defaultdict(float)

countSum = sum(Tct.values())
_countSum = sum(_Tct.values())

for term, freq in Tct.items():
    #condProbC[term] = freq/countSum 
    condProbC[term] = (freq+1)/(countSum+len(V)) # add one smoothing(문서가 많아져서 0이되는 문제를 해결)

for term, freq in _Tct.items():
    #condProbC[term] = freq/countSum 
    _condProbC[term] = (freq+1)/(_countSum+len(V)) # add one smoothing(문서가 많아져서 0이되는 문제를 해결)    

 

5) 

# P(C)Multi(P(Tct|C)) ===> log(P(C)) + Sum(P(Tct|C))
from math import log, exp
# Prior
result = log(PriorC)
_result = log(_PriorC)

# => Joint Prob => Conditional Independence
for term in testingData[1].lower().split():
    # Multi => Log Sum
    result += log((Tct[term]+1)/(countSum+len(V)))
    _result += log((_Tct[term]+1)/(_countSum+len(V)))
    
    
#Optimal
if result > _result:
    print("True", result, exp(result), exp(_result))
else:
    print("False", _result, exp(_result))

 

'데이터 분석가 역량' 카테고리의 다른 글

day 28 ] 성능평가  (0) 2019.06.11
Day 27 ] 기사 분류  (0) 2019.06.10
Day 22 ] Classification  (0) 2019.05.30
Day 21 ] Project2 유사도 분석  (0) 2019.05.29
Day 20] 내 파일로 분석해보기  (0) 2019.05.29

+ Recent posts