분류는 argmax 결정만 필요 — 확률 calibration이 틀려도 순서는 종종 맞음.
단어/feature 의존성이 있어도 독립 가정이 noise를 평균화 (실증).
Domingos & Pazzani (1997): "On the Optimality of the Simple Bayesian Classifier".
4. 장점
학습 O(n·d), 추론 O(d) — 매우 빠름.
작은 데이터에서 견고 (low variance).
온라인 학습 (partial_fit).
해석 용이.
코드 5줄로 baseline.
5. 단점
독립 가정 위반 시 calibration 나쁨 — 확률값 신뢰 X (logit/Platt scaling 필요).
연속 feature는 정규분포 가정 → 위반 시 전처리 필요.
0 카운트 → smoothing 필수 (α>0).
LLM/딥러닝 대비 정확도 SOTA 아님.
6. 2026 위치
Baseline 표준: 5분 만에 텍스트 분류 v0.
엣지/모바일: 수 KB 모델 + ms 추론.
라벨 부족 / weak supervision + Snorkel.
해석 필요한 의료/금융 보조 분류기.
💻 패턴
# 1. Gaussian NB — iris 분류fromsklearn.naive_bayesimportGaussianNBfromsklearn.datasetsimportload_irisX,y=load_iris(return_X_y=True)gnb=GaussianNB().fit(X,y)print(gnb.score(X,y))
# 2. Multinomial NB — 텍스트fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.naive_bayesimportMultinomialNBfromsklearn.pipelineimportPipelinepipe=Pipeline([("tfidf",TfidfVectorizer()),("mnb",MultinomialNB(alpha=0.1))])pipe.fit(train_texts,train_labels)
# 3. Bernoulli NB — 짧은 문서, 단어 존재 여부fromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.naive_bayesimportBernoulliNBvec=CountVectorizer(binary=True)X=vec.fit_transform(short_texts)bnb=BernoulliNB(alpha=1.0).fit(X,y)
# 4. Complement NB — 불균형 텍스트fromsklearn.naive_bayesimportComplementNBclf=ComplementNB(alpha=0.5).fit(X,y)
# 6. Calibration (NB 확률 신뢰 향상)fromsklearn.calibrationimportCalibratedClassifierCVcal=CalibratedClassifierCV(GaussianNB(),method="isotonic",cv=5)cal.fit(X_train,y_train)proba=cal.predict_proba(X_test)
# 7. NB + non-Gaussian 연속 feature → 변환fromsklearn.preprocessingimportQuantileTransformerqt=QuantileTransformer(output_distribution="normal")X_g=qt.fit_transform(X)gnb=GaussianNB().fit(X_g,y)
# 8. Top features per class (해석)importnumpyasnpmnb=MultinomialNB().fit(X,y)names=vec.get_feature_names_out()forc,lpinzip(mnb.classes_,mnb.feature_log_prob_):print(c,names[np.argsort(lp)[-10:]])
# 9. NB vs LogReg 빠른 비교fromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimportcross_val_scoreforclfin[MultinomialNB(),LogisticRegression(max_iter=1000)]:print(type(clf).__name__,cross_val_score(clf,X,y,cv=5).mean())