본문 바로가기
AI

ML : Model : (Gaussian) Naive Bayes Classifier

by 월곡동로봇팔 2020. 2. 9.

Naive Bayes

2020/01/18 - [machine_learning/statistics] - Statistics : 5-5 : 표본공간의 분할과 베이즈정리

 

Statistics : 5-5 : 표본공간의 분할과 베이즈정리

표본공간의 분할 (Partition) 정의 > 사건 A1, A2 ---- An 이 서로 "배반사건"이고, Ω = A1 ∪ A2 ----- ∪ An 일 때, 사건 A1 --- An 을 교집합이 존재하지 않기 때문에, Ω의 분할이라고 한다...

mambo-coding-note.tistory.com

http://solarisailab.com/archives/2614

 

베이즈 정리(Bayes’ Theorem)-베이즈 룰(Bayes Rule)-의 정의와 의미 | 솔라리스의 인공지능 연구실

이번 시간에는 베이즈 정리(Bayes’ Theorem)-베이즈룰(Bayes Rule)-에 대해 알아보자. 베이즈 정리(Bayes’ Theorem) 대부분의 기계학습과 패턴인식 교재는 첫장에서 베이즈 정리와 베이즈 분류기를 다룬다. 그 이유로는 첫째, 베이즈 분류기는 다른 기계학습 방법론들에 비해 상대적으로 알고리즘이 간단함에도 불구하고 현실세계의 많은 문제를 효과적으로 풀 수 있다는 장점이 있다. 둘째, 베이즈 정리를 공부하면서 기계학습을 심도 깊게 이해

solarisailab.com

앞서 베이즈 정리는 위의 두 가지 포스팅에서 다 언급하였다.

 

간단히 정리하자면!

  1. 베이즈 정리는 기존의 데이터로 표를 작성을 하고
  2. 그 데이터를 기준으로 원래 알고 있는 확률로 ( P(A1|B) , P(A2|B) --- )
  3. 우리가 원하는 확률을 구할 수 있다. ( P(B|A) )

Gaussian Naive Bayes Classification

Gaussian Naive Bayes Classification 연속형 자료에 대해서 쓴다.

 

Code

from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
import pandas as pd

iris = datasets.load_iris()
df_X=pd.DataFrame(iris.data)
df_Y=pd.DataFrame(iris.target)

gnb = GaussianNB()
fitted=gnb.fit(iris.data, iris.target)
y_pred = fitted.predict(iris.data)

# proba는 각 target에 대한 data가 어떤 y 값을 가르키는지 확률을 체크한 부분
fitted.predict_proba(iris.data)[[1,48,51,100]]
"""
array([[1.00000000e+000, 1.51480769e-017, 2.34820051e-025],
       [1.00000000e+000, 2.63876217e-018, 2.79566024e-025],
       [7.27347795e-102, 9.45169639e-001, 5.48303606e-002],
       [3.23245181e-254, 6.35381031e-011, 1.00000000e+000]])
"""
# y_pred 값 예측하기
fitted.predict(iris.data)[[1,48,51,100]]
"""
array([0, 0, 1, 2])
"""

# confusion_matrix는 실제 값과 예측 값이 얼마나 맞는지를 합해주는 method
from sklearn.metrics import confusion_matrix
confusion_matrix(iris.target,y_pred)
"""
array([[50,  0,  0],
       [ 0, 47,  3],
       [ 0,  3, 47]], dtype=int64)
"""

# Prior 정하기
gnb_1= GaussianNB(priors=[80/100, 10/100, 10/100])
fitted_gnb_1 = gnb_1.fit(iris.data, iris.target)
y_pred_1 = fitted_gnb_1.predict(iris.data)
confusion_matrix(iris.target, y_pred_1)

Multinomial Naive Bayes

Multinomial Naive Bayes Classification 범주형 자료에 대해서 쓴다.

 

Code

from sklearn.naive_bayes import MultinomialNB
import numpy as np

# randint 0-4, size(6은 row갯수,100은 한 행당 100개)
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])

