假设训练集一共有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(c∣x)
这个我们称之为后验概率
P ( x ∣ c ) P(x|c) P(x∣c)
注意,后验概率 P ( c ∣ x ) P(c|x) P(c∣x)和类条件概率 P ( x ∣ c ) P(x|c) P(x∣c)中的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(c∣x)=P(c)P(x,c)=P(x)P(x∣c)⋅P(c)
P ( c ∣ x ) P(c|x) P(c∣x)表示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(x∣ci)⋅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(c1∣x),P(c2∣x),...,P(cn∣x),在计算这些概率时,因为类别不同,它们的分子 P ( x ∣ c i ) P(x|c_i) P(x∣ci)和 P ( c i ) P(c_i) P(ci)是不同的。但。是分母 P ( x ) P(x) P(x)是一定相同的,因为我们在计算时,**样本x
**的所有特征都是不会变的!既然特征不会变, P ( x ) P(x) P(x)也就都是一样的。
我们正是通过贝叶斯公式构建贝叶斯分类器进行分类,对于贝叶斯分类原则,通常有两种分类方式:最小错误概率分类、最小损失风险分类。
假设一共有N个类别,要预测的变量为x
。j
为假定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=1∑NλjiP(ci∣x)
我们肯定希望错误概率 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(1−P(cj∣x))=j=1,...,Nargmax(P(cj∣x))
因此,在所有的 P ( c ∣ x ) P(c|x) P(c∣x)中,将x
分到 P ( c ∣ x ) P(c|x) P(c∣x)最大的类别中。下面是分类流程:
假设训练集为D,一共有N个类别
假设一共有M条样本(训练集),N个类别。定义如下的分类损失 λ j i \lambda_{ji} λji
λ j i \lambda_{ji} λji | i =1 |
i =2 |
i =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=1∑NλjiP(ci∣x)
我们肯定希望风险最小的类别作为判别类别,因此就有
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} λji | i =1 |
i =2 |
i =3 |
…… | i =N |
---|---|---|---|---|---|
j =1 |
1 | 0 | 0 | 0 | 0 |
j =2 |
0 | 1 | 0 | 0 | 0 |
j =3 |
0 | 0 | 1 | 0 | 0 |
…… | 0 | 0 | 0 | 1 | 0 |
j =N |
0 | 0 | 0 | 1 | 1 |
这样的话,最小危险风险 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(ci∣x)中的值就可以由纯概率组成,不会受到 λ \lambda λ的干扰,因此我将其称作为最小错误概率 P j P_j Pj
除此之外,还有什么不同呢?当然有了!
最小错误概率分类之所以被称为最小错误概率分类,也是因为它只需要计算所有的 P ( c ∣ x ) P(c|x) P(c∣x)然后取其中最大的一个就可以了。
而最小危险风险分类,则需要在计算所有的 P ( c ∣ x ) P(c|x) P(c∣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(c∣x)=P(c)P(x,c)=P(x)P(x∣c)⋅P(c)
由贝叶斯公式我们可以看到,想要求 P ( c ∣ x ) P(c|x) P(c∣x),就必须知道 P ( x ∣ c ) , P ( c ) , P ( x ) P(x|c),P(c),P(x) P(x∣c),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(c1∣x),P(c2∣x),...,P(cn∣x)时,就可以简化成比较 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(x∣c1)∗P(c1),P(x∣c2)∗P(c2),...,P(x∣cn)∗P(cn)
因此我们想要得到具体的分类,就必须去估计 P ( x ∣ c ) P(x|c) P(x∣c),这也正是贝叶斯分类器要训练的东西!
首先回忆以下 P ( x ∣ c ) P(x|c) P(x∣c)是什么?
是类条件概率!那就可以理解为C类别上的X样本
那我们假设C类别上的X样本服从某种分布。有了分布,我们就可以得到对应的概率。
若这样的分布是离散的:则 P ( x ∣ c ) P(x|c) P(x∣c)就为
P ( x ∣ c ) = D c , x D c P(x|c) =\frac{D_{c,x}}{D_c} P(x∣c)=DcDc,x
其中 D c D_c Dc 是c
类别的样本集合, 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(x∣c),这样就可以得到 P ( c ∣ x ) P(c|x) P(c∣x)的值啦
不知道大家注意到一个点没有,我在上文的描述通篇都在用“样本X”。这是为了让大家更好的理解,而使用的一个概念化的表达。在实际应用中,一个样本x
肯定包含多个特征,也就是多维度的。那么贝叶斯公式中
P ( x ∣ c ) ⋅ P ( c ) P ( x ) \frac{P(x|c)\cdot P(c)}{P(x)} P(x)P(x∣c)⋅P(c)
中的 P ( x ∣ c ) , P ( x ) P(x|c),P(x) P(x∣c),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(x1∣c),P(x2∣c),...,P(xm∣c),如果m个特征之间有相互关联的关系,那么它们与 P ( x ∣ c ) P(x|c) P(x∣c)的计算会很复杂。
因此定义一个假设:假设所有特征相互独立
既然独立,那那么 P ( x ∣ c ) P(x|c) P(x∣c)就可以表示为 ( P ( x ) 同理推 P(x)同理推 P(x)同理推):
∏ i = 1 m P ( x i ∣ c ) \prod_{i=1}^{m}P(x_i|c) i=1∏mP(xi∣c)
因此贝叶斯公式就变为
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(c∣x)=P(x)P(c)⋅i=1∏mP(xi∣c)
同理,在参数估计时
离散:
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(xi∣c)=DcDc,xiP(x∣c)=i=1∏mP(xi∣c)
连续:
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=1∏mf(xi;θ)L(θ^)=maxi=1∏mf(xi;θ)
我们称在所有特征相互独立假设基础上的贝叶斯为朴素贝叶斯。
有没有这一种情况,在预测变量A
中,有一个特征 A i A_i Ai,其取值 a i a_i ai未在训练集中出现过。那么此时 P ( A i ∣ c ) = 0 P(A_i|c)=0 P(Ai∣c)=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(xi∣c)=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(xi∣c)=2πσc21e2σ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=∑x∈Dxi 是训练集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(xi∣c)=P(i∣c)xi+(1−P(i∣c))(1−xi)
与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 c
中没有出现作为预测因子的特征 i
,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。
在文本分类的例子中,统计词语是否出现的向量(word occurrence vectors)(而非统计词语出现次数的向量(word count vectors))可以用于训练和使用这个分类器。 BernoulliNB
可能在一些数据集上表现得更好,特别是那些更短的文档。 如果时间允许,建议对两个模型都进行评估。
ComplementNB
实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。计算权重的步骤如下:
具体原理和公式不赘述,可以看看sklearn的官方文档。