AI/Machine Learning

[Machine Learning] 나이브 베이즈 (Naive Bayes)

byunghyun23 2023. 5. 24. 21:18

나이브 베이즈(Naive Bayes)는 서로 조건부 독립인 피처를 가정하고, 베이즈 이론을 기반으로 하는 머신러닝 알고리즘입니다.

베이즈 정리란 두 확률 변수의 사전 확률과 사후 확률 사이의 관계를 나타내는 정리입니다.

즉, 어떤 사건이 서로 배반하는 원인 둘에 의해 일어난다고 할 때 실제 사건이 일어났을 때 이것이 두 원인 중 하나일 확률을 구하는 정리를 베이즈의 정리라고 합니다.

 

공식은 다음과 같습니다.

베이즈 확률론 해석에 따르면 베이즈 정리는 사전확률로부터 사후확률을 구할 수 있습니다.

이러한 베이즈 정리는 불확실성 하에서 의사결정 문제를 수학적으로 다룰 때 사용됩니다.

 

예를 들어 다음과 같이 날씨에 따라 축구를 진행했는지 여부를 나타내는 데이터를 나이브 베이즈를 이용해 분류해 봅시다.

ref: DataCamp

빈도 수를 나타내는 Frequency Table를 기반으로 Likelihood Table 1은 날씨 Feature에 대한 사전 확률이고,

Likelihood Table 2는 날씨 Feature에 대한 사후 확률입니다.

 

먼저 축구 진행 확률에 대하여 알아보겠습니다.

[사전 확률]

P(Overcast) = Overcast 수 / 전체 날씨 수 = 4 / 14

P(Yes) = 9 / 14

 

[사후 확률]

P(Overcase | Yes) = 4 / 9 = 0.44

 

베이즈 정리에 따라

P(Yes | Overcast) = P(Overcast | Yes)P(Yes) / P(Overcast) = 0.44 * 0.64 / 0.29 = 0.98

 

다음으로 축구를 진행하지 않을 확률은 다음과 같습니다.

[사전 확률]

P(Overcast) = 4 / 14 = 0.29

P(No) = 5 / 14 = 0.36

 

[사후 확률]

P(Overcast | No) = 0 / 5 = 0

 

베이즈 정리에 따라

P(No | Overcast) = P(Overcast | No)P(No) / P(Overcast) = 0 * 0.36 / 0.29 = 0

 

축구를 진행할 확률 0.98, 축구를 진행하지 않을 확률 0 중 축구를 진행할 확률이 더 높기때문에

나이브 베이즈 분류기는 Overcaset일 때 축구를 진행할 것이라고 판단합니다.

 

정리하면, 베이즈 정리를 기반으로 Yes, No의 확률을 각각 구하고 이 중 높은 확률을 선택하는것이

나이브 베이즈 알고리즘입니다.

 

나이브 베이즈는 간단하고 빠르며 노이즈와 누락 데이터를 잘 처리하는 장점이 있습니다.

 

실습은 sklearn GaussianNB를 이용하여 와인 데이터를 분류해 보겠습니다.

from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB

from sklearn.metrics import recall_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 데이터 불러오기
raw_wine = datasets.load_wine()

# 피쳐, 타겟 데이터 지정
X = raw_wine.data
y = raw_wine.target
# 트레이닝/테스트 데이터 분할
X_tn, X_te, y_tn, y_te=train_test_split(X,y,random_state=0)

# 데이터 표준화
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)

# 나이브 베이즈 학습
clf_gnb = GaussianNB()
clf_gnb.fit(X_tn_std, y_tn)

# 예측
pred_gnb = clf_gnb.predict(X_te_std)
print(pred_gnb)

# 리콜
recall = recall_score(y_te, pred_gnb, average='macro')
print(recall)

# confusion matrix 확인
conf_matrix = confusion_matrix(y_te, pred_gnb)
print(conf_matrix)

# 분류 레포트 확인
class_report = classification_report(y_te, pred_gnb)
print(class_report)