机器学习之朴素贝叶斯法(Naive Bayes)
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的中的朴素贝叶斯算法学习请点击这里,里面有详细的教程
参考:
李航博士 《统计机器学习》第二版
机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器
谢谢阅读,请多多指教。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
