본문 바로가기
내가 하는 데이터분석/내가 하는 머신러닝

[나이브 베이즈 분류, Naive Bayes Classification] - GaussianNB with Python

by Pymoon 2023. 2. 15.

데이터가 각 클래스에 속할 특징 확률을 계산하는 조건부 확률 기반의 분류 방법인 나이브베이즈(NaiveBayes)에 대해서 정리해 보자.

 

그중에서 오늘은 GaussianNB에 대해서 알아볼 것이다.

 

 

이 전의 머신러닝에서는 앙상블 기법 중 랜덤포레스트에 대해서 분류와 회귀를 실습해 보았다.

 

앙상블(Ensemble) - RandomForest with Python

단일 결정트리의 단점을 극복하기 위해 여러 머신러닝 모델을 연결하여 더 강력한 모델을 방법인 앙상블(Ensemble)에 대해서 알아보자. 이 전의 머신러닝에서 우리는 앙상블 기법 중에서 부스팅(Bo

py-moon.tistory.com

 

 

 

 

나이브(Naive)는 직역하면 단순하다, 순진하다는 의미를 가진다.

 

 

베이즈(Bayes)는 베이지안 통계를 기반으로 입력특징이 클래스 전체의 확률분포 대비 특정 클래스에 속할 확률을 정리하였다는 점에서 비롯되었다.

 

 

나이브베이즈 분류 기법이 예측한 특징을 상호 독립적이라는 가정하에 확률 계산을 단순화하고 모든 변수가 동등하다는 특징에서 나이브(Naive)베이즈(Bayes)라는 이름이 결합하게 되었다.

 

 

이제, 나이브베이즈(NaiveBayes) 개념을 이해하기 위해서는 베이즈 정리에 대해 간단히 알아보자.

 


 

베이즈 정리(Bayes' Theorem)는 두 확률 변수의 사전확률과 사후확률 사이의 관계를 나타내는 정리이다.

 

사건 A, B가 있을 때, 사건 B가 일어난 것을 전제로 한 사건 A의 조건부 확률을 구하는 것이다.

 

scikit-learn에서 구현된 나이브베이즈 분류기는 BernoulliNB, MultinomialNB, GaussianNB가 있다.

 

 

 

이 중 오늘 실습해 볼 분류기는 GaussianNB이다.

 

GaussianNB는 연속적인 성질을 가지는 데이터를 분류하는데 적용할 수 있다.

 

또한, 특징들의 값이 정규분포라는 가정 하에 조건부 확률을 계산한다.

 


 

본 실습은 캐글에서 지원하는 데이터를 GaussianNB의 분류분석을 사용해서 우주 관측결과에 따라 물체가 은하인지 별인지 분류하는 예측을 진행해 본다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings(action='ignore')
 
sky = pd.read_csv('data/Skyserver.csv')
cs

 

> 분류 분석을 수행하기 위한 라이브러리와 데이터셋을 미리 불러온다.

 

 

 

sky.info()

> 불러온 데이터셋의 간략한 정보를 확인하기 위해 info()를 사용한다.

 

> 결측치는 없는 것을 확인할 수 있고, 문자형 자료형을 가지는 변수가 하나 있음을 알 수 있다.

 

 

 

 

1
2
3
4
print(sky['class'].unique())
 
 
['STAR' 'GALAXY' 'QSO']
cs

 

> unique()를 사용해서 종속변수로 활용할 class변수의 고윳값들을 확인해 본다.

 

 

 

 

sns.pairplot(hue = 'class', data = sky[['z', 'run', 'i', 'class']])

> class 변수를 타깃데이터로 설정한 뒤, 임의의 종속변수 세 가지를 불러와 산점도를 그려본다.

 

> 변수가 각 클래스에 따라 어떤 분포를 그리고 있는지 확인할 수 있다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.model_selection import train_test_split
 
feature = list(sky.columns)
feature.remove('class')
 
= sky[feature]
= sky['class']
 
train_x, test_x, train_y, test_y = train_test_split(x, y, stratify = y, test_size = 0.3, random_state = 42)
print(train_x.shape, test_x.shape, train_y.shape, test_y.shape)
 
 
(700017) (300017) (7000,) (3000,)
cs

 

> 위 코드와 같이 독립변수와 종속변수를 정의해 준 다음, 모델 학습을 위해 데이터셋을 분리해 준다.

 

 

 

 

1
2
3
4
5
6
7
8
from sklearn.naive_bayes import GaussianNB
 
gnb = GaussianNB()
pred = gnb.fit(train_x, train_y).predict(test_x)
print('Accuracy Score : {:.2f}'.format(gnb.score(test_x, test_y)))
 
 
Accuracy Score : 0.79
cs

 

> 본 실습에서 사용할 모델인 GaussianNB의 객체를 불러온다.

 

> 불러온 객체에 데이터를 적용해 학습을 진행하고, pred변수에 예측값을 저장해 준다.

 

> 그리고, score메서드로 데이터의 평균 정확도를 확인해 본다.

 

 

 

 

1
2
3
4
5
6
print(gnb.predict_proba(test_x)[[01368]])
 
 
[[8.40537783e-01 4.50779570e-02 1.14384260e-01]
 [8.40662559e-01 4.51250379e-02 1.14212403e-01]
 [1.33005763e-20 3.39427210e-02 9.66057279e-01]]
cs

 

> 임의로 0번, 13번, 68번 인덱스를 추출하여 predict_proba()를 통해 각 클래스에 대한 데이터의 추정확률을 확인해 볼 수 있다.

 

 

 

 

1
2
3
4
print(gnb.predict(test_x)[[01368]])
 
 
['GALAXY' 'GALAXY' 'STAR']
cs

 

> predict()를 통해서 위 추정확률에 대한 추정 클래스를 확인해볼 수도 있다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.metrics import classification_report
 
print(classification_report(test_y, pred))
 
 
              precision    recall  f1-score   support
 
      GALAXY       0.73      0.97      0.83      1499
         QSO       0.00      0.00      0.00       255
        STAR       0.91      0.73      0.81      1246
 
    accuracy                           0.79      3000
   macro avg       0.54      0.57      0.55      3000
weighted avg       0.74      0.79      0.75      3000
cs

 

> 위에서 평균 정확도를 살펴보았으나, 정확도만으로 알 수 없는 모델의 성능을 classification_report를 통해서 추가적인 지표를 확인할 수 있다.

 

 

 


 

OUTTRO.

 

 

분류 분석에서 사용하는 여러 가지 성능검증지표가 존재한다.

 

대부분의 그러한 지표가 혼동행렬을 기반으로 하는 지표일 것이다.

 

정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1-score정도를 기본적인 혼동행렬의 지표들이다.

 

하지만 classification_report에서 등장하는 macro_avg, weighted_avg는 흔히 볼 수 있는 지표는 아니다.

 

 

macro_avg는 단순평균을 의미한다.

 

weighted_avg는 각 클래스에 속하는 표본의 갯수로 가중평균을 산출한 값을 의미한다.