콘텐츠로 이동

나이브 베이즈 (Naive Bayes)

난이도: 초급~중급
선수 지식: 확률론 기초 (조건부 확률, 베이즈 정리)
관련 문서: 선형 모델 | 정규화 이론 | 앙상블 방법


개요

나이브 베이즈(Naive Bayes)는 베이즈 정리(Bayes' Theorem)에 기반한 확률적 분류기이다. "나이브(Naive)"라는 이름은 특성들이 주어진 클래스 내에서 조건부 독립이라는 강한(그리고 거의 항상 틀린) 가정에서 유래한다.

이 단순한 가정에도 불구하고, 나이브 베이즈는 텍스트 분류, 스팸 필터링 등에서 놀랍도록 좋은 성능을 보이며, 훈련과 예측이 매우 빠르고 적은 데이터로도 동작한다.


핵심 개념

1. 베이즈 정리 기초

\[P(C|\mathbf{x}) = \frac{P(\mathbf{x}|C) \cdot P(C)}{P(\mathbf{x})}\]
이름 의미
\(P(C \| \mathbf{x})\) 사후 확률 (Posterior) 데이터가 주어졌을 때 클래스의 확률
\(P(\mathbf{x} \| C)\) 우도 (Likelihood) 해당 클래스에서 데이터가 나올 확률
\(P(C)\) 사전 확률 (Prior) 클래스의 사전 확률
\(P(\mathbf{x})\) 증거 (Evidence) 정규화 상수 (모든 클래스에 동일)

2. 나이브(Naive) 가정

조건부 독립 가정:

\[P(x_1, x_2, ..., x_n | C) = \prod_{i=1}^{n} P(x_i | C)\]

이 가정 덕분에 결합 확률 대신 각 특성의 개별 조건부 확률만 추정하면 된다.

결정 규칙

\[\hat{C} = \arg\max_C \; P(C) \prod_{i=1}^{n} P(x_i | C)\]

실제 구현에서는 언더플로(underflow) 방지를 위해 로그 확률을 사용:

\[\hat{C} = \arg\max_C \; \left[\log P(C) + \sum_{i=1}^{n} \log P(x_i | C)\right]\]

3. 변형들 (Variants)

가우시안 나이브 베이즈 (Gaussian Naive Bayes)

\[P(x_i|C) = \frac{1}{\sqrt{2\pi\sigma_C^2}} \exp\left(-\frac{(x_i - \mu_C)^2}{2\sigma_C^2}\right)\]
  • 연속형 특성에 적합
  • 각 클래스별로 평균 \(\mu_C\)과 분산 \(\sigma_C^2\)를 훈련 데이터에서 추정
  • 특성이 대략 정규분포를 따를 때 효과적

다항 나이브 베이즈 (Multinomial Naive Bayes)

\[P(x_i|C) = \frac{N_{Ci} + \alpha}{N_C + \alpha n}\]
  • 카운트 데이터에 적합 (단어 빈도, TF-IDF)
  • 텍스트 분류의 표준 모델
  • \(\alpha\): 라플라스 스무딩 파라미터

베르누이 나이브 베이즈 (Bernoulli Naive Bayes)

\[P(\mathbf{x}|C) = \prod_{i=1}^{n} \left[P(x_i|C)^{x_i} \cdot (1-P(x_i|C))^{(1-x_i)}\right]\]
  • 이진 특성(존재/부재)에 적합
  • 특성의 부재도 명시적으로 페널티 부여
  • 다항 NB와 달리 특성이 0일 때도 확률에 기여

보완 나이브 베이즈 (Complement Naive Bayes)

  • 불균형 데이터셋을 위한 변형
  • 해당 클래스가 아닌 보완 클래스에서 추정치를 계산
flowchart TD
    A[특성 유형은?] --> B{연속형?}
    B -->|예| C[가우시안 NB]
    B -->|아니오| D{이진형?}
    D -->|예| E[베르누이 NB]
    D -->|아니오| F{카운트 데이터?}
    F -->|예| G[다항 NB]
    F -->|불균형?| H[보완 NB]

4. 라플라스 스무딩 (Laplace Smoothing)

문제

훈련 데이터에서 특정 특성 값이 특정 클래스에서 한 번도 나타나지 않으면 \(P(x_i|C) = 0\)이 되어, 전체 사후 확률이 0이 됨.

해결

모든 카운트에 \(\alpha\)를 더함 (일반적으로 \(\alpha = 1\)):

\[P(x_i|C) = \frac{N_{Ci} + \alpha}{N_C + \alpha \cdot n}\]

효과

  • 확률이 정확히 0이 되는 것을 방지
  • 정규화(regularization)와 유사한 효과
  • \(\alpha\)가 크면 균일 분포에 가까워지고, \(\alpha\)가 작으면 데이터에 더 의존

상세 내용

왜 "나이브" 가정이 틀린데도 잘 동작하는가?

이것은 나이브 베이즈에서 가장 중요하고 흥미로운 질문이다:

  1. 분류는 순서만 맞으면 된다: 정확한 사후 확률이 아니라, 클래스 간 확률의 순서(ordering)만 올바르면 정확한 분류가 가능하다.

  2. 오류가 상쇄된다: 개별 확률 추정의 오류가 클래스 간에 대칭적으로 분포하면 서로 상쇄된다 (Dominguez & Pazzani, 1997).

  3. Zero-One 손실에 최적: 확률 추정이 부정확하더라도 Zero-One 손실(정확한 분류 여부)에서는 최적일 수 있다 (Zhang, 2004).

  4. 높은 편향, 낮은 분산: 강한 가정은 편향을 증가시키지만, 적은 파라미터로 인해 분산이 매우 낮다. 데이터가 적을 때 이 트레이드오프가 유리하다.

확률 보정 (Probability Calibration)

나이브 베이즈의 확률 출력은 보정이 잘 되어 있지 않다 (극단적인 값으로 치우침). 정확한 확률이 필요한 경우 Platt Scaling이나 Isotonic Regression으로 보정해야 한다.


언제 사용하는가

상황 추천 여부
텍스트 분류 (스팸 필터링, 감성 분석) 매우 적합 (다항 NB)
실시간 예측이 필요한 경우 적합 (O(1) 예측)
데이터가 매우 적은 경우 적합 (적은 파라미터)
베이스라인 모델이 필요한 경우 적합
다중 클래스, 클래스가 매우 많은 경우 적합
특성 간 상호작용이 중요한 경우 부적합
정확한 확률 추정이 필요한 경우 부적합 (보정 필요)
연속형 특성이 정규분포를 따르지 않는 경우 가우시안 NB 부적합

흔한 오해와 함정

1. "나이브 베이즈는 너무 단순해서 쓸모없다"

  • 텍스트 분류에서는 복잡한 모델과 비슷하거나 더 나은 성능을 보이는 경우가 많다. 특히 데이터가 적을 때 유리하다.

2. "특성이 독립이 아니면 나이브 베이즈를 쓸 수 없다"

  • 독립 가정이 틀려도 분류 정확도는 높을 수 있다. 중요한 것은 확률의 절대값이 아니라 클래스 간 순서이다.

3. "다항 NB와 베르누이 NB는 같다"

  • 다항 NB는 단어의 빈도를 사용하고, 베르누이 NB는 단어의 존재/부재만 사용한다. 짧은 문서에서는 베르누이가, 긴 문서에서는 다항이 유리할 수 있다.

4. "라플라스 스무딩은 무조건 1로 설정한다"

  • \(\alpha\)는 하이퍼파라미터이며, 교차 검증으로 최적값을 찾아야 한다. 특히 불균형 데이터에서 중요하다.

다른 주제와의 연결


NB 변형 비교표

속성 가우시안 다항 베르누이
특성 유형 연속형 카운트 이진
분포 가정 정규분포 다항분포 베르누이분포
대표 사용처 일반 분류 텍스트 분류 짧은 텍스트
부재 특성 처리 해당 없음 무시 명시적 페널티
스무딩 해당 없음 라플라스 라플라스

자주 묻는 면접 질문

  1. 나이브 베이즈가 잘못된 가정에도 동작하는 이유는?
  2. 분류는 확률 순서만 맞으면 되고, 독립 가정의 오류가 클래스 간에 상쇄되기 때문

  3. 텍스트 분류에서 다항 NB vs 베르누이 NB?

  4. 다항: 단어 빈도 사용, 긴 문서에 유리. 베르누이: 존재 여부만, 짧은 문서에 유리

  5. 훈련 데이터에 없는 특성 값을 어떻게 처리하는가?

  6. 라플라스 스무딩(Laplace Smoothing): 모든 카운트에 \(\alpha\) 추가

  7. 나이브 베이즈가 더 복잡한 모델보다 나은 경우는?

  8. 데이터가 매우 적거나, 특성 수가 매우 많거나, 실시간 예측이 필요하거나, 빠른 프로토타이핑이 목적일 때

코드 예시

from sklearn.naive_bayes import (
    GaussianNB, MultinomialNB, BernoulliNB, ComplementNB
)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline

# 가우시안 NB (연속 특성)
gnb = GaussianNB()
gnb.fit(X_train, y_train)

# 다항 NB (텍스트 분류)
text_clf = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('nb', MultinomialNB(alpha=1.0))  # alpha: 라플라스 스무딩
])
text_clf.fit(texts_train, y_train)

# 베르누이 NB (이진 특성)
bnb = BernoulliNB(alpha=1.0, binarize=0.5)
bnb.fit(X_train, y_train)

# 보완 NB (불균형 데이터)
cnb = ComplementNB(alpha=1.0)
cnb.fit(X_train, y_train)

용어 정리

영어 한국어
Naive Bayes 나이브 베이즈
Bayes' Theorem 베이즈 정리
Prior 사전 확률
Posterior 사후 확률
Likelihood 우도 (가능도)
Conditional Independence 조건부 독립
Laplace Smoothing 라플라스 스무딩
Generative Model 생성 모델
Discriminative Model 판별 모델

참고 자료

  • Zhang (2004) - "The Optimality of Naive Bayes"
  • Dominguez & Pazzani (1997) - "On the Optimality of the Simple Bayesian Classifier under Zero-One Loss"
  • McCallum & Nigam (1998) - "A Comparison of Event Models for Naive Bayes Text Classification"
  • Rennie et al. (2003) - "Tackling the Poor Assumptions of Naive Bayes Text Classifiers"