1. 朴素贝叶斯算法简介
朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性假设为前提,就会导致算法精度在某种程度上受影响。朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法,是一种典型的生成方法,即学习到了输入与输出的联合概率分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y),这个就是朴素贝叶斯法学习的成果。学习到这个有什么用呢?通过这个联合概率布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)结合
P
(
X
)
P(X)
P(X),
P
(
X
)
P(X)
P(X)对于给定样本X是已知的,就能求出在给定实例
x
x
x下分类为某类
c
k
c_k
ck的概率
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
X
=
x
,
Y
=
c
k
)
P
(
X
=
x
)
P(Y=c_k|X=x)=\frac{P(X=x, Y=c_k)}{P(X=x)}
P(Y=ck∣X=x)=P(X=x)P(X=x,Y=ck)
朴素贝叶斯把x对应的最大概率的那一类作为输出。
1.1 什么是贝叶斯定理
首先贝叶斯定理的表达式是
P
(
Y
∣
X
)
=
P
(
Y
)
P
(
X
∣
Y
)
P
(
X
)
P(Y|X)=\frac{P(Y)P(X|Y)}{P(X)}
P(Y∣X)=P(X)P(Y)P(X∣Y),即知道了在Y已知条件下X的概率以及X与Y的概率,就能求出在X已知条件下Y的概率。在这个算法背景下,如果知道了在分类Y已知条件下某实例X的概率,以及Y为某一类的概率和X为某具体实例的概率,就能求出在特征实例X已知条件下分类Y的概率。即:
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)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{P(X=x)}
P(Y=ck∣X=x)=P(X=x)P(Y=ck)P(X=x∣Y=ck)
而
P
(
X
=
x
)
P(X=x)
P(X=x)无法直接求出,必须是要在已知具体某一类
Y
=
c
k
Y=c_k
Y=ck的条件下才能求出。所以根据全概率公式,有:
P
(
X
=
x
)
=
∑
k
=
1
K
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
P(X=x)=\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)
P(X=x)=k=1∑KP(X=x∣Y=ck)P(Y=ck)
于是朴素贝叶斯模型的基本形式如下:
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
Y
=
c
k
)
P
(
X
=
x
∣
Y
=
c
k
)
∑
k
=
1
K
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}
P(Y=ck∣X=x)=k=1∑KP(X=x∣Y=ck)P(Y=ck)P(Y=ck)P(X=x∣Y=ck)
这时我们可以观察一下,要学习到一个朴素贝叶斯模型,需要学习什么呢?本质上朴素贝叶斯是需要学习到输入输出的联合分布,即P(X,Y),但利用贝叶斯定理以及全概率,其实只需要学习两个先验分布:
P
(
Y
=
c
k
)
P(Y=c_k)
P(Y=ck)以及
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|Y=c_k)
P(X=x∣Y=ck)。
1.2 什么特征条件独立?
事件A与B独立的充要条件为
P
(
A
B
)
=
P
(
A
)
∗
P
(
B
)
P(AB)=P(A)*P(B)
P(AB)=P(A)∗P(B),或者说
P
(
A
=
A
i
,
B
=
B
j
)
=
P
(
A
=
A
i
)
∗
P
(
B
=
B
j
)
P(A=A_i, B=B_j)=P(A=A_i)*P(B=B_j)
P(A=Ai,B=Bj)=P(A=Ai)∗P(B=Bj)对于A、B的任意取值都成立。即A取什么值与B取什么值没有联系。在朴素贝叶斯法学习下,特征独立指的就是每一个特征取什么值与其余的特征取值无关,所以在学习一个实例
x
x
x(包含n个特征,即
x
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
x=(x^{1},x^{2} ,...,x^{n})
x=(x1,x2,...,xn))的概率时可以这样:
P
(
X
=
x
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
.
,
X
n
=
x
n
)
P(X=x) = P(X^{1} =x^{1}, X^{2} =x^{2},....,X^{n} =x^{n})
P(X=x)=P(X1=x1,X2=x2,....,Xn=xn)
而由于每个特征的取值与其余特征无关,所以上式可以写为:
P
(
X
=
x
)
=
P
(
X
1
=
x
1
)
∗
P
(
X
2
=
x
2
)
∗
.
.
.
.
∗
P
(
X
n
=
x
n
)
P(X=x) = P(X^{1} =x^{1})*P(X^{2} =x^{2})*....*P(X^{n} =x^{n})
P(X=x)=P(X1=x1)∗P(X2=x2)∗....∗P(Xn=xn)
特征条件独立是在给定条件下特征要独立,这个条件就是指定实例
x
x
x所对应的类别
Y
=
C
k
Y=C_k
Y=Ck,也就是说给定实例
x
x
x的类别
Y
=
C
k
Y=C_k
Y=Ck条件下,
x
x
x特征独立。即:
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
X
1
=
x
1
∣
Y
=
C
k
)
∗
P
(
X
2
=
x
2
∣
Y
=
C
k
)
∗
.
.
.
.
∗
P
(
X
n
=
x
n
∣
Y
=
C
k
)
P(X=x|Y=C_k) = P(X^{1} =x^{1}|Y=C_k)*P(X^{2} =x^{2}|Y=C_k)*....*P(X^{n} =x^{n}|Y=C_k)
P(X=x∣Y=Ck)=P(X1=x1∣Y=Ck)∗P(X2=x2∣Y=Ck)∗....∗P(Xn=xn∣Y=Ck)
假设特征条件独立的意义在于减少参数的数量,极大地简化模型,计算速度快,但是现实中特征或多或少有联系,特征条件独立的假设可能会牺牲一定的分类准确率。
1.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
⊆
R
n
x_i\in\mathcal{X}\sube R^n
xi∈X⊆Rn为实例的特征向量,
y
i
∈
Y
=
{
c
1
,
c
2
,
.
.
.
,
c
K
}
为
实
例
的
类
别
,
i
=
1
,
2
,
.
.
.
,
N
y_i \in \mathcal{Y}=\{c_1,c_2,...,c_K\}为实例的类别, i=1,2,...,N
yi∈Y={c1,c2,...,cK}为实例的类别,i=1,2,...,N
朴素贝叶斯根据训练数据集学习联合概率分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)。具体学习以下先验(已知y,叫先验;后知y,叫后验)概率分布:
P
(
Y
=
c
k
)
,
k
=
1
,
2
,
.
.
.
,
K
P(Y=c_k),k=1,2,...,K
P(Y=ck),k=1,2,...,K
P
(
X
=
x
∣
Y
=
c
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
,
X
n
=
x
n
∣
Y
=
c
k
)
P(X=x|Y=c_k)=P(X^1=x^1,X^2=x^2,...,X^n=x^n |Y=c_k )
P(X=x∣Y=ck)=P(X1=x1,X2=x2,...,Xn=xn∣Y=ck)
从以上两个先验概率分布学习到联合分布
P
(
X
,
Y
)
=
P
(
X
=
x
,
Y
=
c
k
)
P(X,Y)=P(X=x, Y=c_k)
P(X,Y)=P(X=x,Y=ck)
P ( X = x , Y = c k ) = P ( X 1 = x 1 , X 2 = x 2 , . . . , X n = x n , Y = c k ) P(X=x, Y=c_k)=P(X^1=x^1,X^2=x^2,...,X^n=x^n ,Y=c_k ) P(X=x,Y=ck)=P(X1=x1,X2=x2,...,Xn=xn,Y=ck)
可是有个问题, P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=x∣Y=ck)的参数非常多,估计起来有点不现实: 若第j个特征 x j x^j xj的取值有 S j S_j Sj个,则总共要求的参数就有 K ∏ j = 1 n S j K\displaystyle\prod_{j=1}^nS_j Kj=1∏nSj个, 即要学习 K ∏ j = 1 n S j K\displaystyle\prod_{j=1}^nS_j Kj=1∏nSj个概率,得到$P(X=x, Y=c_k)的分布。比如有5个特征,每个特征取值5个,总共3分类,看似已经很简单了,可是参数的个数却有 3 ∗ 5 5 3*5^5 3∗55=9375个,更别说特征数量以及维度大一点的模型了。
所以对于这个问题,需要做一些假设,即特征条件独立的假设,这个假设是说当在给定类
c
k
c_k
ck的条件下,每个特征的取值与其他特征是独立的,这是一个很强的假设,但可以极大地简化模型,朴素贝叶斯的naive正是因此而来。在这个假设条件下
P
(
X
=
x
∣
Y
=
c
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
,
X
n
=
x
n
∣
Y
=
c
k
)
=
∏
j
=
1
n
P
(
X
j
=
x
j
∣
Y
=
c
k
)
\begin{aligned} P(X=x|Y=c_k) &=P(X^1=x^1,X^2=x^2,...,X^n=x^n |Y=c_k )\\ &=\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)\\ \end{aligned}
P(X=x∣Y=ck)=P(X1=x1,X2=x2,...,Xn=xn∣Y=ck)=j=1∏nP(Xj=xj∣Y=ck)
在这时,上面那个条件概率分布
P
(
X
=
x
∣
Y
=
c
k
)
P(X=x|Y=c_k)
P(X=x∣Y=ck)参数个数为
K
∑
j
=
1
n
S
j
=
3
∗
(
5
∗
5
)
=
75
K\displaystyle\sum_{j=1}^nS_j=3*(5*5)=75
Kj=1∑nSj=3∗(5∗5)=75个,极大的减少了参数的数量。但是所带来的缺点就是会牺牲一定的分类准确率。
1.4 朴素贝叶斯模型与学习策略
上面简化模型之后,朴素贝叶斯法根据输入的实例 x x x,计算出每一类的概率,并将概率最大的那一类最为 x x x的类输出。这就是模型的评价准则,给定 x x x可能输出的类有K个,哪一个类最好呢?就是当后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x)最大的那个类最好。
P ( Y = c k ∣ X = x ) = P ( Y = c k , X = x ) P ( X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) P ( X = x ) = ∏ j = 1 n P ( X j = x j ∣ Y = c k ) P ( Y = c k ) ∑ k = 1 K P ( X = x ∣ Y = c k ) P ( Y = c k ) \begin{aligned} P(Y=c_k|X=x) &=\frac{P(Y=c_k,X=x)}{P(X=x)}\\ &=\frac{P(X=x|Y=c_k)P(Y=c_k)}{P(X=x)}\\ &=\frac{\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}\\ \end{aligned} P(Y=ck∣X=x)=P(X=x)P(Y=ck,X=x)=P(X=x)P(X=x∣Y=ck)P(Y=ck)=k=1∑KP(X=x∣Y=ck)P(Y=ck)j=1∏nP(Xj=xj∣Y=ck)P(Y=ck)
模型的输出y为:
y
=
f
(
x
)
=
arg max
c
k
∏
j
=
1
n
P
(
X
j
=
x
j
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
∑
k
=
1
K
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
y=f(x)={\underset {c_k}{\operatorname {arg\,max} }}\frac{\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}
y=f(x)=ckargmaxk=1∑KP(X=x∣Y=ck)P(Y=ck)j=1∏nP(Xj=xj∣Y=ck)P(Y=ck)
对于每一类
c
k
c_k
ck来说,分母都一样,所以在求极大值时可以省略,故而最终输出为:
y
=
f
(
x
)
=
arg max
c
k
∏
j
=
1
n
P
(
X
j
=
x
j
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
y=f(x)={\underset {c_k}{\operatorname {arg\,max} }}\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k)
y=f(x)=ckargmaxj=1∏nP(Xj=xj∣Y=ck)P(Y=ck)
所以观察这个公式,给定数据集,这个方法所要求的就是Y取每一类的概率,然后在每一类确定的情况下每个特征取到某个具体值的条件概率。
所以朴素贝叶斯模型能计算出在给定实例 x x x下,计算出每一类的概率。然后依据后验概率最大化(也是期望风险最小化,即学习策略)将实例强行归为后验概率最大的那个类别并输出。
2 参数估计
知道了朴素贝叶斯法的基本方法,具体是怎么学习的,输出的类是是后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x)最大的类,那么怎么来求出这个概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x)呢?可以看出这个概率有两种参数:
- 类概率: P ( Y = c k ) , k = 1 , 2 , . . . , K P(Y=c_k),k=1,2,...,K P(Y=ck),k=1,2,...,K
- 给定类下 第 j 个 特 征 取 第 l 个 值 的 概 率 第j个特征取第l个值的概率 第j个特征取第l个值的概率 : P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xlj∣Y=ck)
只要模型求出了这类参数,就可以求出给定 x x x下输出每一类的概率,并把概率最大的类最为输出值。
2.1 极大似然估计
现用极大似然估计法求这两类参数:
首先估计
P
(
Y
=
c
k
)
P(Y=c_k)
P(Y=ck),以k类为代表,k=1,2,…,K
令:
P
(
Y
=
c
k
)
=
P
k
,
P
(
Y
≠
c
k
)
=
1
−
P
k
P(Y=c_k)=P_k ,P(Y\ne c_k)=1-P_k
P(Y=ck)=Pk,P(Y=ck)=1−Pk
则似然函数L为:
L
(
P
k
)
=
P
k
∑
i
=
1
N
I
(
y
i
=
c
k
)
(
1
−
P
k
)
∑
i
=
1
N
I
(
y
i
≠
c
k
)
L(P_k)=P_k^{\small\displaystyle\sum_{i=1}^NI(y_i=c_k) }(1-P_k)^{\small\displaystyle\sum_{i=1}^NI(y_i\ne c_k) }
L(Pk)=Pki=1∑NI(yi=ck)(1−Pk)i=1∑NI(yi=ck)
l
n
L
(
P
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
∗
l
n
P
k
+
∑
i
=
1
N
I
(
y
i
≠
c
k
)
∗
l
n
(
1
−
P
k
)
ln L(P_k)=\displaystyle\sum_{i=1}^NI(y_i=c_k)*lnP_k +\displaystyle\sum_{i=1}^NI(y_i\ne c_k)*ln(1-P_k)
lnL(Pk)=i=1∑NI(yi=ck)∗lnPk+i=1∑NI(yi=ck)∗ln(1−Pk)
∂
l
n
L
(
P
k
)
∂
P
k
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
P
k
−
∑
i
=
1
N
I
(
y
i
≠
c
k
)
1
−
P
k
=
0
\frac{\partial ln L(P_k)}{\partial P_k} =\frac{\displaystyle\sum_{i=1}^NI(y_i=c_k)}{P_k}-\frac{\displaystyle\sum_{i=1}^NI(y_i\ne c_k)}{1-P_k}=0
∂Pk∂lnL(Pk)=Pki=1∑NI(yi=ck)−1−Pki=1∑NI(yi=ck)=0
解得
P
k
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
P_k=\frac{\displaystyle\sum_{i=1}^NI(y_i=c_k)}{N}
Pk=Ni=1∑NI(yi=ck),k=1,2,…,K
下面估计 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xlj∣Y=ck), X j X^j Xj可能取值为 { x 1 j , x 2 j , . . . , x S j j } \{x^j_1,x^j_2,...,x^j_{S_j} \} {x1j,x2j,...,xSjj}
令
P
(
X
j
=
x
l
j
∣
Y
=
c
k
)
=
P
k
j
l
P(X^j=x^j_l|Y=c_k)=P_{kjl}
P(Xj=xlj∣Y=ck)=Pkjl,
P
(
X
j
≠
x
l
j
∣
Y
=
c
k
)
=
1
−
P
k
j
l
P(X^j\ne x^j_l|Y=c_k)=1-P_{kjl}
P(Xj=xlj∣Y=ck)=1−Pkjl
则似然函数为:
L
(
P
k
j
l
)
=
P
k
j
l
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
=
x
l
j
)
(
1
−
P
k
j
l
)
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
≠
x
l
j
)
L(P_{kjl})=P_{kjl}^{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }(1-P_{kjl})^{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l) }
L(Pkjl)=Pkjli=1∑NI(yi=ck,Xj=xlj)(1−Pkjl)i=1∑NI(yi=ck,Xj=xlj)
l
n
L
(
P
k
j
l
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
=
x
l
j
)
∗
l
n
P
k
j
l
+
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
≠
x
l
j
)
∗
l
n
(
1
−
P
k
j
l
)
ln L(P_{kjl})={\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }*lnP_{kjl} +{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l)*ln(1-P_{kjl}) }
lnL(Pkjl)=i=1∑NI(yi=ck,Xj=xlj)∗lnPkjl+i=1∑NI(yi=ck,Xj=xlj)∗ln(1−Pkjl)
∂
l
n
L
(
P
k
j
l
)
∂
P
k
j
l
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
=
x
l
j
)
P
k
j
l
−
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
≠
x
l
j
)
∗
l
n
(
1
−
P
k
j
l
)
1
−
P
k
j
l
=
0
\frac{\partial ln L(P_{kjl})}{\partial P_{kjl}} =\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }{P_{kjl}}-\frac{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l)*ln(1-P_{kjl})}{1-P_{kjl}}=0
∂Pkjl∂lnL(Pkjl)=Pkjli=1∑NI(yi=ck,Xj=xlj)−1−Pkjli=1∑NI(yi=ck,Xj=xlj)∗ln(1−Pkjl)=0
解得
P
k
j
l
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
=
x
l
j
)
∑
i
=
1
N
I
(
y
i
=
c
k
)
P_{kjl}=\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }{\displaystyle\sum_{i=1}^NI(y_i= c_k)}
Pkjl=i=1∑NI(yi=ck)i=1∑NI(yi=ck,Xj=xlj)
通过以上两个极大似然估计值可以看到, P ( Y = c k ) P(Y=c_k) P(Y=ck)就是所有样本中 c k c_k ck出现的频率,而 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xlj∣Y=ck)就是在 c k c_k ck类样本当中, j j j特征取到第 l l l个值的频率 。
2.2贝叶斯估计
极大似然估计可能会出现一个问题,即新输入的实例 x x x的某个特征取的值,在某个类下未出现过。如 ∑ i = 1 N I ( y i = c k , X j = x l j ) = 0 \displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l)=0 i=1∑NI(yi=ck,Xj=xlj)=0,就说在类 c k c_k ck下,第 j j j个特征从未取到过第 l l l个值,这时候 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xlj∣Y=ck)=0,所以 P ( Y = c k ∣ X = x ) = 0 P(Y=c_k|X=x)=0 P(Y=ck∣X=x)=0,显然这个问题会影响后验概率的结果,因为训练集未出现这个情况并不代表这个 x x x特征下完全不可能是 c k c_k ck类。解决这个问题的一种方法是采用贝叶斯估计。
条件概率的贝叶斯估计是:
P
λ
(
X
j
=
x
l
j
∣
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
,
X
j
=
x
l
j
)
+
λ
∑
i
=
1
N
I
(
y
i
=
c
k
)
+
S
j
λ
P_\lambda(X^j=x^j_l|Y=c_k)=\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) +\lambda}{\displaystyle\sum_{i=1}^NI(y_i= c_k)+S_j\lambda}
Pλ(Xj=xlj∣Y=ck)=i=1∑NI(yi=ck)+Sjλi=1∑NI(yi=ck,Xj=xlj)+λ
其中
S
j
S_j
Sj是特征j的取值总个数,
λ
>
=
0
\lambda>= 0
λ>=0。
当 λ \lambda λ取0时,结果和极大似然估计一样,当 λ = 1 \lambda=1 λ=1时,称为拉普拉斯平滑。
模型的介绍到这就结束了,下面进行实例演练。
3.实例操作
就用李航博士《统计机器学习》第二版树上的例题来做。
import numpy as np
import pandas as pd
- 创建数据
X_1=np.array([1,1,1,1,1,2,2,2,2,2,3,3,3,3,3])
X_2=np.array(['s','m','m','s','s','s','m','m','l','l','l','m','m','l','l'])
y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
data = pd.DataFrame(columns=['X_1','X_2','y'])
data['X_1'] = X_1
data['X_2'] = X_2
data['y'] = y
- 分离实例与标签
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
- 构造朴素贝叶斯模型
def NB(X,y,x):
"""
X:训练集特征矩阵
y:训练集标签数组
x:需要预测的实例
"""
p_y={} # 用来计算每个类的概率 P(Y=ck)
p_Y_x = {} # 用来保存所有的条件概率
for i in np.unique(y):
p_y[i] = sum(y==i)/len(y)
p_Y_x[i]={}
for n in X.columns:
p_Y_x[i][n] = {}
for x1 in np.unique(X[n]):
p_Y_x[i][n][x1] = sum(data[y==i][n]==x1)/sum(y==i)
p_x = {} # 用来储存在x条件下输出每一类的概率
for k in np.unique(y):
p_x[k] = p_y[k]
for m,p in zip(X.columns,x):
p_x[k] = p_x[k] * p_Y_x[k][m][p]
print(p_x)
final_class = max(p_x, key=p_x.get) # 取概率最大的类输出
return final_class
NB(X,y,x) # 输出-1
可以看到,输出-1类的概率为1/15,输出+1类的概率为1/45,所以最终输出了-1类。该手写模型适用于任意数量的类,任意数量的特征,每个特征取值也可以是任意数量的。对参数采用极大似然估计,该模型没解决要估计的某个条件概率为0的情况,下面加入 λ \lambda λ。
def NB_lambad(X,y,x,_lambda):
"""
X:训练集特征矩阵
y:训练集标签数组
x:需要预测的实例
"""
p_y={} # 用来计算每个类的概率 P(Y=ck)
p_Y_x = {} # 用来保存所有的条件概率
for i in np.unique(y):
p_y[i] = sum(y==i)/len(y)
p_Y_x[i]={}
for n in X.columns:
p_Y_x[i][n] = {}
for x1 in np.unique(X[n]):
# 贝叶斯估计只需修改这步
p_Y_x[i][n][x1] = ( sum(data[y==i][n]==x1)+_lambda) / (sum(y==i)+len(np.unique(X[n]))*_lambda)
p_x = {} # 用来储存在x条件下输出每一类的概率
for k in np.unique(y):
p_x[k] = p_y[k]
for m,p in zip(X.columns,x):
p_x[k] = p_x[k] * p_Y_x[k][m][p]
print(p_x)
final_class = max(p_x, key=p_x.get) # 取概率最大的类输出
return final_class
NB_lambad(X,y,x,1) # 输出-1
至于机器学习库scikit-learn的中的朴素贝叶斯算法学习请点击这里,里面有详细的教程
参考:
李航博士 《统计机器学习》第二版
机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器
谢谢阅读,请多多指教。