본문으로 건너뛰기

035 Naive Bayes 분류 상세

키워드: Naive Bayes, nb

개요

Naive Bayes는 베이즈 정리를 기반으로 한 확률적 분류 알고리즘입니다. "순진한(Naive)" 가정으로 특성 간 독립을 가정하지만, 실제로 매우 효과적입니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

Naive Bayes 원리

베이즈 정리:

P(y|X) = P(X|y) × P(y) / P(X)

Naive 가정 (특성 독립):

P(X|y) = P(x₁|y) × P(x₂|y) × ... × P(xₙ|y)

PyCaret에서 Naive Bayes

from pycaret.classification import *
from pycaret.datasets import get_data

# 035 데이터 로드
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 035 Naive Bayes 모델 생성
nb = create_model('nb')

Naive Bayes 종류

1. Gaussian Naive Bayes

연속형 변수에 적합. 정규 분포 가정:

from sklearn.naive_bayes import GaussianNB

# 035 PyCaret의 'nb'는 GaussianNB 사용
nb_gaussian = create_model('nb')

2. Multinomial Naive Bayes

이산형 변수에 적합. 텍스트 분류에 많이 사용:

from sklearn.naive_bayes import MultinomialNB
from pycaret.classification import *
from pycaret.datasets import get_data

# 035 커스텀 모델로 추가
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 035 sklearn에서 직접 사용
from sklearn.naive_bayes import MultinomialNB
# 035 단, 음수 값이 있으면 사용 불가

3. Bernoulli Naive Bayes

이진 특성에 적합:

from sklearn.naive_bayes import BernoulliNB

var_smoothing 파라미터

# 035 var_smoothing: 분산에 추가하는 작은 값 (0으로 나누기 방지)
nb_default = create_model('nb', var_smoothing=1e-9) # 기본값
nb_smooth = create_model('nb', var_smoothing=1e-7)

특성 분포 확인

from pycaret.classification import *
from pycaret.datasets import get_data
import matplotlib.pyplot as plt
import seaborn as sns

data = get_data('diabetes')

# 035 각 특성의 분포 확인
fig, axes = plt.subplots(2, 4, figsize=(16, 8))
axes = axes.ravel()

for idx, col in enumerate(data.columns[:-1]): # 타겟 제외
sns.histplot(data=data, x=col, hue='Class variable', ax=axes[idx], kde=True)
axes[idx].set_title(col)

plt.tight_layout()
plt.savefig('nb_feature_dist.png', dpi=150)

# 035 정규 분포에 가까울수록 Gaussian NB 성능 좋음

튜닝

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 035 기본 모델
nb = create_model('nb', verbose=False)

# 035 자동 튜닝
tuned_nb = tune_model(nb, optimize='AUC')

# 035 커스텀 그리드
custom_grid = {
'var_smoothing': [1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6]
}

tuned_nb = tune_model(nb, custom_grid=custom_grid, optimize='AUC')

확률 보정

Naive Bayes의 확률은 종종 극단적이므로 보정이 필요할 수 있음:

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

nb = create_model('nb', verbose=False)

# 035 확률 보정
calibrated_nb = calibrate_model(nb)

# 035 보정 전후 비교
predictions_before = predict_model(nb)
predictions_after = predict_model(calibrated_nb)

print("보정 전 확률 분포:")
print(predictions_before['prediction_score'].describe())

print("\n보정 후 확률 분포:")
print(predictions_after['prediction_score'].describe())

텍스트 분류 예제

Naive Bayes는 텍스트 분류에 특히 효과적:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score

# 035 뉴스그룹 데이터 로드
categories = ['alt.atheism', 'sci.space', 'rec.sport.baseball']
train = fetch_20newsgroups(subset='train', categories=categories)

# 035 파이프라인 구성
model = make_pipeline(
TfidfVectorizer(),
MultinomialNB()
)

# 035 교차 검증
scores = cross_val_score(model, train.data, train.target, cv=5)
print(f"평균 정확도: {scores.mean():.4f} (+/- {scores.std()*2:.4f})")

장단점

장점:

  • 매우 빠른 학습과 예측
  • 고차원 데이터에서도 효과적
  • 작은 학습 데이터로도 잘 동작
  • 텍스트 분류에 탁월
  • 확률 출력 자연스러움

단점:

  • 특성 독립 가정 (현실에서 위반됨)
  • 확률 추정이 정확하지 않을 수 있음
  • 연속형 변수에서 정규 분포 가정
  • 학습 데이터에 없는 조합에 취약

언제 사용하나?

# 1. 텍스트 분류 (스팸, 감성 분석 등)
# 035 가장 전형적인 사용 사례

# 2. 빠른 기준선 모델
# 035 매우 빠른 학습/예측

# 3. 고차원 데이터
# 035 특성 수가 많을 때 효과적

# 4. 실시간 학습 필요
# 035 점진적 학습 가능 (partial_fit)

# 5. 확률 기반 결정 필요
# 035 자연스러운 확률 출력

Naive Bayes vs 다른 알고리즘

항목Naive Bayes로지스틱SVM
속도매우 빠름빠름보통
고차원잘 동작잘 동작잘 동작
확률 정확도낮음높음보정 필요
텍스트 분류탁월좋음좋음
복잡한 관계못 포착제한적커널로 가능

정리

  • Naive Bayes는 베이즈 정리 + 독립 가정
  • 매우 빠르고 간단
  • 텍스트 분류에 표준적으로 사용
  • 확률 추정은 보정이 필요할 수 있음
  • 고차원 데이터에서 효과적
  • 기준선 모델로 적합

다음 글 예고

다음 글에서는 신경망 분류기 활용을 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #035