콘텐츠로 이동

나이브 베이즈 (Naive Bayes)

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


핵심 요약: 나이브 베이즈(Naive Bayes)는 각 특성(Feature)의 확률을 독립적으로 곱해서 분류하는 모델이다. “나이브(Naive)“는 특성 간 조건부 독립(Conditional Independence)이라는 단순한 가정에서 유래했으며, 이 가정이 현실에서 틀리더라도 텍스트 분류(Text Classification)나 스팸 필터(Spam Filter)에서 놀랍도록 잘 동작한다.

핵심 용어 미리보기:

  • 사전 확률 (Prior, P(C)P(C)): 데이터를 보기 전에 각 클래스가 얼마나 흔한지에 대한 사전 믿음
  • 우도 (Likelihood, P(xC)P(x|C)): 특정 클래스에서 해당 특성값이 나올 확률
  • 사후 확률 (Posterior, P(Cx)P(C|x)): 데이터를 관찰한 뒤 업데이트된 클래스 확률 (우리가 알고 싶은 것)
  • 라플라스 스무딩 (Laplace Smoothing): 한 번도 본 적 없는 특성값의 확률이 0이 되는 문제를 방지하기 위해 카운트에 작은 값을 더하는 기법

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

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


나이브 베이즈의 뿌리는 18세기까지 거슬러 올라간다. Thomas Bayes (1701-1761)는 영국의 장로교 목사이자 수학자였다. 그는 “역확률(inverse probability)” 문제 — 관찰된 결과로부터 원인의 확률을 추론하는 문제 — 에 대한 해법을 연구했고, 이 유고 논문이 1763년에 출판되었다. 이것이 바로 베이즈 정리(Bayes’ Theorem)의 시초이다.

베이즈 정리가 머신러닝의 실용적 도구로 재탄생한 것은 1990년대 스팸 필터링 문제에서였다. 1998년, Microsoft Research의 Sahami 등은 나이브 베이즈를 이메일 분류에 적용한 연구를 발표했다. 이후 Paul Graham (2002)이 “A Plan for Spam”이라는 에세이에서 베이지안 스팸 필터의 실용성을 대중화했고, 이는 Gmail의 초기 스팸 필터에도 영향을 미쳤다.

나이브 베이즈가 스팸 필터의 핵심이 된 이유는 실용적이었다: 학습과 예측이 극도로 빠르고, 적은 데이터로도 동작하며, 새로운 이메일 패턴에 점진적으로 적응할 수 있었다. “틀린 가정(특성 독립)인데 왜 잘 작동하는가?”라는 질문에 대한 직관적 답은 이렇다: 여러 사람의 추정 오류가 평균에서 서로 상쇄되듯, 개별 특성의 독립 가정 위반으로 인한 오류도 클래스 간에 대칭적으로 상쇄되기 때문이다.


P(Cx)=P(xC)P(C)P(x)P(C|\mathbf{x}) = \frac{P(\mathbf{x}|C) \cdot P(C)}{P(\mathbf{x})}

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

이메일이 스팸인지 판별하는 예를 생각해 보자. 훈련 데이터에서 다음을 관찰했다:

  • 사전 확률(Prior): P(스팸)=0.4P(\text{스팸}) = 0.4, P(정상)=0.6P(\text{정상}) = 0.6
  • 우도(Likelihood): P("무료"스팸)=0.8P(\text{"무료"} | \text{스팸}) = 0.8, P("무료"정상)=0.1P(\text{"무료"} | \text{정상}) = 0.1
  • P("돈"스팸)=0.6P(\text{"돈"} | \text{스팸}) = 0.6, P("돈"정상)=0.05P(\text{"돈"} | \text{정상}) = 0.05

새 이메일에 “무료”와 “돈”이 모두 포함되어 있다면:

  • P(스팸)×P("무료"스팸)×P("돈"스팸)=0.4×0.8×0.6=0.192P(\text{스팸}) \times P(\text{"무료"} | \text{스팸}) \times P(\text{"돈"} | \text{스팸}) = 0.4 \times 0.8 \times 0.6 = 0.192
  • P(정상)×P("무료"정상)×P("돈"정상)=0.6×0.1×0.05=0.003P(\text{정상}) \times P(\text{"무료"} | \text{정상}) \times P(\text{"돈"} | \text{정상}) = 0.6 \times 0.1 \times 0.05 = 0.003

스팸 점수(0.192)가 정상 점수(0.003)보다 훨씬 크므로 → 스팸으로 분류한다. 정규화하면 P(스팸)=0.1920.192+0.00398.5%P(\text{스팸}) = \frac{0.192}{0.192 + 0.003} \approx 98.5\%이다.

조건부 독립 가정:

P(x1,x2,...,xnC)=i=1nP(xiC)P(x_1, x_2, ..., x_n | C) = \prod_{i=1}^{n} P(x_i | C)

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

C^=argmaxC  P(C)i=1nP(xiC)\hat{C} = \arg\max_C \; P(C) \prod_{i=1}^{n} P(x_i | C)

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

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


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

섹션 제목: “가우시안 나이브 베이즈 (Gaussian Naive Bayes)”

