A A
[ML] Naive Bayes (λ‚˜μ΄λΈŒ 베이즈)
μ΄λ²ˆμ—λŠ” Naive Bayes (λ‚˜μ΄λΈŒ 베이즈)λΌλŠ” κ°œλ…μ— λ°ν•˜μ—¬ ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

Naive Bayes (λ‚˜μ΄λΈŒ 베이즈)

  • λ‚˜μ΄λΈŒ 베이즈(Naive Bayes)λŠ” 쑰건뢀 ν™•λ₯ μ„ ν™œμš©ν•˜μ—¬ λΆ„λ₯˜λ₯Ό μˆ˜ν–‰ν•˜λŠ” 지도 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
  • 이 μ•Œκ³ λ¦¬μ¦˜μ€ 독립 λ³€μˆ˜λ“€μ΄ μ„œλ‘œ 독립적이라고 κ°€μ •ν•˜μ—¬ μž‘λ™ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ κ°€μ • ν•˜μ—μ„œ λ‚˜μ΄λΈŒ λ² μ΄μ¦ˆλŠ” κ°„λ‹¨ν•˜μ§€λ§Œ κ°•λ ₯ν•œ λΆ„λ₯˜ λͺ¨λΈμ„ μ œκ³΅ν•©λ‹ˆλ‹€.

Bayes' Theorem (베이즈 정리)

λ‚˜μ΄λΈŒ 베이즈 μ•Œκ³ λ¦¬μ¦˜μ€ 베이즈 정리에 κΈ°λ°˜μ„ 두고 μžˆμŠ΅λ‹ˆλ‹€.
  • 베이즈 μ •λ¦¬λŠ” 쑰건뢀 ν™•λ₯ μ„ μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ‚¬κ±΄μ˜ 사후 ν™•λ₯ μ„ κ³„μ‚°ν•˜λŠ” μˆ˜ν•™μ  μ›λ¦¬μž…λ‹ˆλ‹€. μ•„λž˜λŠ” 베이즈 μ •λ¦¬μ˜ μˆ˜μ‹μž…λ‹ˆλ‹€.

 

  • P(A∣B)P(A|B): 사건 Bκ°€ 일어났을 λ•Œ 사건 Aκ°€ 일어날 ν™•λ₯  (사후 ν™•λ₯ , Posterior Probability)
    • 예: νŠΉμ • 단어가 μžˆμ„ λ•Œ 이메일이 슀팸일 ν™•λ₯ 
  • P(B∣A)P(B|A): 사건 Aκ°€ 일어났을 λ•Œ 사건 Bκ°€ 일어날 ν™•λ₯  (μš°λ„, Likelihood)
    • 예: 슀팸 메일에 νŠΉμ • 단어가 μžˆμ„ ν™•λ₯ 
  • P(A)P(A): 사건 Aκ°€ 일어날 ν™•λ₯  (사전 ν™•λ₯ , Prior Probability)
    • 예: 슀팸 λ©”μΌμ˜ λΉ„μœ¨
  • P(B)P(B): 사건 Bκ°€ 일어날 ν™•λ₯  (증거, Evidence)
    • 예: νŠΉμ • 단어가 μ‘΄μž¬ν•  ν™•λ₯ 

 

μƒˆλ‘œμš΄ 데이터가 μ£Όμ–΄μ‘Œμ„λ•Œ, ν•΄λ‹Ή 데이터가 νŠΉμ • λΆ„λ₯˜μ— 속할 ν™•λ₯ μ„ κ³„μ‚°ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

 


Naive Bayes Algorithm의 μž₯점

  • κ°„λ‹¨ν•˜κ³  빠름: λ‚˜μ΄λΈŒ λ² μ΄μ¦ˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ 맀우 λ‹¨μˆœν•˜μ—¬ ν•™μŠ΅κ³Ό 예츑 속도가 λΉ λ¦…λ‹ˆλ‹€.
  • μž‘μ€ 데이터셋에 적합: μƒλŒ€μ μœΌλ‘œ μž‘μ€ λ°μ΄ν„°μ…‹μ—μ„œλ„ 쒋은 μ„±λŠ₯을 보일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μ–‘ν•œ μ‘μš© κ°€λŠ₯: ν…μŠ€νŠΈ λΆ„λ₯˜, 슀팸 필터링, λ¬Έμ„œ λΆ„λ₯˜, 감정 뢄석 λ“± μ—¬λŸ¬ 뢄야에 널리 μ‚¬μš©λ©λ‹ˆλ‹€.
  • ν™•λ₯  해석 κ°€λŠ₯: λͺ¨λΈμ˜ 좜λ ₯이 ν™•λ₯ κ°’μ΄λ―€λ‘œ, 예츑의 λΆˆν™•μ‹€μ„±μ„ 해석할 수 μžˆμŠ΅λ‹ˆλ‹€.

