ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 나이브 베이지안 분류 (Naive Bayes Classifier) in python
    data-science-summary/summary 2020. 9. 19. 17:59
    반응형

    Naive Bayes Classifier

    Bayes theorem 에서 유도됨

    베이즈 정리란?

    사후 확률(Posterior Probability) = 가능성(Likelihood) * 사전 확률(Class Prior Probability) / 특정 개체가 발생활 확률(Predictor Prio Probability)

    P(C|X) = P(X|C) * P(C) / P(X)

    그리고 X 를 형성하는 무수히 많은 특징(feature) 들이 있을떄 식은 다음과 같음

    P(C|X) = P(x1,x2,x3...xn|C) * P(C) / P(x1,x2,x3...xn)

    그리고 이때! feature 들은 서로 독립된 변수라는 가정! => Naive 단어 쓰인 이유중 하나

    독립이니 조건부 확률이 교집합으로 나타냄.

    P(C|X) = P(x1|C) * P(x2|C) * P(x3|C) * ... * P(xn|C) * P(C) / (P(x1)P(x2)...*P(xn)

    => 각각의 특징들이 발생할 곱으로 쉽게 표현 가능

    메일(X)에 특정 단어 test(x1), free(x2) 가 포함될때 스팸(C)일 확률(P(C|x1,x2)) 은 아래와 같이 Naive 하게 구할 수 있음

    P(x1|C)P(x2|C) *P(C) / (P(x1)P(x2))

    가장 높은 확률 값을 제공하는 분류값을 찾는것이 주목적

    추가 : 가끔 없는 단어가 나오면 0이 되어버리는게 나이브 베이즈 알고리즘의 문제이다. 따라서 실제 코딩할때는 Smoothing이라는 기법을 쓴다 (간단히 해당빈도에 +1 등 조치를 하여 확률 0을 막는다.)

    3가지 나이브 베이즈 모형

    GaussianNB : 정규분포 / BernoulliNB : 베르누이분포 / MultinomialNB : 다항분포

    # 3가지 나이브 베이즈 모형
    # GaussianNB : 정규분포 / BernoulliNB : 베르누이분포 / MultinomialNB : 다항분포
    # 일반적인 연속값 속성을 가지는 데이터에 사용
    import numpy as np
    X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    y = np.array([1, 1, 1, 2, 2, 2])
    from sklearn.naive_bayes import GaussianNB
    nb = GaussianNB()
    nb.fit(X, y)
    print(nb.predict([[-0.8,-1]]))
    
    rng = np.random.RandomState(1)
    # 균일 분포의 난수 생성
    X = rng.randint(10, size=(6, 100))
    y = np.array([1, 2, 3, 4, 4, 5])
    # print(X)
    
    # 클래스 여러개(다항) 일때 주로 사용
    from sklearn.naive_bayes import MultinomialNB
    # alpha= additive laplace smoothing parameter : default 1.
    # 스무딩의 의미 : 없는 단어가 나오면 0이 되어버리는게 나이브 베이즈 알고리즘의 문제 => Smoothing 으로 특정 값을 더해줘 확률 0되는거 막음
    nb = MultinomialNB(alpha=2.0)
    nb.fit(X, y)
    print(nb.predict(X[2:3]))
    
    # 클래스가 1 , 0 또는 있다, 없다와 같이 이진속성일 경우 두개로 구분되는 binary 일 때 주로 사용.
    from sklearn.naive_bayes import BernoulliNB
    # default 1.10
    nb = BernoulliNB(alpha=2.0)
    nb.fit(X, y)
    print(nb.predict(X[2:3]))

     

    반응형

    댓글

Designed by Tistory.