2.3.4 나이브 베이즈 분류기

2.3.3 선형 모델 | 목차 | 2.3.5 결정 트리

나이브 베이즈naive bayes 분류기는 앞 절의 선형 모델과 매우 유사합니다. LogisticRegression이나 LinearSVC 같은 선형 분류기보다 훈련 속도가 빠른 편이지만, 그 대신 일반화 성능이 조금 뒤집니다.

나이브 베이즈 분류기가 효과적인 이유는 각 특성을 개별로 취급해 파라미터를 학습하고 각 특성에서 클래스별 통계를 단순하게 취합하기 때문입니다. scikit-learn에 구현된 나이브 베이즈 분류기는 GaussianNB, BernoulliNB, MultinomialNB 이렇게 세 가지입니다. GaussianNB는 연속적인 어떤 데이터에도 적용할 수 있고 BernoulliNB는 이진 데이터를, MultinomialNB는 카운트 데이터(특성이 어떤 것을 헤아린 정수 카운트로, 예를 들면 문장에 나타난 단어의 횟수입니다)에 적용됩니다. 1 BernoulliNB, MultinomialNB는 대부분 텍스트 데이터를 분류할 때 사용합니다.

BernoulliNB 분류기는 각 클래스의 특성 중 0이 아닌 것이 몇 개인지 셉니다. 예를 보면 쉽게 이해할 수 있습니다.

In[55]:

X = np.array([[0, 1, 0, 1],
              [1, 0, 1, 1],
              [0, 0, 0, 1],
              [1, 0, 1, 0]])
y = np.array([0, 1, 0, 1])

이진 특성을 4개 가진 데이터 포인트가 4개 있습니다. 클래스는 0과 1, 두 개입니다. 출력 y의 클래스가 0인 경우(첫 번째와 세 번째 데이터 포인트), 첫 번째 특성은 0이 두 번이고 0이 아닌 것은 한 번도 없습니다. 두 번째 특성은 0이 한 번이고 1도 한 번입니다. 같은 방식으로 두 번째 클래스에 해당하는 데이터 포인트에 대해서도 계산합니다. 클래스별로 0이 아닌 원소를 세는 과정을 요약하면 다음과 같습니다. 2

In[56]:

counts = {}
for label in np.unique(y):
    # 클래스마다 반복
    # 특성마다 1이 나타난 횟수를 센다.
    counts[label] = X[y == label].sum(axis=0)
print("특성 카운트:\n{}".format(counts))

Out[56]:

특성 카운트:
{0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}

다른 두 나이브 베이즈 모델 MultinomialNB와 GaussianNB는 계산하는 통계 데이터의 종류가 조금 다릅니다. MultinomialNB는 클래스별로 특성의 평균을 계산하고 GaussianNB는 클래스별로 각 특성의 표준편차와 평균을 저장합니다.

예측할 땐 데이터 포인트를 클래스의 통계 값과 비교해서 가장 잘 맞는 클래스를 예측값으로 합니다. MultinomialNB와 BernoulliNB의 예측 공식은 선형 모델과 형태가 같습니다(86페이지의 “분류용 선형 모델” 참조). 그러나 나이브 베이즈 모델의 coef_는 기울기 w가 아니라서 선형 모델과는 의미가 다릅니다. 3

장단점과 매개변수

MultinomialNB와 BernoulliNB는 모델의 복잡도를 조절하는 alpha 매개변수 하나를 가지고 있습니다. alpha가 주어지면 알고리즘이 모든 특성에 양의 값을 가진 가상의 데이터 포인트를 alpha 개수만큼 추가합니다. 이는 통계 데이터를 완만하게 만들어줍니다. alpha가 크면 더 완만해지고 모델의 복잡도는 낮아집니다. alpha에 따른 알고리즘 성능 변동은 비교적 크지 않아서, alpha 값이 성능 향상에 크게 기여하지 않습니다. 그러나 이 값을 조정하면 어느 정도는 정확도를 높일 수 있습니다.

GaussianNB는 대부분 매우 고차원인 데이터셋에 사용하고, 다른 두 나이브 베이즈 모델은 텍스트 같은 희소한 데이터를 카운트하는 데 사용합니다. MultinomialNB는 보통 0이 아닌 특성이 비교적 많은 데이터셋(예를 들어 큰 문서들)에서 BernoulliNB보다 성능이 높습니다.

나이브 베이즈 모델과 선형 모델의 장단점은 비슷합니다. 훈련과 예측 속도가 빠르며 훈련 과정을 이해하기 쉽습니다. 희소한 고차원 데이터에서 잘 작동하며 비교적 매개변수에 민감하지 않습니다. 선형 모델로는 학습 시간이 너무 오래 걸리는 매우 큰 데이터셋에는 나이브 베이즈 모델을 시도해볼 만하며 종종 사용됩니다.


  1. 옮긴이_ GaussianNB는 역속적인 데이터에, MultinomialNB와 BernoulliNB는 이산적인 데이터에 적용됩니다.
  2. 옮긴이_ 클래스의 값이 0 또는 1뿐이므로 1이 나타난 횟수를 세는 것은 특성의 값을 모두 더한 것과 같습니다. 클래스 0인 경우, 즉 첫 번째와 세 번째 행에서 1이 나타난 횟수를 행을 따라(axis=0) 합산하면 [0, 1, 0, 2]입니다. 클래스 1인 경우, 두 번째와 네 번째 행에서 1이 나타난 횟수를 행을 따라(axis=0) 합산하면 [2, 0, 2, 1]입니다.
  3. 옮긴이_ MultinomialNB와 BernoulliNB의 coef_는 특성 카운트 수를 로그 변환한 형태이고 intercept_는 클래스 카운트 수를 로그 변환한 것입니다. 예측을 할 때 선형 함수처럼 데이터 포인트에 coef_를 곱하고 intercept_를 더하여 클래스에 속할 확률을 계산합니다.

2.3.3 선형 모델 | 목차 | 2.3.5 결정 트리

이 글은 한빛미디어에서 출간한  “파이썬 라이브러리를 활용한 머신러닝“의 1장과 2장입니다. 이 책의 저작권은 한빛미디어(주)에 있으므로 무단 복제 및 무단 전제를 금합니다.

2.3.4 나이브 베이즈 분류기”에 대한 4개의 생각

  1. 류리

    안녕하세요 책 보다가 궁금한게 생겨서 댓글 남깁니다.
    in[55]에 보면 첫 번째 특성은 0이 두 번이고 0이 아닌 것은 한 번도 없습니다. 이 말이 있는데
    이 말이 무슨 뜻인지 이해가 안돼서 그런데 다시 한 번 알려주실 수 있나요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 타깃이 0인 경우 첫 번째와 세 번째 샘플을 떼어 놓고 보면 [[0, 1, 0, 1], [0, 0, 0, 1]]입니다. 첫 번째 특성은 모두 0(0이 두번)이고 1(0이 아닌 것)인 것은 한 번도 없죠. 이해하는데 도움이 되셨으면 좋겠네요. 감사합니다.

      좋아요

      응답
  2. Ryan

    안녕하세요 질문이 있어서 답글 남깁니다
    ‘출력 y의 클래스가 0인 경우(첫 번째와 세 번째 데이터 포인트), 첫 번째 특성은 0이 두 번이고 0이 아닌 것은 한 번도 없습니다. 두 번째 특성은 0이 한 번이고 1도 한 번입니다.’

    이 말에서 두번째 특성(1,0,1,1)에서 0은 한번도 없고 1이 두 번 아닌가요?

    좋아요

    응답

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.