一、贝叶斯定理:
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B) = P(A)\frac {P(B|A)}{P(B)} P(A∣B)=P(A)P(B)P(B∣A)
- P ( A ∣ B ) P(A|B) P(A∣B) :B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率
- P ( A ) P(A) P(A) :先验概率
- P ( B ∣ A ) P(B|A) P(B∣A) :A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率
- P ( B ) P(B) P(B) :先验概率
- P ( B ∣ A ) P ( B ) \dfrac {P(B|A)}{P(B)} P(B)P(B∣A) :标准相似度
二、贝叶斯定理在分类任务中的应用:
P ( Y = c k ∣ X = x ) = P ( Y = c k ) P ( X = x ∣ Y = c k ) P ( X = x ) P(Y =c_k|X=x) = P(Y =c_k)\frac {P(X=x|Y =c_k)}{P(X=x)} P(Y=ck∣X=x)=P(Y=ck)P(X=x)P(X=x∣Y=ck)
- P ( Y = c k ∣ X = x ) P(Y =c_k|X=x) P(Y=ck∣X=x) :在实例x条件下Y属于哪一类的后验概率
- P ( Y = c k ) P(Y =c_k) P(Y=ck) :根据整个训练集确定Y属于哪一类的先验概率
- P ( X = x ∣ Y = c k ) {P(X=x|Y =c_k)} P(X=x∣Y=ck) :类条件概率
- P ( X = x ∣ Y = c k ) P ( X = x ) \dfrac {P(X=x|Y =c_k)}{P(X=x)}\space P(X=x)P(X=x∣Y=ck) :标准相似度
最后选取在实例x条件下类别概率最高的类,即:
y
=
a
r
g
m
a
x
c
k
P
(
Y
=
c
k
∣
X
=
x
)
y = arg\space max_{c_k}P(Y =c_k|X=x)
y=arg maxckP(Y=ck∣X=x)
三、朴素贝叶斯(Naive Bayes):
条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。有了这一假设贝叶斯定理的应用就叫朴素贝叶斯法,使应用变得简单,但是有时会牺牲一定的分类准确率。也就是说如果用于预测的特征之间关联性越小,这种方法预测的准确率会越高,但实际中很多特征之间不是独立的。有了这一假设之后,类条件概率即后验概率:
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
Y
=
c
k
)
P
(
X
=
x
∣
Y
=
c
k
)
P
(
X
=
x
)
=
P
(
Y
=
c
k
)
∏
j
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
P
(
X
=
x
)
P(Y =c_k|X=x) = P(Y =c_k)\frac {P(X=x|Y =c_k)}{P(X=x)} = P(Y =c_k)\frac {\prod_jP(X^{(j)} = x^{(j)}|Y = c_k)}{P(X=x)}
P(Y=ck∣X=x)=P(Y=ck)P(X=x)P(X=x∣Y=ck)=P(Y=ck)P(X=x)∏jP(X(j)=x(j)∣Y=ck)
- P ( X = x ) P(X=x) P(X=x) = ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) \sum_kP(X=x|Y=c_k)P(Y=c_k) ∑kP(X=x∣Y=ck)P(Y=ck) = ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) \sum_kP(Y=c_k)\prod_jP(X^{(j)} = x^{(j)}|Y = c_k) ∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)后面需要求解 a r g m a x c k P ( Y = c k ∣ X = x ) arg\space max_{c_k}P(Y =c_k|X=x) arg maxckP(Y=ck∣X=x)对于Y取每一个类时都是一样,其实不用展开,实际中也很难求得。
- x ( j ) x^{(j)} x(j) 为实例x的第j个特征
朴素贝叶斯法将实例分到后验概率最大的类中,这等价于期望风险最小化。假设选择0-1损失函数:
L
(
Y
,
f
(
X
)
)
=
{
1
,
Y
≠
f
(
X
)
0
,
Y
=
f
(
X
)
L( Y, f(X)) =\begin{cases} 1, & Y \not=f(X)\\ 0, & Y =f(X) \end{cases}
L(Y,f(X))={1,0,Y=f(X)Y=f(X)
式中
f
(
X
)
f(X)
f(X)为决策函数,这时,期望风险 函数为:
R
e
x
p
=
E
[
L
(
Y
,
f
(
X
)
)
]
R_{exp} = E[L(Y,f(X))]
Rexp=E[L(Y,f(X))]
期望是对联合分布P(X,Y)取的,由此取条件期望:
R
e
x
p
=
E
X
∑
k
=
1
K
[
L
(
c
k
,
f
(
X
)
)
]
P
(
c
k
∣
X
)
R_{exp} = E_X\sum_{k=1}^K[L(c_k,f(X))]P(c_k|X)
Rexp=EXk=1∑K[L(ck,f(X))]P(ck∣X)
为了使期望风险最小化,只需对
X
=
x
X=x
X=x逐个极小化,由此得到:
f
(
x
)
=
a
r
g
m
i
n
y
∈
Y
∑
k
=
1
K
L
(
c
k
,
y
)
P
(
c
k
∣
X
=
x
)
=
a
r
g
m
i
n
y
∈
Y
∑
k
=
1
K
P
(
y
≠
c
k
∣
X
=
x
)
=
a
r
g
m
i
n
y
∈
Y
(
1
−
P
(
y
=
c
k
∣
X
=
x
)
)
=
a
r
g
m
a
x
y
∈
Y
P
(
y
=
c
k
∣
X
=
x
)
f(x) = arg\space min_{y\in Y}\sum_{k=1}^K\space L(c_k,y)P(c_k|X=x)\\ = arg\space min_{y\in Y}\sum_{k=1}^K\space P(y \not=c_k | X=x)\\ = arg\space min_{y\in Y}\space (1-P(y =c_k|X=x))\\ = arg\space max_{y\in Y}\space P(y =c_k|X=x)\\
f(x)=arg miny∈Yk=1∑K L(ck,y)P(ck∣X=x)=arg miny∈Yk=1∑K P(y=ck∣X=x)=arg miny∈Y (1−P(y=ck∣X=x))=arg maxy∈Y P(y=ck∣X=x)
这样一来,根据期望风险最小化准则就得到了后验概率最大化准则:
f
(
x
)
=
a
r
g
m
a
x
c
k
P
(
y
=
c
k
∣
X
=
x
)
f(x) = arg\space max_{c_k}P(y=c_k|X=x)
f(x)=arg maxckP(y=ck∣X=x)
即朴素贝叶斯采用的原理。
所以对于朴素贝叶斯法的关键就是求解类先验概率 P ( Y = c k ) P(Y =c_k) P(Y=ck) 和类条件概率 P ( X = x ∣ Y = c k ) = ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X=x|Y=c_k) = \prod_jP(X^{(j)} = x^{(j)}\space|Y = c_k) P(X=x∣Y=ck)=∏jP(X(j)=x(j) ∣Y=ck),然后算得后验概率,取最大值类就行。
四、怎么求类先验概率 P ( Y = c k ) P(Y =c_k) P(Y=ck)和类条件概率 ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) \prod_jP(X^{(j)} = x^{(j)}|Y = c_k) ∏jP(X(j)=x(j)∣Y=ck)
极大似然估计下:
先验概率:
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
,
k
=
1
,
2
,
…
,
K
P(Y=c_k) = \frac {\sum_{i=1}^NI(y_i = c_k)}{N},k = 1,2,…,K
P(Y=ck)=N∑i=1NI(yi=ck),k=1,2,…,K
特征
j
\space j\space
j 的类条件概率:第
j
\space j\space
j 个特征
x
(
j
)
x^{(j)}
x(j)可能取值的集合为
{
a
j
1
,
a
j
2
,
…
,
a
S
j
}
\{a_{j1},a_{j2},…,a_{S_j}\}
{aj1,aj2,…,aSj}
P
(
X
(
j
)
=
a
j
l
∣
Y
=
c
k
)
=
∑
i
=
1
N
I
(
x
i
(
j
)
=
a
j
l
,
y
i
=
c
k
)
∑
i
=
1
N
I
(
y
i
=
c
k
)
,
j
=
1
,
2
,
…
,
n
;
l
=
1
,
2
,
…
,
S
j
;
k
=
1
,
2
,
…
,
K
P(X^{(j)} = a_{jl}|Y = c_k) = \frac {\sum_{i=1}^NI(x_i^{(j)} = a_{jl},y_i = c_k)}{\sum_{i=1}^NI(y_i = c_k)},j = 1,2,…,n;l = 1,2,…,S_j;k = 1,2,…,K
P(X(j)=ajl∣Y=ck)=∑i=1NI(yi=ck)∑i=1NI(xi(j)=ajl,yi=ck),j=1,2,…,n;l=1,2,…,Sj;k=1,2,…,K
需求:
- 大量的训练集,数据量越多联合概率分布参数值越接近真实值
- 选择一种概率模型,需要根据样本的特征分布来选定
- 一种由现有数据反推指定模型最有可能(最大概率)导致这样结果的参数值的方法,例如极大似然估计法或贝叶斯估计法
极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。
推荐一篇讲解极大似然估计比较好的博客
五、用极大似然估计法和贝叶斯估计法推导朴素贝叶斯法中的先验概率估计公式和条件概率估计公式
证明:
设
p
=
P
(
Y
=
c
k
)
p = P(Y = c_k)
p=P(Y=ck)相当于从样本中独立同分布的随机抽取N个样本,每次结果为
y
i
\space y_i \space
yi ,似然概率
P
(
y
1
,
y
2
,
…
,
y
n
)
=
p
∑
i
=
1
N
I
(
y
i
=
c
k
)
(
1
−
p
)
∑
i
=
1
N
I
(
y
i
≠
c
k
)
P(y_1,y_2,…,y_n) = p^{\sum_{i=1}^N{\space I(y_i = c_k)}}(1-p)^{\sum_{i=1}^N{\space I(y_i \not= c_k)}}
P(y1,y2,…,yn)=p∑i=1N I(yi=ck)(1−p)∑i=1N I(yi=ck)
则:
l
n
P
(
y
1
,
y
2
,
…
,
y
n
)
=
l
n
p
[
∑
i
=
1
N
I
(
y
i
=
c
k
)
]
+
l
n
(
1
−
p
)
[
∑
i
=
1
N
I
(
y
i
≠
c
k
)
]
lnP(y_1,y_2,…,y_n) = lnp[{\sum_{i=1}^N{\space I(y_i = c_k)}}\space] + ln(1-p)[{\sum_{i=1}^N{\space I(y_i \not= c_k)}}]\space
lnP(y1,y2,…,yn)=lnp[i=1∑N I(yi=ck) ]+ln(1−p)[i=1∑N I(yi=ck)]
令:
∂
l
n
P
(
y
1
,
y
2
,
…
,
y
n
)
∂
p
=
1
p
[
∑
i
=
1
N
I
(
y
i
=
c
k
)
]
+
−
1
1
−
p
[
∑
i
=
1
N
I
(
y
i
≠
c
k
)
]
=
0
\dfrac{\partial lnP(y_1,y_2,…,y_n)}{\partial p} = \dfrac{1}{p}[{\sum_{i=1}^N{\space I(y_i = c_k)}}\space]+ \dfrac{-1}{1-p}[{\sum_{i=1}^N{\space I(y_i \not= c_k)}}]\space = 0
∂p∂lnP(y1,y2,…,yn)=p1[i=1∑N I(yi=ck) ]+1−p−1[i=1∑N I(yi=ck)] =0
∴
∑
i
=
1
N
I
(
y
i
=
c
k
)
−
p
(
∑
i
=
1
N
I
(
y
i
=
c
k
)
+
∑
i
=
1
N
I
(
y
i
≠
c
k
)
)
=
0
\therefore {\sum_{i=1}^N{\space I(y_i = c_k)}} - p({\sum_{i=1}^N{\space I(y_i = c_k)}} +{\sum_{i=1}^N{\space I(y_i \not= c_k)}}) = 0
∴i=1∑N I(yi=ck)−p(i=1∑N I(yi=ck)+i=1∑N I(yi=ck))=0
∴
∑
i
=
1
N
I
(
y
i
=
c
k
)
−
p
N
=
0
\therefore {\sum_{i=1}^N{\space I(y_i = c_k)}} - pN = 0
∴i=1∑N I(yi=ck)−pN=0
∴
∑
i
=
1
N
I
(
y
i
=
c
k
)
−
P
(
Y
=
c
k
)
N
=
0
\therefore {\sum_{i=1}^N{\space I(y_i = c_k)}} - P(Y = c_k)N = 0
∴i=1∑N I(yi=ck)−P(Y=ck)N=0
∴
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
\therefore P(Y = c_k) = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k)}}{N}
∴P(Y=ck)=N∑i=1N I(yi=ck)
用极大似然估计法先验概率估计公式证明完毕,下面开始证明实例
x
\space x \space
x 的特征
j
\space j \space
j 的类条件概率
同理易得:
P
(
Y
=
c
k
,
x
(
j
)
=
a
j
l
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
x
i
(
j
)
=
a
j
l
)
N
P(Y = c_k,x^{(j)} = a_{jl}) = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k,x_i^{(j)} = a_{jl})}}{N}
P(Y=ck,x(j)=ajl)=N∑i=1N I(yi=ck,xi(j)=ajl)
由贝叶斯公式有:
P
(
x
(
j
)
=
a
j
l
∣
Y
=
c
k
)
=
P
(
Y
=
c
k
,
x
(
j
)
=
a
j
l
)
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
x
i
(
j
)
=
a
j
l
)
∑
i
=
1
N
I
(
y
i
=
c
k
)
P(x^{(j)} = a_jl|Y = c_k) = \dfrac{P(Y = c_k,x^{(j)} = a_{jl})}{P(Y = c_k)} = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k,x_i^{(j)} = a_{jl})}}{\sum_{i=1}^N{\space I(y_i = c_k)}}
P(x(j)=ajl∣Y=ck)=P(Y=ck)P(Y=ck,x(j)=ajl)=∑i=1N I(yi=ck)∑i=1N I(yi=ck,xi(j)=ajl)
极大似然估计法下实例
x
\space x \space
x 的特征
j
\space j \space
j 的类条件概率证明完毕
贝叶斯估计法证明:
假设先验概率为均匀分布
p
=
P
(
Y
=
c
k
)
p = P(Y = c_k)
p=P(Y=ck),则;
p
K
−
1
=
0
(1)
pK - 1 = 0 \tag 1
pK−1=0(1)
又因为
p
=
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
p = P(Y = c_k) = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k)}}{N}
p=P(Y=ck)=N∑i=1N I(yi=ck),有:
p
N
−
∑
i
=
1
N
I
(
y
i
=
c
k
)
=
0
(2)
pN - \sum_{i=1}^N{\space I(y_i = c_k) = 0} \tag 2
pN−i=1∑N I(yi=ck)=0(2)
引入一个参数
λ
\lambda
λ,则有:
(
p
K
−
1
)
λ
+
(
p
N
−
∑
i
=
1
N
I
(
y
i
=
c
k
)
)
=
0
(pK - 1)\lambda + (pN - \sum_{i=1}^N{\space I(y_i = c_k))} = 0
(pK−1)λ+(pN−i=1∑N I(yi=ck))=0
∴
p
=
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
+
λ
N
+
K
λ
\therefore p = P(Y = c_k) = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k)} + \lambda}{N + K\lambda}
∴p=P(Y=ck)=N+Kλ∑i=1N I(yi=ck)+λ
同理可证:
P
(
x
(
j
)
=
a
j
l
∣
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
x
i
(
j
)
=
a
j
l
)
+
λ
∑
i
=
1
N
I
(
y
i
=
c
k
)
+
S
j
λ
P(x^{(j)} = a_{jl}|Y = c_k) = \dfrac {\sum_{i=1}^N{\space I(y_i = c_k,x_i^{(j)} = a_{jl})} + \lambda}{\sum_{i=1}^N{\space I(y_i = c_k)} + S_j\lambda}
P(x(j)=ajl∣Y=ck)=∑i=1N I(yi=ck)+Sjλ∑i=1N I(yi=ck,xi(j)=ajl)+λ
λ
=
0
\lambda = 0
λ=0时就为极大似然估计。常取
λ
=
1
\lambda = 1
λ=1,这时称为拉普拉斯平滑(Laplace smoothing)。
上面推导来自于博客
另外一种方法证明,证明过程很严谨
1、加载数据,MINIST数据集
import numpy as np
import os
# 训练集
with open('./minist_data/train-images.idx3-ubyte') as f:
loaded = np.fromfile(file = f, dtype = np.uint8)
X_train = loaded[16:].reshape((60000, 784))
X_train = X_train.astype(np.int32)
print('X_train:',X_train.shape) # (60000, 784)
with open('./minist_data/train-labels.idx1-ubyte') as f:
loaded = np.fromfile(file = f, dtype = np.uint8)
y_train = loaded[8:]
# y_train = y_train.astype(np.int32)
print('y_train:',y_train.shape) # (60000,)
# 测试集
with open('./minist_data/t10k-images.idx3-ubyte') as f:
loaded = np.fromfile(file=f, dtype=np.uint8)
X_test = loaded[16:].reshape((10000, 784))
X_test = X_test.astype(np.int32)
print('X_test:',X_test.shape) # (10000, 784)
with open('./minist_data/t10k-labels.idx1-ubyte') as f:
loaded = np.fromfile(file=f, dtype=np.uint8)
y_test = loaded[8:].reshape((10000))
# y_test = y_test.astype(np.int32)
print('y_test:',y_test.shape) # (10000,)
X_train: (60000, 784)
y_train: (60000,)
X_test: (10000, 784)
y_test: (10000,)
对 X \space X \space X 特征2值化
XX_train = X_train.copy()
XX_test = X_test.copy()
# 对特征2值化
for i in range(XX_train.shape[0]):
XX_train[i,:][XX_train[i,:] >128] =1
XX_train[i,:][XX_train[i,:] !=1] =0
for i in range(XX_test.shape[0]):
XX_test[i,:][XX_test[i,:] >128] =1
XX_test[i,:][XX_test[i,:] !=1] =0
2、构造预测函数
以下代码主要来自这个博客,对其中一段函数进行了更改,与课本公式更贴合。
def get_Py_Pyx(X_train,y_train):
num_c = len(set(y_train))
Py_train = np.ones((num_c,1))/num_c
for c in range(num_c):
Py_train[c] = (len(y_train[y_train == c]) + 1)/(len(y_train) + num_c )
Py_train[c] = np.log(Py_train[c])
num_f = 784
Pyx_train = np.ones((num_c,num_f,2))/(num_c*num_f*2)
for c in range(num_c):
print (c)
for f in range(num_f):
for i in range(2):
index1 = np.where([X_train[:,f] ==i])
# 分母:
index2 = np.where(y_train == c)
# 分子:
num_temp = len(set(index1[1])&set(index2[0]))
# 贝叶斯估计的类条件概率
Pyx_train[c,f,i] = (num_temp + 1)/(len(index2[0]) + 2)
Pyx_train[c,f,i] = np.log(Pyx_train[c,f,i])
return Py_train,Pyx_train
def NaiveBayes(Py, Px_y, x):
featrueNum = 784
classNum = 10
P = [0] * classNum
for i in range(classNum):
sum = 0
for j in range(featrueNum):
sum += Px_y[i][j][x[j]]
P[i] = sum + Py[i]
return P.index(max(P))
def test(Py, Px_y, X_test, y_test):
errorCnt = 0
for i in range(len(X_test)):
predict = NaiveBayes(Py, Px_y, X_test[i])
if predict != y_test[i]:
errorCnt += 1
return 1 - (errorCnt / len(X_test))
import time
start = time.time()
Py, Px_y = get_Py_Pyx(XX_train, y_train)
print('start to test')
accuracy = test(Py, Px_y, XX_test, y_test)
end = time.time()
print ('accuracy:',accuracy)
print ('Run time: ',end-start)
0
1
2
3
4
5
6
7
8
9
start to test
accuracy: 0.8432
Run time: 197.90228009223938
3、sklearn 中KNN相关的类库
对于不同的类条件概率 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=x∣Y=ck)计算方法,朴素贝叶斯有三个常用模型:高斯、多项式、伯努利。在sklearn中,有这3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。
- GaussianNB就是先验为高斯分布的朴素贝叶斯。如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
- MultinomialNB就是先验为多项式分布的朴素贝叶斯。如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。
- BernoulliNB就是先验为伯努利分布的朴素贝叶斯。如果样本特征是二元离散值或者很稀疏(即各个特征出现概率很低)的多元离散值,应该使用BernoulliNB。
对这三个模型讲解的博客
3.1、调用sklearn.naive_bayes里面GaussianNB预测
class sklearn.naive_bayes.GaussianNB(priors=None)
- priors:先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法)。
对象:
参数 | 说明 |
---|---|
class_prior_ | 每个样本的概率 |
class_count | 每个类别的样本数量 |
theta_ | 每个类别中每个特征的均值 |
sigma_ | 每个类别中每个特征的方差 |
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(XX_train, y_train)
acc = clf.score(XX_test, y_test)
print ('acc:',acc)
acc: 0.5428
3.2、调用sklearn.naive_bayes里面MultinomialNB预测
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- alpha:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑。
- fit_prior:是否去学习类的先验概率,默认是True
- class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。
对象:
参数 | 说明 |
---|---|
class_log_prior_ | 每个类别平滑后的先验概率 |
intercept_ | 是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同 |
feature_log_prob_ | 给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*alpha) |
coef_ | 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同 |
class_count | 训练样本中各类别对应的样本数 |
feature_count_ | 每个类别中各个特征出现的次数 |
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha=1)
clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print ('acc:',acc)
acc: 0.8365
3.3、调用sklearn.naive_bayes里面BernoulliNB预测
class sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- alpha:平滑因子,与多项式中的alpha一致。
- binarize:样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
- fit_prior:是否去学习类的先验概率,默认是True
- class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。
对象:
参数 | 说明 |
---|---|
class_log_prior_ | 每个类别平滑后的先验对数概率。 |
feature_log_prob_ | 给定特征类别的经验对数概率。 |
class_count_ | 拟合过程中每个样本的数量。 |
feature_count_ | 拟合过程中每个特征的数量。 |
方法:贝叶斯的方法和其他模型的方法一致。
参数 | 说明 |
---|---|
fit(X,Y) | 在数据集(X,Y)上拟合模型。 |
get_params() | 获取模型参数。 |
predict(X) | 对数据集X进行预测。 |
predict_log_proba(X) | 对数据集X预测,得到每个类别的概率对数值。 |
predict_proba(X) | 对数据集X预测,得到每个类别的概率。 |
score(X,Y) | 得到模型在数据集(X,Y)的得分情况。 |
from sklearn.naive_bayes import BernoulliNB
clf = BernoulliNB(alpha=1.0,binarize=0.0,fit_prior='Ture', class_prior=None)
clf.fit(XX_train, y_train)
acc = clf.score(XX_test, y_test)
print ('acc:',acc)
print (clf.predict(XX_test[0:2]),y_test[0:2])
print (clf.predict_log_proba(XX_test[0:2]))
print (clf.get_params() )
acc: 0.8432
[7 2] [7 2]
[[-152.26155755 -187.28536992 -130.90640856 -102.58556452 -78.72899449
-90.53050702 -177.88679465 0. -104.09611942 -48.17844312]
[ -98.10345314 -148.80518809 0. -40.51620488 -158.10691358
-54.53114065 -33.56585972 -267.71366523 -78.93005925 -201.99897125]]
{'alpha': 1.0, 'binarize': 0.0, 'class_prior': None, 'fit_prior': 'Ture'}