나이브 베이즈 분류 모형


In [105]:
# sklearn

# classes_ ; 타겟 Y 의 클래스(라벨)
# class_count_ ; 타켓 Y 의 값이 특정한 클래스인 표본 데이터의 수
# feature_count_ ; 1) 베르누이 분포 ;
#                  2) 다항분포 ;           
# class_prior_ (가우시안 정규분포) ; P(Y)
# class_log_prior_ (베르누이, 다항 분포) ; log P(Y)
# theta_, sigma_ (가우시안 정규분포)
# feature_log_prob_ (베르누이, 다항 분포)
# predicet_proba(x_new) ; P(Y|Xnew)

1) 베르누이 분포 나이브 베이즈 모형

  • 4개의 동전을 10번 던졌고, 클래스 0에 해당하는 곳이 3개, 클래스 1에 해당하는 곳이 7개 이다. 만약 x_new 값으로 [1,1,1,0] 일때 그것이 클래스 0과 클래스 1에 해당할 확률을 구해라.

In [7]:
import numpy as np
from sklearn.naive_bayes import BernoulliNB

In [6]:
X = np.random.randint(2, size=(10, 4))
y = np.array([0,0,0,1,1,1,1,1,1,1])
print(X)
print(y)


[[1 0 1 0]
 [0 1 1 0]
 [0 1 1 1]
 [0 1 0 1]
 [0 1 1 0]
 [0 0 1 1]
 [1 1 1 1]
 [1 1 0 0]
 [1 0 0 0]
 [1 0 0 1]]
[0 0 0 1 1 1 1 1 1 1]

In [8]:
clf_bern = BernoulliNB().fit(X, y)

In [9]:
clf_bern.classes_


Out[9]:
array([0, 1])

In [10]:
clf_bern.class_count_


Out[10]:
array([ 3.,  7.])

In [11]:
clf_bern.feature_count_


Out[11]:
array([[ 1.,  2.,  3.,  1.],
       [ 4.,  4.,  3.,  4.]])

In [16]:
theta = np.exp(clf_bern.feature_log_prob_)
theta


Out[16]:
array([[ 0.4       ,  0.6       ,  0.8       ,  0.4       ],
       [ 0.55555556,  0.55555556,  0.44444444,  0.55555556]])

In [17]:
x_new = np.array([1,1,1,0])

In [19]:
clf_bern.predict_proba([x_new])


Out[19]:
array([[ 0.44745729,  0.55254271]])

2) 다항 분포 나이브 베이즈 모형

  • 위의 X, y는 동일한데 다항분포를 활용해서 x_new = [10,15,29,32] 일 경우, 그것이 클래스 0에 속할 확률과 클래스 1에 속할 확률을 구해라.

In [20]:
from sklearn.naive_bayes import MultinomialNB

In [21]:
clf_mult = MultinomialNB().fit(X, y)

In [22]:
clf_mult.classes_


Out[22]:
array([0, 1])

In [23]:
clf_mult.class_count_


Out[23]:
array([ 3.,  7.])

In [24]:
clf_mult.feature_count_


Out[24]:
array([[ 1.,  2.,  3.,  1.],
       [ 4.,  4.,  3.,  4.]])

In [27]:
theta = np.exp(clf_mult.feature_log_prob_)
theta


Out[27]:
array([[ 0.18181818,  0.27272727,  0.36363636,  0.18181818],
       [ 0.26315789,  0.26315789,  0.21052632,  0.26315789]])

In [28]:
x_new = np.array([10,15,29,32])

In [29]:
clf_mult.predict_proba([x_new])


Out[29]:
array([[ 0.50221643,  0.49778357]])

3) 가우시안 정규 분포 나이브 베이즈 모형


In [55]:
from sklearn.naive_bayes import GaussianNB

In [104]:
# 학생 0 의 시험성적
X00 = sp.stats.norm(70, 10).rvs(10)
X01 = sp.stats.norm(80, 5).rvs(10)
X02 = sp.stats.norm(100, 5).rvs(10)
X03 = sp.stats.norm(40, 5).rvs(10)

# 학생 1 의 시험성적
X10 = sp.stats.norm(90, 10).rvs(10)
X11 = sp.stats.norm(75, 5).rvs(10)
X12 = sp.stats.norm(60, 5).rvs(10)
X13 = sp.stats.norm(50, 10).rvs(10)

# 학생 2 의 시험성적
X20 = sp.stats.norm(60, 10).rvs(10)
X21 = sp.stats.norm(55, 5).rvs(10)
X22 = sp.stats.norm(100, 5).rvs(10)
X23 = sp.stats.norm(25, 10).rvs(10)

# Case 1)

X0 = np.vstack([X00, X01, X02, X03]).T
X1 = np.vstack([X10, X11, X12, X13]).T
X2 = np.vstack([X20, X21, X22, X23]).T
X = np.vstack([X0, X1, X2])


# 학생(=클래스) 구분하기
y0 = np.zeros(10)
y1 = np.ones(10)
y2 = np.ones(10) * 2

y = np.hstack([y0,y1,y2])

In [102]:
np.shape(X0)


Out[102]:
(10, 4)

In [103]:
np.shape(X)


Out[103]:
(30, 4)

In [79]:
np.shape(y)


Out[79]:
(30,)

In [80]:
clf_norm = GaussianNB().fit(X, y)

In [81]:
clf_norm.classes_


Out[81]:
array([ 0.,  1.,  2.])

In [82]:
clf_norm.class_count_


Out[82]:
array([ 10.,  10.,  10.])

In [83]:
clf_norm.class_prior_


Out[83]:
array([ 0.33333333,  0.33333333,  0.33333333])

In [84]:
clf_norm.theta_


Out[84]:
array([[ 66.23565448,  80.66267321,  98.16707216,  41.41447848],
       [ 95.40075819,  73.67732158,  58.43560563,  48.9936173 ],
       [ 67.28243132,  55.47709168,  98.38187953,  19.41434452]])

In [85]:
clf_norm.sigma_


Out[85]:
array([[  25.49017842,   15.77327027,   23.58108832,   32.11966338],
       [ 131.64307847,    7.56670505,   31.70262996,  111.98253719],
       [  35.62739978,   28.53084044,   16.87742068,   60.26492062]])

In [86]:
x_new = np.array([70, 60, 75, 35])

In [87]:
clf_norm.predict_proba([x_new])


Out[87]:
array([[ 0.00125457,  0.12391607,  0.87482936]])