超易懂!贝叶斯分类器原理

概率图系列

1.贝叶斯分类器

先验概率:没有任何观测值时候,完全根据经验来判断的概率

假设训练集一共有M个样本,N类。其中c类所占类别为 n c n_c nc条,那么我们可以得到以下的先验概率:
对于 c 类别 : P ( c ) = n c M 对于c类别:P(c) = \frac{n_c}{M} 对于c类别:P(c)=Mnc

后验概率:观测了某个对象,该对象为某个类别的概率

假设我们观测了一个对象x,那么这个对象为c类别的概率为
P ( c ∣ x ) P(c|x) P(cx)
这个我们称之为后验概率

类条件概率:训练集中类C中出现X的概率

P ( x ∣ c ) P(x|c) P(xc)

注意,后验概率 P ( c ∣ x ) P(c|x) P(cx)和类条件概率 P ( x ∣ c ) P(x|c) P(xc)中的x是不一致的。值是一样,含义是不一样的。前者为预测的数据,后者为训练集中的数据。

核心公式:贝叶斯公式

P ( c ∣ x ) = P ( x , c ) P ( c ) = P ( x ∣ c ) ⋅ P ( c ) P ( x ) P(c|x) = \frac{P(x,c)}{P(c)} = \frac{P(x|c)\cdot P(c)}{P(x)} P(cx)=P(c)P(x,c)=P(x)P(xc)P(c)

P ( c ∣ x ) P(c|x) P(cx)表示x被分类成C的概率(后验概率) P ( x , c ) P(x,c) P(x,c)表示x和c同时出现的联合概率, P ( c ) P(c) P(c)表示C类别在所有类别的概率(先验概率)。

P ( x ) P(x) P(x)表示样本x的全概率,所有类别中出现样本x的概率之和。
P ( x ) = ∑ i 所有类别 P ( x ∣ c i ) ⋅ P ( c i ) P(x) = \sum_i^{所有类别} P(x|c_i)\cdot P(c_i) P(x)=i所有类别P(xci)P(ci)
对于 P ( c ) P(c) P(c),是可以通过训练集中每个类别的比例得到的,是不变的。

对于 P ( x ) P(x) P(x),**在同一样本中是一样的。为什么要强调“同一样本中是一样”**的呢?

因为对于一条样本x,我们可以得到 P ( c 1 ∣ x ) , P ( c 2 ∣ x ) , . . . , P ( c n ∣ x ) P(c_1|x),P(c_2|x),...,P(c_n|x) P(c1x),P(c2x),...,P(cnx),在计算这些概率时,因为类别不同,它们的分子 P ( x ∣ c i ) P(x|c_i) P(xci) P ( c i ) P(c_i) P(ci)是不同的。但。是分母 P ( x ) P(x) P(x)是一定相同的,因为我们在计算时,**样本x**的所有特征都是不会变的!既然特征不会变, P ( x ) P(x) P(x)也就都是一样的。

我们正是通过贝叶斯公式构建贝叶斯分类器进行分类,对于贝叶斯分类原则,通常有两种分类方式:最小错误概率分类、最小损失风险分类。

最小错误概率分类:

假设一共有N个类别,要预测的变量为xj为假定x最终分类的类别,i为假定x当前分类的类别。注意:j不一定是x的真实类别,这只是假定x在分类器中的最终分类出来的类别。

