Naive Bayes
2020/01/18 - [machine_learning/statistics] - Statistics : 5-5 : 표본공간의 분할과 베이즈정리
http://solarisailab.com/archives/2614
앞서 베이즈 정리는 위의 두 가지 포스팅에서 다 언급하였다.
간단히 정리하자면!
- 베이즈 정리는 기존의 데이터로 표를 작성을 하고
- 그 데이터를 기준으로 원래 알고 있는 확률로 ( P(A1|B) , P(A2|B) --- )
- 우리가 원하는 확률을 구할 수 있다. ( 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를 임의로 주어 가중치를 줄 수도 있다. (내 생각에 이 변수가 되게 중요한 변수이다. 그럴 때!!)
'AI' 카테고리의 다른 글
ML : Model : LDA Math : 다변량 정규분포 (0) | 2020.02.10 |
---|---|
ML : Model : K-Nearest-Neighbor, KNN (0) | 2020.02.09 |
ML : 오차 vs 잔차 (0) | 2020.02.01 |
ML&DL : train, validation, test 데이터로 나누기 (0) | 2020.02.01 |
ML&DL : 정규성, 독립성, 등분산성 검증 (0) | 2020.02.01 |
댓글