前言
\quad \quad 朴素贝叶斯算法是解决分类问题的监督学习算法,,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
1、概述
\quad \quad 贝叶斯原理是最大的概念,它解决了概率论中“逆向概率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器,朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器。朴素贝叶斯之所以朴素是因为它假设属性是相互独立的,因此对实际情况有所约束,如果属性之间存在关联,分类准确率会降低。 不过好在对于大部分情况下,朴素贝叶斯的分类效果都不错。
\quad \quad 实际上,贝叶斯原理是数学基础,贝叶斯分类是一种模型,而朴素贝叶斯则是具体方法。
贝叶斯原理
\quad \quad
贝叶斯原理是英国数学家托马斯·贝叶斯提出的。
- 逆向概率是相对于正向概率而言的。
- 正向概率:一个盒子里面有M个白球,N个黑球,那么我们随机拿一个球出来是黑球(白球)的概率?这就是一个正向概率问题,比较好理解。
- 逆向概率:现实生活中,绝大部分问题,我们是很难知道具体情况的,那么我们能否根据拿出来球的颜色来判断盒子中黑球和白球的比例呢?贝叶斯公式可以先估计一个值,然后根据实际结果不断进行更新。
2、原理
\quad \quad 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
1、损失函数
\quad \quad
假设我们使用0-1损失函数,函数表达式如下:
式中,
f
(
x
)
f(x)
f(x)为决策函数。这时,期望风险函数为
R
e
x
p
(
f
)
=
E
[
L
(
Y
,
f
(
X
)
]
R_{exp}(f)=E[L(Y,f(X)]
Rexp(f)=E[L(Y,f(X)]
期望是对联合分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)取得。由此由双期望公式得
R
e
x
p
(
f
)
=
E
[
L
(
Y
,
f
(
X
)
]
=
∑
k
=
1
K
L
(
c
k
,
f
(
X
)
)
P
(
c
k
,
X
)
=
E
x
∑
k
=
1
K
L
(
c
k
,
f
(
X
)
)
P
(
c
k
∣
X
)
R_{exp}(f)=E[L(Y,f(X)]=\sum_{k=1}^KL(c_k,f(X))P(c_k,X)=E_x\sum_{k=1}^KL(c_k,f(X))P(c_k|X)
Rexp(f)=E[L(Y,f(X)]=k=1∑KL(ck,f(X))P(ck,X)=Exk=1∑KL(ck,f(X))P(ck∣X)
为了使期望风险最小,只需对
X
=
x
X=x
X=x逐个极小化,由此得到:
这样一来,根据期望风险最小化准则就得到了后验概率最大化准则:
f
(
x
)
=
a
r
g
m
a
x
c
k
P
(
c
k
∣
X
=
x
)
f(x)=argmax_{c_k}P(c_k|X=x)
f(x)=argmaxckP(ck∣X=x)
即朴素贝叶斯法所采用的原理:求得最大后验概率即能最小化代价函数!
2. 求最大化后验概率
\quad \quad 基于上面的分析我们知道,对于数据集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) D=(x_1,y_1),(x_2,y_2),...,(x_N,y_N) D=(x1,y1),(x2,y2),...,(xN,yN),当 y i y_i yi的可取值为 c 1 , c 2 , . . . , c K c_1,c_2,...,c_K c1,c2,...,cK 时,我们对待分类样本 x i x_i xi求其对应不同类标记 c k c_k ck的后验概率值,并选择最后的后验概率值对应的类标号 c k c_k ck作为样本的分类结果,我们就能以最小的代价函数获得最优的分类。
\quad \quad 根据贝叶斯公式来求后验概率:
P ( Y = c k ∣ X = x i ) = P ( X = x i ∣ Y = c k ) P ( Y = c k ) ∑ k = 1 K P ( X = x i ∣ Y = c k ) P ( Y = c k ) P(Y=c_k|X=x_i)=\frac{P(X=x_i|Y=c_k)P(Y=c_k)}{\sum_{k=1}^KP(X=x_i|Y=c_k)P(Y=c_k)} P(Y=ck∣X=xi)=∑k=1KP(X=xi∣Y=ck)P(Y=ck)P(X=xi∣Y=ck)P(Y=ck)
\quad \quad
样本
x
i
x_i
xi有J个属性,怎么求得条件概率分布
P
(
X
=
x
i
∣
Y
=
c
k
)
P(X=x_i|Y=c_k)
P(X=xi∣Y=ck)呢?
这时候朴素贝叶斯的优势就体现出来了,朴素贝叶斯和贝叶斯最重要的区别就在于,朴素贝叶斯假设在类确定的条件下,样本的特征之间是相互独立的! 因此,上面的公式就可以拆分成以下形式:
P
(
Y
=
c
k
∣
X
=
x
i
)
=
P
(
Y
=
c
k
)
∏
j
=
1
J
P
(
X
j
=
x
i
j
∣
Y
=
c
k
)
∑
k
=
1
K
P
(
Y
=
c
k
)
∏
j
=
1
J
P
(
X
j
=
x
i
j
∣
Y
=
c
k
)
P(Y=c_k|X=x_i)=\frac{P(Y=c_k)\prod \limits_{j=1}^JP(X^j=x_i^j|Y=c_k)}{\sum_{k=1}^KP(Y=c_k)\prod \limits_{j=1}^JP(X^j=x_i^j|Y=c_k)}
P(Y=ck∣X=xi)=∑k=1KP(Y=ck)j=1∏JP(Xj=xij∣Y=ck)P(Y=ck)j=1∏JP(Xj=xij∣Y=ck)
因为分母对于同一样本来说都是一样的,因此我们在具体算法流程中是可以不考虑分母的大小的。
所以,朴素贝叶斯分类器可以表示为:
f
(
x
)
=
a
r
g
m
a
x
c
k
P
(
Y
=
c
k
)
∏
j
=
1
J
P
(
X
j
=
x
i
j
∣
Y
=
c
k
)
f(x)=argmax_{c_k}P(Y=c_k)\prod \limits_{j=1}^JP(X^j=x_i^j|Y=c_k)
f(x)=argmaxckP(Y=ck)j=1∏JP(Xj=xij∣Y=ck)
3、参数估计
\quad \quad
目前,我们已经计算好了最大后验概率的公式,但是公式中还有两个重要的部分没有得到解答,一个是条件概率,一个是先验概率。
3.1 极大似然估计
\quad \quad
先验概率
P
(
Y
=
c
k
)
P(Y=c_k)
P(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
\quad \quad
设第j个特征
x
(
j
)
x^{(j)}
x(j)可能取值的集合为
{
a
j
1
,
a
j
2
,
.
.
.
,
a
j
S
j
}
\{a_{j1},a_{j2},...,a_{jS_j}\}
{aj1,aj2,...,ajSj},则条件概率
P
(
X
(
j
)
=
a
j
l
∣
Y
=
c
k
)
P(X^{(j)}=a_{jl}|Y=c_k)
P(X(j)=ajl∣Y=ck)的极大似然估计是
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
)
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)}
P(X(j)=ajl∣Y=ck)=∑i=1NI(yi=ck)∑i=1NI(xi(j)=ajl,yi=ck)
j
=
1
,
2
,
.
.
.
,
n
;
l
=
1
,
2
,
.
.
.
,
S
j
;
k
=
1
,
2
,
.
.
.
,
K
j=1,2,...,n; l=1,2,...,S_j;k=1,2,...,K
j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K
式中,
x
i
(
j
)
x_i^{(j)}
xi(j)是第i个样本的第j个特征;
a
j
l
a_{jl}
ajl是第j个特征可能取的第l个值;I为指示函数。
3.2 贝叶斯估计
\quad \quad
用极大似然估计的先验概率及条件概率可能出现概率值为0的情况,比如计算先验概率时,发现没有
c
k
c_k
ck类型的样本,那么先验概率
P
(
Y
=
c
k
)
P(Y=c_k)
P(Y=ck)的估计结果将会为0,那么条件概率
P
(
X
j
=
a
j
l
∣
Y
=
c
k
)
P(X^j=a_{jl}∣Y=c_k)
P(Xj=ajl∣Y=ck)的分母将会为0,计算不出结果,后验概率自然也就无法计算了。这种情况下,可以在条件概率中加入一个参数来做平滑即采用贝叶斯估计,公式如下:
条件概率的贝叶斯估计为:
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
)
+
S
j
λ
P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+\lambda}{\sum_{i=1}^NI(y_i=c_k)+S_j\lambda}
P(X(j)=ajl∣Y=ck)=∑i=1NI(yi=ck)+Sjλ∑i=1NI(xi(j)=ajl,yi=ck)+λ
j
=
1
,
2
,
.
.
.
,
n
;
l
=
1
,
2
,
.
.
.
,
S
j
;
k
=
1
,
2
,
.
.
.
,
K
j=1,2,...,n; l=1,2,...,S_j;k=1,2,...,K
j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K
式中 λ ≥ 0 \lambda\geq0 λ≥0。等价于在随机变量各个取值的频数上赋予一个正数 λ ≥ 0 \lambda\geq0 λ≥0。当 λ = 0 \lambda=0 λ=0时就是极大似然估计。常取 λ = 1 \lambda=1 λ=1,这时称为拉普拉斯平滑。显然,对任何 l = 1 , 2 , . . . , S j , k = 1 , 2 , . . . , K l=1,2,...,S_j,k=1,2,...,K l=1,2,...,Sj,k=1,2,...,K有
P
λ
(
X
(
j
)
=
a
j
l
∣
Y
=
c
k
)
>
0
∑
l
=
1
s
j
P
(
X
(
j
)
=
a
j
l
∣
Y
=
c
k
)
=
1
P_\lambda(X^{(j)}=a_{jl}|Y=c_k)>0 \\ \sum_{l=1}^{s_j}P(X^{(j)}=a_{jl}|Y=c_k)=1
Pλ(X(j)=ajl∣Y=ck)>0l=1∑sjP(X(j)=ajl∣Y=ck)=1
表明上式为一种概率分布。
先验概率的贝叶斯估计为:
P
λ
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
+
λ
N
+
K
λ
,
k
=
1
,
2
,
.
.
.
,
K
P_\lambda(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)+\lambda}{N+K\lambda},k=1,2,...,K
Pλ(Y=ck)=N+Kλ∑i=1NI(yi=ck)+λ,k=1,2,...,K
完成先验概率及条件概率的估算后,我们就可以完成后验概率(不需要计算分母)的计算了。针对不同的类标号计算后验概率,计算结果最大的后验概率对应的类标号即为样本对应的类标号。
3、算法
基于极大似然估计的朴素贝叶斯算法
输入:训练数据 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T , x i ( j ) x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T,x_i^{(j)} xi=(xi(1),xi(2),...,xi(n))T,xi(j)是第i个样本的第j个特征, x i ( j ) ∈ { a j 1 , a j 2 , . . . , a j s j } x_i^{(j)}\in\{a_{j1},a_{j2},...,a_{js_j}\} xi(j)∈{aj1,aj2,...,ajsj}, a j l a_{jl} ajl是第j个特征可能取的第l个值, j = 1 , 2 , . . . , n , l = 1 , 2 , . . . , S j , y i ∈ { c 1 , c 2 , . . . , c k } j=1,2,...,n,l=1,2,...,S_j,y_i\in\{c_1,c_2,...,c_k\} j=1,2,...,n,l=1,2,...,Sj,yi∈{c1,c2,...,ck};实例x
输出:实例x的分类
(1)计算先验概率及条件概率
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
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
)
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)}
P(X(j)=ajl∣Y=ck)=∑i=1NI(yi=ck)∑i=1NI(xi(j)=ajl,yi=ck)
j
=
1
,
2
,
.
.
.
,
n
;
l
=
1
,
2
,
.
.
.
,
S
j
;
k
=
1
,
2
,
.
.
.
,
K
j=1,2,...,n; l=1,2,...,S_j;k=1,2,...,K
j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K
(2)对于给定的实例
x
=
(
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
n
)
)
T
x=(x^{(1)},x^{(2)},...,x^{(n)})^T
x=(x(1),x(2),...,x(n))T,计算
P
(
Y
=
c
k
)
∏
j
=
1
n
P
(
X
j
=
x
j
∣
Y
=
c
k
)
,
k
=
1
,
2
,
.
.
.
,
K
P(Y=c_k)\prod \limits_{j=1}^nP(X^j=x^j|Y=c_k),k=1,2,...,K
P(Y=ck)j=1∏nP(Xj=xj∣Y=ck),k=1,2,...,K
(3)确定实例x的类
y = a r g m a x c k P ( Y = c k ) ∏ j = 1 n P ( X j = x j ∣ Y = c k ) , k = 1 , 2 , . . . , K y=argmax_{c_k}P(Y=c_k)\prod \limits_{j=1}^nP(X^j=x^j|Y=c_k),k=1,2,...,K y=argmaxckP(Y=ck)j=1∏nP(Xj=xj∣Y=ck),k=1,2,...,K
4、朴素贝叶斯种类
在sklearn中,朴素贝叶斯种类有三种,分别是GaussianNB、MultinomialNB和BernoulliNB。
4.1高斯朴素贝叶斯(GaussianNB)
\quad \quad 高斯模型,当特征是连续变量时,运用多项式模型,条件概率难以描述真实情况。因此此时用高斯模型,假设特征都服从正态分布。就是求出某一特征的样本和方差得到该特征的正态分布,然后带入样本点进概率密度函数估计为条件概率值,这样就可以计算分类了。
正态分布的概率密度函数计算公式如下:
其中,
C
k
C_k
Ck为Y的第k类类别。
μ
k
μ_k
μk 和
σ
k
2
σ_k^2
σk2为第k类样本在第i个属性上的取值的均值和方差。
sklearn中的GaussianNB实战
采用sklearn中的鸾尾花数据集,由于数据集都是连续属性,所以采用GaussianNB来进行实现。
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d"
% (X_test.shape[0], (y_test != y_pred).sum()))
predict_class = gnb.predict( X_test)
# predict_class_proba = gnb_clf.predict_proba(test_x)
print("测试集准确率为:",accuracy_score(y_test,predict_class))
4.2 多项式朴素贝叶斯(MultinomialNB)
\quad \quad 多项式模型,特征是离散的时候,用多项式模型或做一些平滑的处理。一般是拉普拉斯平滑,这时候用到的是贝叶斯估计,不再是极大似然估计。因为如果不做平滑,当出现一些训练样本中没有的数据时,会使条件概率为0,从而导致后验概率为0。
sklearn中的MultinomialNB实现
官方文档
多项式所涉及的特征往往是次数,频率,计数这样的概念,这些概念都是离散的正整数,因此,sklearn中的MultinomialNB不接受负值的输入。
MultinomialNB包含如下的参数和属性:
class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)
其中
-
alpha
: 浮点数, 可不填 【默认为1.0】
平滑系数λ,如果为0,则表示完全没有平滑选项。需注意,平滑相当于人为给概率加上一些噪音,因此λ设置得越大,精确性会越低(虽然影响不是非常大) -
fit_prior
: 布尔值, 可不填【默认为True】
是否学习先验概率P(Y=c)。如果为False,则所有的样本类别输出都有相同的类别先验概率。即认为每个标签类出现的概率是1/总类别数
class_prior
:形似数组的结构,结构为(n_classes,),可不填【默认为None】
表示类的先验概率P(Y=c)。如果没有给出具体的先验概率则自动根据数据来进行计算。
【实战】
import numpy as np
rng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y)
print(clf.predict(X[2:3]))
4.3 其他分类
-
如果样本特征的分布大部分是连续值(如人的身高,体重等),建议使用GaussianNB会比较好;
-
如果样本特征的分布大部分是多元离散值(如在文档分类中特征是单词出现次数),建议使用MultinomialNB比较好;
-
如果样本特征是二元离散值(如在文档分类中特征是单词是否出现) ,建议使用BernoulliNB比较好。
小结
朴素贝叶斯优缺点
-
优点
算法逻辑简单,易于实现
分类过程,时间和空间开销小 -
缺点
朴素贝叶斯假设特征之间相互独立,然而现实中往往不成立,在特征个数较多或者特征相关性较高时,分类效果不好
参考资料:
1、统计学习方法
2、https://blog.csdn.net/Amy9_Miss/article/details/107622559