# multinomial 에 제일 적합한 데이터, 범주형 데이터~~
"""
array([[2, 2, 1, 0, 2, 3, 0, 0, 4, 2, 4, 1, 2, 4, 1, 0, 0, 1, 4, 3, 0, 3,
        3, 4, 3, 1, 1, 3, 4, 3, 0, 0, 4, 1, 3, 0, 0, 0, 0, 2, 0, 3, 3, 4,
        3, 3, 1, 1, 3, 1, 1, 0, 1, 3, 0, 0, 0, 3, 0, 3, 2, 2, 4, 2, 0, 2,
        3, 4, 3, 2, 1, 3, 4, 3, 4, 1, 4, 0, 1, 3, 3, 0, 4, 2, 2, 4, 4, 4,
        0, 3, 3, 1, 2, 2, 4, 4, 0, 4, 2, 2],
       [2, 1, 1, 3, 3, 2, 3, 0, 3, 1, 3, 0, 1, 3, 3, 2, 3, 1, 1, 1, 4, 4,
        2, 2, 2, 2, 0, 2, 0, 3, 3, 1, 4, 2, 4, 2, 1, 4, 0, 4, 3, 4, 0, 1,
        4, 0, 2, 0, 0, 4, 3, 4, 2, 0, 2, 4, 4, 2, 3, 0, 4, 0, 2, 1, 3, 3,
        0, 0, 4, 3, 2, 0, 4, 3, 0, 1, 2, 2, 1, 1, 3, 4, 0, 4, 3, 0, 2, 0,
        4, 3, 3, 1, 0, 4, 2, 1, 4, 4, 3, 0],
       [4, 0, 4, 0, 4, 2, 1, 0, 0, 4, 0, 0, 1, 4, 1, 1, 0, 1, 1, 2, 0, 0,
        3, 4, 2, 0, 2, 3, 3, 0, 0, 3, 3, 3, 1, 2, 0, 2, 2, 4, 1, 4, 4, 0,
        0, 4, 1, 0, 4, 1, 1, 2, 1, 1, 0, 4, 0, 2, 3, 2, 4, 0, 2, 3, 0, 3,
        3, 0, 2, 4, 4, 4, 3, 4, 2, 3, 3, 0, 2, 0, 3, 4, 4, 3, 3, 0, 3, 0,
        1, 4, 2, 3, 4, 4, 2, 2, 2, 3, 3, 3],
       [0, 1, 1, 0, 0, 4, 3, 4, 3, 4, 3, 1, 3, 4, 3, 4, 1, 4, 1, 1, 4, 4,
        4, 1, 2, 1, 3, 3, 1, 0, 0, 0, 1, 1, 1, 0, 3, 1, 1, 0, 4, 2, 4, 4,
        4, 1, 2, 4, 2, 1, 1, 2, 4, 3, 3, 4, 4, 0, 0, 4, 0, 1, 3, 0, 0, 1,
        4, 0, 2, 2, 0, 0, 1, 2, 3, 3, 3, 1, 1, 3, 4, 2, 1, 4, 1, 4, 3, 4,
        3, 1, 0, 1, 1, 0, 3, 2, 2, 0, 3, 4],
       [0, 2, 0, 0, 0, 3, 4, 0, 3, 2, 2, 1, 0, 4, 0, 1, 3, 4, 3, 2, 3, 3,
        4, 3, 2, 2, 0, 1, 1, 3, 0, 1, 3, 1, 3, 0, 3, 4, 0, 2, 4, 3, 0, 3,
        0, 2, 0, 3, 1, 2, 2, 4, 0, 0, 1, 3, 0, 2, 3, 1, 2, 4, 1, 0, 3, 3,
        2, 2, 0, 1, 3, 1, 3, 2, 4, 3, 3, 4, 1, 3, 4, 3, 0, 3, 1, 0, 4, 2,
        2, 2, 0, 4, 0, 4, 1, 1, 1, 2, 3, 2],
       [3, 3, 0, 2, 4, 0, 0, 4, 4, 2, 2, 4, 2, 0, 2, 3, 1, 2, 0, 1, 3, 1,
        1, 0, 4, 1, 1, 3, 1, 2, 3, 4, 3, 2, 0, 4, 2, 3, 4, 4, 2, 0, 0, 0,
        4, 0, 2, 1, 0, 2, 0, 1, 0, 3, 4, 4, 3, 4, 3, 3, 4, 1, 4, 1, 2, 4,
        3, 1, 4, 1, 2, 3, 2, 1, 3, 0, 1, 1, 0, 0, 0, 2, 3, 0, 0, 4, 4, 4,
        3, 2, 1, 1, 1, 2, 1, 2, 4, 0, 3, 3]])
"""

clf = MultinomialNB()
clf.fit(X, y)

print(clf.predict(X[2:3]))
"""
[3]
"""

clf.predict_proba(X[2:3])
"""
array([[2.22463820e-31, 2.68338241e-26, 1.00000000e+00, 2.58038854e-31,
        2.30500794e-30, 2.20963591e-30]])
"""

clf2 = MultinomialNB(class_prior=[0.1,0.5,0.1,0.1,0.1,0.1])
clf2.fit(X,y)

# 가중치를 주었을 때, probability 가 다르다.
clf2.predict_proba(X[2:3])
"""
array([[2.22463820e-31, 1.34169120e-25, 1.00000000e+00, 2.58038854e-31,
        2.30500794e-30, 2.20963591e-30]])
"""

목적 & 용도

1. data가 방대할 때 사용하면 좋다. 반대로 말하면, data의 크기가 적다면 쓰지 않는 것이 좋다.
2. 범주형은 multinomial, 연속형은 Gaussian 사용이 가능하다.
3. Prior를 임의로 주어 가중치를 줄 수도 있다. (내 생각에 이 변수가 되게 중요한 변수이다. 그럴 때!!)

댓글