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