나이브 베이즈 (Naive Bayes)
난이도: 초급~중급
선수 지식: 확률론 기초 (조건부 확률, 베이즈 정리)
관련 문서: 선형 모델 | 정규화 이론 | 앙상블 방법
핵심 요약: 나이브 베이즈(Naive Bayes)는 각 특성(Feature)의 확률을 독립적으로 곱해서 분류하는 모델이다. “나이브(Naive)“는 특성 간 조건부 독립(Conditional Independence)이라는 단순한 가정에서 유래했으며, 이 가정이 현실에서 틀리더라도 텍스트 분류(Text Classification)나 스팸 필터(Spam Filter)에서 놀랍도록 잘 동작한다.
핵심 용어 미리보기:
- 사전 확률 (Prior, ): 데이터를 보기 전에 각 클래스가 얼마나 흔한지에 대한 사전 믿음
- 우도 (Likelihood, ): 특정 클래스에서 해당 특성값이 나올 확률
- 사후 확률 (Posterior, ): 데이터를 관찰한 뒤 업데이트된 클래스 확률 (우리가 알고 싶은 것)
- 라플라스 스무딩 (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의 초기 스팸 필터에도 영향을 미쳤다.
나이브 베이즈가 스팸 필터의 핵심이 된 이유는 실용적이었다: 학습과 예측이 극도로 빠르고, 적은 데이터로도 동작하며, 새로운 이메일 패턴에 점진적으로 적응할 수 있었다. “틀린 가정(특성 독립)인데 왜 잘 작동하는가?”라는 질문에 대한 직관적 답은 이렇다: 여러 사람의 추정 오류가 평균에서 서로 상쇄되듯, 개별 특성의 독립 가정 위반으로 인한 오류도 클래스 간에 대칭적으로 상쇄되기 때문이다.
핵심 개념
섹션 제목: “핵심 개념”1. 베이즈 정리 기초
섹션 제목: “1. 베이즈 정리 기초”
| 항 | 이름 | 의미 |
|---|---|---|
| 사후 확률 (Posterior) | 데이터가 주어졌을 때 클래스의 확률 | |
| 우도 (Likelihood) | 해당 클래스에서 데이터가 나올 확률 | |
| 사전 확률 (Prior) | 클래스의 사전 확률 | |
| 증거 (Evidence) | 정규화 상수 (모든 클래스에 동일) |
숫자로 이해하기
섹션 제목: “숫자로 이해하기”이메일이 스팸인지 판별하는 예를 생각해 보자. 훈련 데이터에서 다음을 관찰했다:
- 사전 확률(Prior): ,
- 우도(Likelihood): ,
- ,
새 이메일에 “무료”와 “돈”이 모두 포함되어 있다면:
스팸 점수(0.192)가 정상 점수(0.003)보다 훨씬 크므로 → 스팸으로 분류한다. 정규화하면 이다.
2. 나이브(Naive) 가정
섹션 제목: “2. 나이브(Naive) 가정”조건부 독립 가정:
이 가정 덕분에 결합 확률 대신 각 특성의 개별 조건부 확률만 추정하면 된다.
결정 규칙
섹션 제목: “결정 규칙”
실제 구현에서는 언더플로(underflow) 방지를 위해 로그 확률을 사용:
3. 변형들 (Variants)
섹션 제목: “3. 변형들 (Variants)”가우시안 나이브 베이즈 (Gaussian Naive Bayes)
섹션 제목: “가우시안 나이브 베이즈 (Gaussian Naive Bayes)”
- 연속형 특성에 적합
- 각 클래스별로 평균 과 분산 를 훈련 데이터에서 추정
- 특성이 대략 정규분포를 따를 때 효과적
다항 나이브 베이즈 (Multinomial Naive Bayes)
섹션 제목: “다항 나이브 베이즈 (Multinomial Naive Bayes)”
- 카운트 데이터에 적합 (단어 빈도, TF-IDF)
- 텍스트 분류의 표준 모델
- : 라플라스 스무딩 파라미터
베르누이 나이브 베이즈 (Bernoulli Naive Bayes)
섹션 제목: “베르누이 나이브 베이즈 (Bernoulli Naive Bayes)”
- 이진 특성(존재/부재)에 적합
- 특성의 부재도 명시적으로 페널티 부여
- 다항 NB와 달리 특성이 0일 때도 확률에 기여
보완 나이브 베이즈 (Complement Naive Bayes)
섹션 제목: “보완 나이브 베이즈 (Complement Naive Bayes)”- 불균형 데이터셋을 위한 변형
- 해당 클래스가 아닌 보완 클래스에서 추정치를 계산
4. 라플라스 스무딩 (Laplace Smoothing)
섹션 제목: “4. 라플라스 스무딩 (Laplace Smoothing)”훈련 데이터에서 특정 특성 값이 특정 클래스에서 한 번도 나타나지 않으면 이 되어, 전체 사후 확률이 0이 됨.
모든 카운트에 를 더함 (일반적으로 ):
- 확률이 정확히 0이 되는 것을 방지
- 정규화(regularization)와 유사한 효과
- 가 크면 균일 분포에 가까워지고, 가 작으면 데이터에 더 의존
상세 내용
섹션 제목: “상세 내용”왜 “나이브” 가정이 틀린데도 잘 동작하는가?
섹션 제목: “왜 “나이브” 가정이 틀린데도 잘 동작하는가?”이것은 나이브 베이즈에서 가장 중요하고 흥미로운 질문이다:
-
분류는 순서만 맞으면 된다: 정확한 사후 확률이 아니라, 클래스 간 확률의 순서(ordering)만 올바르면 정확한 분류가 가능하다.
-
오류가 상쇄된다: 개별 확률 추정의 오류가 클래스 간에 대칭적으로 분포하면 서로 상쇄된다 (Dominguez & Pazzani, 1997).
-
Zero-One 손실에 최적: 확률 추정이 부정확하더라도 Zero-One 손실(정확한 분류 여부)에서는 최적일 수 있다 (Zhang, 2004).
-
높은 편향, 낮은 분산: 강한 가정은 편향을 증가시키지만, 적은 파라미터로 인해 분산이 매우 낮다. 데이터가 적을 때 이 트레이드오프가 유리하다.
확률 보정 (Probability Calibration)
섹션 제목: “확률 보정 (Probability Calibration)”나이브 베이즈의 확률 출력은 보정이 잘 되어 있지 않다 (극단적인 값으로 치우침). 정확한 확률이 필요한 경우 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로 설정한다””- 는 하이퍼파라미터이며, 교차 검증으로 최적값을 찾아야 한다. 특히 불균형 데이터에서 중요하다.
다른 주제와의 연결
섹션 제목: “다른 주제와의 연결”- 선형 모델: 로지스틱 회귀와의 비교 (판별 모델 vs 생성 모델)
- 정규화 이론: 라플라스 스무딩의 정규화 효과
- 앙상블 방법: 나이브 베이즈를 앙상블의 기본 학습기로 활용
- 과적합과 과소적합: 높은 편향-낮은 분산의 대표적 모델
NB 변형 비교표
섹션 제목: “NB 변형 비교표”| 속성 | 가우시안 | 다항 | 베르누이 |
|---|---|---|---|
| 특성 유형 | 연속형 | 카운트 | 이진 |
| 분포 가정 | 정규분포 | 다항분포 | 베르누이분포 |
| 대표 사용처 | 일반 분류 | 텍스트 분류 | 짧은 텍스트 |
| 부재 특성 처리 | 해당 없음 | 무시 | 명시적 페널티 |
| 스무딩 | 해당 없음 | 라플라스 | 라플라스 |
자주 묻는 면접 질문
섹션 제목: “자주 묻는 면접 질문”-
나이브 베이즈가 잘못된 가정에도 동작하는 이유는?
- 분류는 확률 순서만 맞으면 되고, 독립 가정의 오류가 클래스 간에 상쇄되기 때문
-
텍스트 분류에서 다항 NB vs 베르누이 NB?
- 다항: 단어 빈도 사용, 긴 문서에 유리. 베르누이: 존재 여부만, 짧은 문서에 유리
-
훈련 데이터에 없는 특성 값을 어떻게 처리하는가?
- 라플라스 스무딩(Laplace Smoothing): 모든 카운트에 추가
-
나이브 베이즈가 더 복잡한 모델보다 나은 경우는?
- 데이터가 매우 적거나, 특성 수가 매우 많거나, 실시간 예측이 필요하거나, 빠른 프로토타이핑이 목적일 때
코드 예시
섹션 제목: “코드 예시”from sklearn.naive_bayes import ( GaussianNB, MultinomialNB, BernoulliNB, ComplementNB)from sklearn.feature_extraction.text import TfidfVectorizerfrom 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”