P(xiC)=12πσC2exp((xiμC)22σC2)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)

  • 연속형 특성에 적합
  • 각 클래스별로 평균 μC\mu_C과 분산 σC2\sigma_C^2를 훈련 데이터에서 추정
  • 특성이 대략 정규분포를 따를 때 효과적

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

섹션 제목: “다항 나이브 베이즈 (Multinomial Naive Bayes)”

P(xiC)=NCi+αNC+αnP(x_i|C) = \frac{N_{Ci} + \alpha}{N_C + \alpha n}

  • 카운트 데이터에 적합 (단어 빈도, TF-IDF)
  • 텍스트 분류의 표준 모델
  • α\alpha: 라플라스 스무딩 파라미터

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

섹션 제목: “베르누이 나이브 베이즈 (Bernoulli Naive Bayes)”

P(xC)=i=1n[P(xiC)xi(1P(xiC))(1xi)]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)

섹션 제목: “보완 나이브 베이즈 (Complement Naive Bayes)”
  • 불균형 데이터셋을 위한 변형
  • 해당 클래스가 아닌 보완 클래스에서 추정치를 계산

보완 나이브 베이즈 (Complement Naive Bayes) 다이어그램

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

섹션 제목: “4. 라플라스 스무딩 (Laplace Smoothing)”

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

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

P(xiC)=NCi+αNC+αnP(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. 높은 편향, 낮은 분산: 강한 가정은 편향을 증가시키지만, 적은 파라미터로 인해 분산이 매우 낮다. 데이터가 적을 때 이 트레이드오프가 유리하다.

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


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

Gmail 초기 스팸 필터가 나이브 베이즈를 채택한 이유

섹션 제목: “Gmail 초기 스팸 필터가 나이브 베이즈를 채택한 이유”

2004년 Gmail이 출시되었을 때, 스팸 메일은 이미 전체 이메일 트래픽의 70% 이상을 차지하는 심각한 문제였다. Google은 초기 스팸 필터링 시스템의 핵심 구성 요소로 나이브 베이즈를 채택했다.

그 선택에는 명확한 이유가 있었다. 첫째, 실시간 처리 속도이다. 나이브 베이즈의 예측은 단순한 곱셈과 비교 연산으로, 초당 수백만 건의 이메일을 분류할 수 있었다. 둘째, 온라인 학습(Online Learning)이 용이했다. 사용자가 “스팸 신고” 버튼을 누를 때마다 각 단어의 조건부 확률을 점진적으로 업데이트할 수 있었다. 셋째, 새로운 스팸 패턴에 대한 빠른 적응이 가능했다. “viagra”가 스팸 단어로 학습되면 스패머들은 “v1agra”로 변형했는데, 이런 변형도 새로운 특성으로 빠르게 학습되었다.

물론 시간이 지나며 Gmail의 스팸 필터는 나이브 베이즈 단독이 아닌 다중 모델 앙상블, 딥러닝 기반 시스템으로 발전했다. 그러나 나이브 베이즈가 보여준 “단순한 모델의 놀라운 효과”는 ML 시스템 설계의 중요한 교훈으로 남아 있다: 처음부터 복잡한 모델을 구축하기보다, 단순하고 빠른 모델로 시작하여 점진적으로 개선하는 것이 실무적으로 현명한 전략이다.


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

섹션 제목: “1. “나이브 베이즈는 너무 단순해서 쓸모없다””
  • 텍스트 분류에서는 복잡한 모델과 비슷하거나 더 나은 성능을 보이는 경우가 많다. 특히 데이터가 적을 때 유리하다.

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

섹션 제목: “2. “특성이 독립이 아니면 나이브 베이즈를 쓸 수 없다””
  • 독립 가정이 틀려도 분류 정확도는 높을 수 있다. 중요한 것은 확률의 절대값이 아니라 클래스 간 순서이다.

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

섹션 제목: “3. “다항 NB와 베르누이 NB는 같다””
  • 다항 NB는 단어의 빈도를 사용하고, 베르누이 NB는 단어의 존재/부재만 사용한다. 짧은 문서에서는 베르누이가, 긴 문서에서는 다항이 유리할 수 있다.

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

섹션 제목: “4. “라플라스 스무딩은 무조건 1로 설정한다””
  • α\alpha는 하이퍼파라미터이며, 교차 검증으로 최적값을 찾아야 한다. 특히 불균형 데이터에서 중요하다.


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

  1. 나이브 베이즈가 잘못된 가정에도 동작하는 이유는?

    • 분류는 확률 순서만 맞으면 되고, 독립 가정의 오류가 클래스 간에 상쇄되기 때문
  2. 텍스트 분류에서 다항 NB vs 베르누이 NB?

    • 다항: 단어 빈도 사용, 긴 문서에 유리. 베르누이: 존재 여부만, 짧은 문서에 유리
  3. 훈련 데이터에 없는 특성 값을 어떻게 처리하는가?

    • 라플라스 스무딩(Laplace Smoothing): 모든 카운트에 α\alpha 추가
  4. 나이브 베이즈가 더 복잡한 모델보다 나은 경우는?

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

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”