Naive Bayes
나이브 베이즈 분류기는 베이즈 정리를 적용하고 클래스가 주어지면 특성들이 서로 독립이라고 가정합니다. 변형, 스팸 필터링, 한계, Python 코드를 다룹니다.
나이브 베이즈는 클래스가 알려진 뒤에는 특징이 서로 독립적이라는 "순진한" 가정 아래 베이즈 정리를 적용하는 확률적 분류기 계열입니다. 이 가정 덕분에 모델은 각 클래스 내에서 특징의 분포를 개별적으로 학습할 수 있습니다. 따라서 학습 데이터를 한 번 순회하며 개수를 세는 것만으로 학습이 끝나고, 예측은 저장된 몇 가지 확률을 결합해 수행됩니다. Mehran Sahami와 동료들은 1998년에 이를 정크 이메일에 적용했고, 이를 기반으로 한 베이지안 스팸 필터가 2000년대 초에 확산되었습니다. 나이브 베이즈는 텍스트 및 기타 초고차원 데이터의 지도 학습에서 여전히 빠르고 강력한 기준 모델입니다.
나이브 베이즈의 작동 방식#
베이즈 정리에 따르면 특징 x₁ … xₙ이 주어졌을 때 클래스 C일 확률은 P(C | x) = P(C)·P(x | C) / P(x)입니다. 특징값의 모든 조합에 대해 P(x | C)를 추정하려면 방대한 데이터셋이 필요하므로, 나이브 베이즈는 조건부 독립성을 가정해 이를 P(x₁ | C)·P(x₂ | C)·…·P(xₙ | C)로 분해합니다. 분류기는 사전확률 P(C)에 해당 곱을 곱한 값이 가장 큰 클래스를 예측하며, 모든 클래스에서 동일한 P(x)는 제외합니다. 구현에서는 매우 작은 확률 수천 개를 곱하면 부동 소수점 산술에서 언더플로가 발생하므로 확률을 곱하는 대신 로그 확률을 더합니다.
빈도 계산에서는 한 가지 실패 사례가 발생할 수 있습니다. 학습 중 클래스와 함께 등장한 적이 없는 단어의 확률은 0이 되며, 다른 증거와 관계없이 해당 단어가 포함된 모든 문서에서 그 클래스의 확률을 0으로 만듭니다. 가산 스무딩은 모든 빈도에 의사 카운트 α를 더해 이 문제를 해결합니다. α = 1은 라플라스 스무딩이며 scikit-learn의 기본값입니다.
나이브 베이즈 분류기의 유형#
각 클래스 내 특징이 어떤 분포를 따른다고 가정하는지에 따라 변형이 달라집니다. 다항 나이브 베이즈는 문서에 각 단어가 나타나는 횟수와 같은 빈도를 모델링하며, 텍스트에 일반적으로 사용됩니다. 베르누이 나이브 베이즈는 이진 존재 여부를 모델링하며, 클래스에서 흔히 나타나는 단어가 없는 경우에도 불이익을 적용합니다. 가우시안 나이브 베이즈는 클래스별 연속형 특징마다 고유한 평균과 분산을 가진 정규분포를 적합합니다. 보완 나이브 베이즈는 다른 모든 클래스의 데이터를 사용해 각 클래스의 단어 통계를 추정하므로 불균형 텍스트 데이터셋에 적합합니다. 범주형 나이브 베이즈는 고정된 범주값 집합을 갖는 특징을 처리합니다.
이 예제에서는 6개의 레이블이 지정된 메시지에서 추출한 단어 빈도로 scikit-learn의 MultinomialNB를 학습한 뒤 새로운 메시지 2개의 점수를 계산합니다.
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# Tiny labeled corpus: 1 = spam, 0 = legitimate
texts = [
"win a free prize now",
"free cash bonus click now",
"claim your free reward today",
"meeting moved to monday",
"lunch with the team today",
"project review notes attached",
]
labels = [1, 1, 1, 0, 0, 0]
# Count words, then learn class priors and per-class word probabilities (alpha=1 is Laplace smoothing)
vectorizer = CountVectorizer()
model = MultinomialNB(alpha=1.0)
model.fit(vectorizer.fit_transform(texts), labels)
new = vectorizer.transform(["free prize today", "notes from the monday meeting"])
print(f"P(spam): {model.predict_proba(new)[:, 1].round(3)}")첫 번째 메시지는 "free"와 "prize"가 스팸에만 등장하므로 스팸 확률이 0.881입니다. 두 번째 메시지는 "notes", "monday", "meeting"이 정상 메일에만 등장하므로 스팸 확률이 0.053입니다. 스무딩을 적용하지 않으면 정상 클래스에서 "free"의 확률이 0이 되며, 이 단어가 포함된 정상 메시지는 모두 스팸일 확률이 확정적으로 1이라고 평가됩니다.
장점과 한계#
학습과 예측에 걸리는 시간은 샘플 수와 특징 수에 선형 비례하므로 나이브 베이즈는 추론 지연 시간이 매우 짧고 문서 수백만 개를 처리할 수 있습니다. scikit-learn 구현은 온라인 학습을 위해 partial_fit을 사용해 새 배치의 데이터를 반영할 수도 있습니다. 필요한 데이터도 많지 않습니다. Ng와 Jordan(2001)은 나이브 베이즈가 로지스틱 회귀보다 적은 학습 예제로 점근적 오류율에 도달한다는 사실을 보였습니다. 데이터가 충분해지면 로지스틱 회귀의 오류율이 더 낮아집니다. 클래스의 순위만 올바르게 정하면 되므로 특징 간 상관관계가 있는 경우에도 클래스 예측은 대개 정확합니다.
확률 자체는 제대로 보정되지 않는 경우가 많습니다. 상관관계가 있는 특징은 동일한 증거를 여러 번 반영해 점수를 0이나 1에 가깝게 만들므로, 신뢰할 수 있는 신뢰도 값이 필요한 애플리케이션에서는 홀드아웃 데이터로 재보정합니다. 독립적인 단어를 모아 구성한 백오브워즈 모델은 어순이나 상호작용을 표현할 수 없습니다. 따라서 "not good"은 부정어와 긍정적인 단어의 조합으로만 처리됩니다. 반면 Transformer와 같이 어텐션을 사용하는 모델은 문맥을 고려해 해석합니다.
응용 분야#
- 스팸 필터링: 메일 필터는 메시지의 단어, 발신자 패턴, 링크를 바탕으로 각 메시지에 점수를 매기며, 사용자가 메시지를 스팸으로 표시하면 단어 빈도 통계를 갱신합니다.
- 감성 분석: 리뷰와 고객 지원 티켓을 사용된 단어를 바탕으로 긍정 또는 부정으로 분류합니다. 언어 모델을 파인 튜닝하기 전에 사용하는 일반적인 첫 번째 모델입니다.
- 문서 라우팅: 뉴스 기사, 법률 문서, 지원 요청을 주제나 처리 대기열별로 분류합니다. 다른 범주보다 훨씬 드문 범주가 있으면 보완 나이브 베이즈를 자주 사용합니다.
- 자연어 처리(NLP) 기준 모델: 언어 식별 및 주제 태깅에서 나이브 베이즈는 비용이 더 높은 모델이 넘어야 할 빠른 기준점으로 사용됩니다.
컴퓨터 비전에서의 나이브 베이즈#
인접 픽셀은 서로 강한 상관관계를 가지므로, 원시 픽셀을 독립적인 특징으로 취급하면 객체를 정의하는 모서리와 텍스처 정보가 손실됩니다. 합성곱 신경망은 인접 영역을 함께 처리하여 이를 포착합니다. 딥 러닝이 등장하기 전에는 백오브비주얼워즈 방식이 SIFT와 같은 로컬 디스크립터의 히스토그램에 나이브 베이즈를 적용했습니다. 이 디스크립터는 k-평균 클러스터링으로 시각적 단어로 묶였으며, 이는 단어 빈도를 시각적으로 구현한 방식입니다. YOLO26이 객체 탐지로 찾은 객체 클래스의 개수도 같은 유형의 카운트 벡터를 구성합니다. 따라서 다항 나이브 베이즈 모델은 탐지 결과만으로 장면을 거리, 주방, 사무실로 분류할 수 있습니다.
나이브 베이즈와 관련 모델 비교#
- 베이지안 네트워크: 나이브 베이즈는 가장 단순한 베이지안 네트워크로, 클래스만 모든 특성의 부모 노드이고 특성 간에는 간선이 없습니다. 일반적인 베이지안 네트워크는 특성 간 의존성을 모델링하기 위해 이러한 간선을 추가합니다.
- 베이지안 추론: 나이브 베이즈의 "베이즈"는 베이즈 정리를 가리킵니다. 표준 나이브 베이즈는 각 확률을 평활화된 빈도, 즉 단일 점 추정값으로 계산하는 반면, 완전한 베이지안 방법은 모든 매개변수에 대한 분포를 유지합니다.
- 서포트 벡터 머신(SVM): 학습 비용이 더 높은 대신 판별 경계를 직접 학습합니다. 감성 분류에서 Wang과 Manning(2012)은 짧은 문장에서는 나이브 베이즈가 SVM보다 정확하고, 전체 길이의 리뷰에서는 SVM이 더 정확하다는 사실을 확인했습니다.