定义如下规则:
λ j i = { 0 j = i 1 j ! = i \lambda_{ji} = \begin{cases} 0&j=i\\ 1&j!=i \end{cases} λji={01j=ij!=i
那么对于x的每一种分类情况,我们定义一个错误概率 P j P_j Pj

(可以理解为,假定x最终分类成j类别,那么这时的对于j类别的错误概率 P j P_j Pj就为其他类别的类条件概率加合)
P j = ∑ i = 1 N λ j i P ( c i ∣ x ) P_j = \sum_{i=1}^N\lambda_{ji} P(c_i|x) Pj=i=1NλjiP(cix)
我们肯定希望错误概率 P P P最小的类别作为判别类别,因此就有
j = a r g m i n j = 1 , . . . , N P j j = \underset{j = 1,...,N}{argmin}P_j j=j=1,...,NargminPj
做一个简单的变换
j = a r g m i n j = 1 , . . . , N P j = a r g m i n j = 1 , . . . , N ( 1 − P ( c j ∣ x ) ) = a r g m a x j = 1 , . . . , N ( P ( c j ∣ x ) ) j=\underset{j = 1,...,N}{argmin}P_j\\ = \underset{j = 1,...,N}{argmin}(1-P(c_j|x))\\ =\underset{j = 1,...,N}{argmax}(P(c_j|x)) j=j=1,...,NargminPj=j=1,...,Nargmin(1P(cjx))=j=1,...,Nargmax(P(cjx))
因此,在所有的 P ( c ∣ x ) P(c|x) P(cx)中,将x分到 P ( c ∣ x ) P(c|x) P(cx)最大的类别中。下面是分类流程:

假设训练集为D,一共有N个类别

带入训练好的分类器中
训练集D
根据贝叶斯公式训练出贝叶斯分类器
要预测的样本x
分别得到C个类别对应的概率p_1,p_2,...,p_N
取这C个类别中最大的概率p_i,将样本x分成第i类
最小危险风险分类:

假设一共有M条样本(训练集),N个类别。定义如下的分类损失 λ j i \lambda_{ji} λji

λ j i \lambda_{ji} λjii=1i=2i=3……i=N
j=1 a 11 a_{11} a11 a 12 a_{12} a12 a 13 a_{13} a13 a 1 N a_{1N} a1N
j=2 a 21 a_{21} a21 a 22 a_{22} a22 a 23 a_{23} a23 a 2 N a_{2N} a2N
j=3 a 31 a_{31} a31 a 32 a_{32} a32 a 33 a_{33} a33 a 3 N a_{3N} a3N
……
j=N a 41 a_{41} a41 a 42 a_{42} a42 a 43 a_{43} a43 a 4 N a_{4N} a4N

那么对于x的每一种分类情况,我们定义一个风险损失 R j R_j Rj
R j = ∑ i = 1 N λ j i P ( c i ∣ x ) R_j = \sum_{i=1}^N\lambda_{ji} P(c_i|x) Rj=i=1NλjiP(cix)
我们肯定希望风险最小的类别作为判别类别,因此就有
j = a r g m i n j = 1 , . . . , N R j j = \underset{j = 1,...,N}{argmin}R_j j=j=1,...,NargminRj
看到这里,大家就会发现:最小错误概率分类和最小危险风险分类好像!

答案是:最小错误概率分类是最小危险风险分类的一个特例。原因是 λ j i \lambda_{ji} λji的取值

在最小错误概率分类中, λ j i \lambda_{ji} λji
λ i j = { 0 i = j 1 i ! = j \lambda_{ij} = \begin{cases} 0&i=j\\ 1&i!=j \end{cases} λij={01i=ji!=j
换成表格的形式

λ j i \lambda_{ji} λjii=1i=2i=3……i=N
j=110000
j=201000
j=300100
……00010
j=N00011

这样的话,最小危险风险 R j = ∑ i = 1 N λ j i P ( c i ∣ x ) R_j = \sum_{i=1}^N\lambda_{ji} P(c_i|x) Rj=i=1NλjiP(cix)中的值就可以由纯概率组成,不会受到 λ \lambda λ的干扰,因此我将其称作为最小错误概率 P j P_j Pj

除此之外,还有什么不同呢?当然有了!

最小错误概率分类之所以被称为最小错误概率分类,也是因为它只需要计算所有的 P ( c ∣ x ) P(c|x) P(cx)然后取其中最大的一个就可以了。

最小危险风险分类,则需要在计算所有的 P ( c ∣ x ) P(c|x) P(cx)的基础上,再根据公式计算风险,然后取其中的最小。

因此我们可以得到很相似的流程图:

带入训练好的分类器中
训练集D
根据贝叶斯公式训练出贝叶斯分类器
要预测的样本x
分别得到C个类别对应的概率p_1,p_2,...,p_N
计算所有类别对应的危险风险R_1,R_2,...,R_N
取危险风险中最小的R_i,将x分到 i 类别中

总结:贝叶斯的分类流程很简单,我们还需要掌握的是上述流程图中的**“根据贝叶斯公式训练出贝叶斯分类器”**。

由于“最小错误概率”分类最为常用,因此下面的贝叶斯训练均以“最小错误概率”分类为分类准则。

训练原理:

贝叶斯公式:
P ( c ∣ x ) = P ( x , c ) P ( c ) = P ( x ∣ c ) ⋅ P ( c ) P ( x ) P(c|x) = \frac{P(x,c)}{P(c)} = \frac{P(x|c)\cdot P(c)}{P(x)} P(cx)=P(c)P(x,c)=P(x)P(xc)P(c)
由贝叶斯公式我们可以看到,想要求 P ( c ∣ x ) P(c|x) P(cx),就必须知道 P ( x ∣ c ) , P ( c ) , P ( x ) P(x|c),P(c),P(x) P(xc),P(c),P(x)

其中 P ( c ) P(c) P(c)为先验概率,而对于 P ( x ) P(x) P(x),在预测时,对于每一条样本(预测数据)来说,在**“同一样本(预测数据)中”**是不变的。既然是不变的,那么在比较样本x P ( c 1 ∣ x ) , P ( c 2 ∣ x ) , . . . , P ( c n ∣ x ) P(c_1|x),P(c_2|x),...,P(c_n|x) P(c1x),P(c2x),...,P(cnx)时,就可以简化成比较 P ( x ∣ c 1 ) ∗ P ( c 1 ) , P ( x ∣ c 2 ) ∗ P ( c 2 ) , . . . , P ( x ∣ c n ) ∗ P ( c n ) P(x|c_1)*P(c_1),P(x|c_2)*P(c_2),...,P(x|c_n)*P(c_n) P(xc1)P(c1),P(xc2)P(c2),...,P(xcn)P(cn)

因此我们想要得到具体的分类,就必须去估计 P ( x ∣ c ) P(x|c) P(xc),这也正是贝叶斯分类器要训练的东西!

首先回忆以下 P ( x ∣ c ) P(x|c) P(xc)是什么?

是类条件概率!那就可以理解为C类别上的X样本

那我们假设C类别上的X样本服从某种分布。有了分布,我们就可以得到对应的概率。

若这样的分布是离散的:则 P ( x ∣ c ) P(x|c) P(xc)就为
P ( x ∣ c ) = D c , x D c P(x|c) =\frac{D_{c,x}}{D_c} P(xc)=DcDc,x
其中 D c D_c Dcc类别的样本集合, D c , x D_{c,x} Dc,x是在c类别的样本集合中,x的样本的个数。

若这样的分布是连续的呢?

那么现在有一个尴尬的问题,就是我们假设了这个分布,但是不知道这个分布的具体参数是什么,有了参数,我们才能得到准确的概率密度函数。那么就要进行参数估计(这也是贝叶斯分类器在训练时真正训练的东西,训练分布的参数取值)!

因此贝叶斯分类中采取了一个十分重要的参数估计原则:最大似然估计

最大似然估计:

x在C类别上是连续的,假设这个分布的概率密度函数为 f ( x , θ ) f(x,\theta) f(x,θ) θ \theta θ是未知参数。

x的似然函数为:
L ( θ ) = L ( x ; θ ) = f ( x , θ ) L(\theta) = L(x;\theta) = f(x,\theta) L(θ)=L(x;θ)=f(x,θ)
若存在 θ ^ = θ ^ ( x ) ∈ I ( I 是 θ 可能的取值范围 ) \hat{\theta} = \hat{\theta}(x) \in I(I是\theta可能的取值范围) θ^=θ^(x)I(Iθ可能的取值范围),使
L ( θ ^ ) = m a x f ( x , θ ) L(\hat{\theta}) = maxf(x,\theta) L(θ^)=maxf(x,θ)
则称 θ ^ ( x ) \hat{\theta}(x) θ^(x)为参数 θ \theta θ最大似然估计值

比如,假设该分布为高斯分布,那么 θ = [ μ , σ ] \theta = [\mu,\sigma] θ=[μ,σ], L ( θ ) = L ( μ , σ ) L(\theta) = L(\mu,\sigma) L(θ)=L(μ,σ),估计的就是 μ \mu μ σ \sigma σ

在我们得到了参数 θ ^ \hat{\theta} θ^后,我们会把 f ( x , θ ^ ) f(x,\hat{\theta}) f(x,θ^)作为 P ( x ∣ c ) P(x|c) P(xc),这样就可以得到 P ( c ∣ x ) P(c|x) P(cx)的值啦

朴素贝叶斯

不知道大家注意到一个点没有,我在上文的描述通篇都在用“样本X”。这是为了让大家更好的理解,而使用的一个概念化的表达。在实际应用中,一个样本x肯定包含多个特征,也就是多维度的。那么贝叶斯公式中
P ( x ∣ c ) ⋅ P ( c ) P ( x ) \frac{P(x|c)\cdot P(c)}{P(x)} P(x)P(xc)P(c)
中的 P ( x ∣ c ) , P ( x ) P(x|c),P(x) P(xc),P(x)到底要怎么计算呢?

假设样本x有m个特征: x 1 , x 2 , . . . , x m x_1,x_2,...,x_m x1,x2,...,xm

那么我们就会有 P ( x 1 ∣ c ) , P ( x 2 ∣ c ) , . . . , P ( x m ∣ c ) P(x_1|c),P(x_2|c),...,P(x_m|c) P(x1c),P(x2c),...,P(xmc),如果m个特征之间有相互关联的关系,那么它们与 P ( x ∣ c ) P(x|c) P(xc)的计算会很复杂。

因此定义一个假设:假设所有特征相互独立

既然独立,那那么 P ( x ∣ c ) P(x|c) P(xc)就可以表示为 ( P ( x ) 同理推 P(x)同理推 P(x)同理推):
∏ i = 1 m P ( x i ∣ c ) \prod_{i=1}^{m}P(x_i|c) i=1mP(xic)
因此贝叶斯公式就变为
P ( c ∣ x ) = P ( c ) P ( x ) ⋅ ∏ i = 1 m P ( x i ∣ c ) P(c|x) = \frac{ P(c)}{P(x)}\cdot \prod_{i=1}^{m}P(x_i|c) P(cx)=P(x)P(c)i=1mP(xic)
同理,在参数估计时

离散:

P ( x i ∣ c ) = D c , x i D c P ( x ∣ c ) = ∏ i = 1 m P ( x i ∣ c ) \\P(x_i|c) =\frac{D_{c,x_i}}{D_c}\\ P(x|c) =\prod_{i=1}^{m}P(x_i|c) P(xic)=DcDc,xiP(xc)=i=1mP(xic)

连续:
L ( θ ) = L ( x 1 , . . . , x m ; θ ) = ∏ i = 1 m f ( x i ; θ ) L ( θ ^ ) = m a x ∏ i = 1 m f ( x i ; θ ) L(\theta) = L(x_1,...,x_m;\theta) = \prod_{i=1}^m f(x_i;\theta)\\ L(\hat{\theta}) = max\prod_{i=1}^mf(x_i;\theta) L(θ)=L(x1,...,xm;θ)=i=1mf(xi;θ)L(θ^)=maxi=1mf(xi;θ)

我们称在所有特征相互独立假设基础上的贝叶斯为朴素贝叶斯。

拉普拉斯修正

有没有这一种情况,在预测变量A中,有一个特征 A i A_i Ai,其取值 a i a_i ai未在训练集中出现过。那么此时 P ( A i ∣ c ) = 0 P(A_i|c)=0 P(Aic)=0

这样的不合理的!因此我们要对上面的公式进行修正,一般采用“拉普拉斯修正”
P ( c ) = D c + 1 D + N P(c) = \frac{D_c+1}{D+N} P(c)=D+NDc+1
D c D_c Dc表示C类在训练集中的数量, D D D表示训练集的总数量,N表示训练集 D D D中可能的类别数
P ( x i ∣ c ) = D c , x i + 1 D c + N i P(x_i|c) = \frac{D_{c,x_i}+1}{D_c +N_i} P(xic)=Dc+NiDc,xi+1
N i N_i Ni表示第 i i i个特征可能的取值数。

拉普拉斯修正避免了因训练集样本不充分而导致概率估值为零的问题, 并且在训练集变大时,修正过程所引入的先验(prior)的影响也会逐渐变得可忽 略,使得估值渐趋向于实际概率值。

Sklearn中使用贝叶斯分类器

高斯朴素贝叶斯

GaussianNB,假设分布为高斯分布。
P ( x i ∣ c ) = 1 2 π σ c 2 e − ( x i − μ c ) 2 2 σ c 2 \large P(x_i|c) = \frac{1}{\sqrt{2\pi\sigma^2_{c}}}e^{\frac{-(x_i-\mu_c)^2}{2\sigma^2_c}} P(xic)=2πσc2 1e2σc2(xiμc)2
参数 μ c , σ c \mu_c,\sigma_c μc,σc使用最大似然法估计

from sklearn import datasets#选取iris数据集
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
#训练
model = gnb.fit(iris.data, iris.target)
#预测
y_pre = model.predict(iris.data)

多项式朴素贝叶斯

MultionmialNB

服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中TF-IDF 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。

分布参数由每类 C C C 的$\theta_C =(\theta_{c1},…,\theta_{cn}) $ 向量决定, 式中n是特征的数量(对于文本分类,是词汇量的大小) θ c i \theta_{ci} θci 是样本中属于类c 中特征 i概率 P ( x i , ∣ c ) P(x_i,|c) P(xi,c)

参数 θ c \theta_c θc使用平滑过的最大似然估计法来估计,即相对频率计数:
θ c i ^ = N c i + α N c + α n \hat{\theta_{ci}} = \frac{N_{ci}+\alpha}{N_c+\alpha n} θci^=Nc+αnNci+α
N c i = ∑ x ∈ D x i N_{ci} = \sum_{x\in D}x_i Nci=xDxi 是训练集D中特征i在类c中出现的次数, N c = ∑ i = 1 n N c i N_c = \sum_{i=1}^{n}N_{ci} Nc=i=1nNci 是类c中出现所有特征的计数总和。

先验平滑因子 α > = 0 \alpha >=0 α>=0 为在学习样本中没有出现的特征而设计,以防在将来的计算中出现0概率输出。 把 α = 1 \alpha= 1 α=1被称为拉普拉斯平滑(Lapalce smoothing),而 α < 1 \alpha <1 α<1被称为Lidstone平滑方法(Lidstone smoothing)。

伯努利朴素贝叶斯

BernoulliNB实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于:
P ( x i ∣ c ) = P ( i ∣ c ) x i + ( 1 − P ( i ∣ c ) ) ( 1 − x i ) P(x_i|c) = P(i|c)x_i+(1-P(i|c))(1-x_i) P(xic)=P(ic)xi+(1P(ic))(1xi)
与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 c中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。

在文本分类的例子中,统计词语是否出现的向量(word occurrence vectors)(而非统计词语出现次数的向量(word count vectors))可以用于训练和使用这个分类器。 BernoulliNB 可能在一些数据集上表现得更好,特别是那些更短的文档。 如果时间允许,建议对两个模型都进行评估。

补充朴素贝叶斯

ComplementNB实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。计算权重的步骤如下:

具体原理和公式不赘述,可以看看sklearn的官方文档。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值