Naive Bayes Algorithm의 단점

  • 독립 κ°€μ •μ˜ ν•œκ³„: λͺ¨λ“  독립 λ³€μˆ˜κ°€ λ…λ¦½μ μ΄λΌλŠ” 가정이 ν˜„μ‹€μ μœΌλ‘œ λ§žμ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν…μŠ€νŠΈ λ°μ΄ν„°μ—μ„œ 단어듀 μ‚¬μ΄μ—λŠ” 보톡 μƒν˜Έ μ˜μ‘΄μ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€.
  • μ—°μ†ν˜• 데이터 처리의 어렀움: λ‚˜μ΄λΈŒ λ² μ΄μ¦ˆλŠ” 기본적으둜 μ΄μ‚°ν˜• 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ”λ° μ ν•©ν•©λ‹ˆλ‹€. μ—°μ†ν˜• 데이터λ₯Ό 닀루기 μœ„ν•΄μ„œλŠ” νŠΉλ³„ν•œ 처리(예: κ°€μš°μ‹œμ•ˆ λ‚˜μ΄λΈŒ 베이즈)κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • ν›ˆλ ¨ λ°μ΄ν„°μ˜ 편ν–₯μ„±: ν›ˆλ ¨ 데이터가 편ν–₯되면, λͺ¨λΈμ˜ 예츑 μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ΄ νŠΉμ • ν΄λž˜μŠ€μ— λŒ€ν•΄ 편ν–₯된 μ˜ˆμΈ‘μ„ ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

Naive Bayes (λ‚˜μ΄λΈŒ 베이즈)의 μ’…λ₯˜

  • Gaussian Naive Bayes (GaussianNB): μ—°μ†ν˜• 데이터λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ—°μ†ν˜• 데이터λ₯Ό κ°€μš°μ‹œμ•ˆ λΆ„ν¬λ‘œ κ°€μ •ν•˜κ³ , ν•΄λ‹Ή λΆ„ν¬μ˜ 평균과 뢄산을 κ³„μ‚°ν•˜μ—¬ λΆ„λ₯˜ν•©λ‹ˆλ‹€.
  • Bernoulli Naive Bayes (BernoulliNB): 이진 데이터λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 이진 νŠΉμ„±(0 λ˜λŠ” 1)으둜 이루어진 λ°μ΄ν„°μ…‹μ—μ„œ 주둜 μ‚¬μš©λ˜λ©°, ν…μŠ€νŠΈ λ°μ΄ν„°μ˜ 쑴재/λΆ€μž¬ μ—¬λΆ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ ν•©ν•©λ‹ˆλ‹€.
  • Multinomial Naive Bayes (MultinomialNB): 이산적 카운트 데이터λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν…μŠ€νŠΈ λΆ„λ₯˜μ—μ„œ λ¬Έμ„œ λ‚΄μ˜ 단어 λΉˆλ„λ₯Ό λ°”νƒ•μœΌλ‘œ λΆ„λ₯˜λ₯Ό μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

Naive Bayes (λ‚˜μ΄λΈŒ 베이즈) Example Code

그러면 ν•œλ²ˆ μ½”λ“œλ‘œ μ–΄λ–»κ²Œ λ‚˜μ΄λΈŒ 베이즈λ₯Ό μ μš©ν•˜λŠ”μ§€ ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import confusion_matrix, accuracy_score

# 데이터 생성
from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target​
print(f"X: {X}")
print(f"y: {y}")
# 데이터 λΆ„ν• 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# λͺ¨λΈ ν•™μŠ΅
nb = GaussianNB()
nb.fit(X_train, y_train)

# 예츑
y_pred = nb.predict(X_test)

# 평가
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix:\n{conf_matrix}')
Accuracy: 1.0
Confusion Matrix:
[[10  0  0]
 [ 0  9  0]
 [ 0  0 11]]
  • Confusion Matrix (ν˜Όλ™ν–‰λ ¬) μ‹œκ°ν™”
# μ‹œκ°ν™”
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()