首页 > 技术文章 > 贝叶斯分类器

jiaxin359 2018-04-25 15:51 原文

概率条件下的期望风险最小化

  贝叶斯分类器是从统计学和概率论的角度来研究机器学习的,我们假设各种分布概率是已知的。

  我们以 $X$表示样本空间,$Y$表示类标记空间。$Y=\{ c_1,c_2,…,c_N\}$。 这里的$X$已经不仅仅是我们观察到的数据样本的集合了,而是所有可能的数据的集合。

  以$\lambda_{ij}$表示将第$c_j$类预测为第$c_i$类的损失。

  根据后验概率$p(c_i|\mathbf{x})$,我们可以得到将样本$\mathbf{x}$分类为$c_i$的期望损失$R(c_i|\mathbf{x})$  即:

  $R(c_i|\mathbf{x}) =  \sum \limits_{j=1}^{N} p(c_j)|\mathbf{x})$

  (这里的后验概率如何理解?字面理解是当样本为$\mathbf{x}$的时候,分类为$c_i$的概率。也就是当我们任意给定一个样本$\mathbf{x}$的时候,我们把它分类为$c_j$的概率。其实这里的概率是预先假设的。在后面我们将会看到,我们还是要求这个后验概率的。)

  在统计学习的角度下,我们想要学习一个模型h,或者叫做判别标准$h: X \to Y$,以最小化总体风险,总体风险如下:

$R(h) = E_x[R(h(\mathbf{x}) | \mathbf{x})]$

  好吧,到这里的时候,我们其实可以发现这个风险函数和我们一般意义上面的期望风险  $R_{exp}(f) = E_P[L(Y,F(X))]$是差不多的。其中L是某种损失函数,F(x)是模型作用在X上的输出结果,与这里的h(x)是一样的。

  这两个公式都是反映的以某种算法来进行建模(或者叫做映射、判定等),所得到的期望风险。只不过前者是在概率的角度下进行的,而后者是一种整体的描述,可以说前者是后者的一种特例。

 

贝叶斯决策论

  贝叶斯判定准则(Bayes decision rule):为了最小化总体风险,只需在每个样本上选择那个能使条件风险R(c|x)最小的类别标记。 当我们使用贝叶斯判定准则来求解判定准则的时候,得到即: $h^{*}(\mathbf{x})  = \arg  \min \limits_{c \in Y}   R(c| \mathbf{x})$,此时的$h^{*}$称为最优贝叶斯分类器。

当误判损失$\lambda_{ij}$

$$ \lambda_{ij}=\left\{
\begin{aligned}
0,  & \ if \ i= j; \\
1, & \ otherwise.
\end{aligned}
\right.
$$

  这个时候条件风险:$R(c|\mathbf{x}) = 1 – p(c|\mathbf{x})$,此时最优分类器为:

$h^{*}(\mathbf{x})  = \arg  \max \limits_{c \in Y}  p(c|\mathbf{x}) $

 

  注意:这里的关键点是$p(c|\mathbf{x})$,在这里的x表示的是全体的x的分布,而不仅仅是我们数据集当中的x,也就是说这里依然使用期望风险来进行求解。 但是期望风险是得不到的,我们只能用已有的数据集当中估计出来后验概率$p(c|\mathbf{x})$,也就是使用经验风险最小化。所以,从概率的角度来解释是这样的:我们要用我们已有的数据集x来估计出来$p(c|\mathbf{x})$。

  为了求解上面的$p(c|\mathbf{x})$主要有两种方法,一种是直接建模来预测$p(c|\mathbf{x})$,这种模型叫做判别式模型,比如逻辑回归当中,建立的模型是这样的$p(c|\mathbf{x}) = \frac{1}{1+e^ {-c (\mathbf{w}^T \mathbf{x} + b)}}$ 。另外一种是对联合概率分布$p(\mathbf{x},c)$建模。这种模型叫做生成式模型。

  对于$p(\mathbf{x},c)$,按照贝叶斯公式有:$p(c|\mathbf{x}) =  \frac{p(\mathbf{x},c)}{p(\mathbf{x})} =\frac{p(c) p(\mathbf{x}|c)} {p(\mathbf{x})} $

  其中, $p(c)$是类别的先验概率分布,可以使用样本中的数据进行预测。$p(\mathbf{x}|c)$是似然。$p(\mathbf{x})$是样本的分布,它对于所有的类标记都相同,所以我们的任务主要是求出先验概率分布和似然。

  对于先验概率分布,根据大数定理,我们可以使用样本中标签的概率来进行代替。而对于后验概率$p(\mathbf{x}|c)$,如果用样本中的数据来进行计算的话,那么会出现一个问题,那就是属性的组合太多,有一些属性根本不会出现在我们的样本当中,这个时候不可以进行估计。

 

最大似然函数

  最大似然估计是假定变量满足一定的分布,然后观察到一组x以后,我们取那些能够使得这些x出现概率最大的$\theta$来作为我们的参数。在上式当中,我们假定$p(\mathbf{x}|c)$是满足参数为$\theta$的某种分布。我们需要求参数$\theta$,使得$p(\mathbf{x}|c)$最大。

  具体的做法是这样的,对于每个类,我们假设类c的参数为$\theta_c$,我们要建立下面的似然函数,求能使得似然函数最大的$\theta_c$的值。

  建立关于$\theta_c$的似然函数$L(\theta_c) = \prod \limits_{x \in D_c} p(\mathbf{x}|\theta_c)$

  然后取对数$ln(L(\theta_c)) = \sum \limits_{x \in D_c} ln(p(\mathbf{x}|\theta_c))$

对于不同的分布,是需要求得$\theta_c$使得对数似然函数的值最大。对于每一个分类均要求出一个$\theta$来,然后,当我们求解$p(\mathbf{x}|c)$的时候,只需要用求得的$\theta_c$参数建立的假设分布,带入x就可以求得了。

  最大似然函数求解条件概率(似然)的优点是比较简单,缺点是需要假设一定的分布,

 

朴素贝叶斯估计

  在求解先验概率$p(\mathbf{x}|c)$的时候,我们之所以遇到困难是因为我们所有的x的组合太多,所以贝叶斯估计采用了一个假设:“属性条件独立性假设”。这样,我们的求解就会方便很多。

  采用“属性条件独立性假设”后:$p(\mathbf{x}|c) = \prod \limits_{i=1}^{d} p(x_i|c)$其中$p(x_i|c)$表示的是在x的第i个属性上的取值,其实应该是$p(x_i = 属性值|c)$,但是并不影响。

  这个时候优化函数变为了

  $h_{nb}(\mathbf{x})  = \arg  \max \limits_{c \in Y} p(c) p(\mathbf{x}|c)   =\arg  \max \limits_{c \in Y}  p(c)\prod \limits_{i=1}^{d} p(x_i|c)$

  我们以D代表整个观察到的数据集,$D_c$代表其中类别为c的数据集。$D_{c,x_i}$代表类别为c当中,在第i个属性上取值为$x_i$的数据集。那么上式当中各个变量的求解是这样的:

  $p(c) = \frac {\lvert D_c \rvert}{\lvert D \rvert}$

  $p(x_i|c) = \frac{\lvert D_{c,x_i} \rvert}{\lvert  D_c\rvert}$

  所以,判定某个样本的取值,可以用上面的公式计算,然后求得使数值最大的类。

  当某个属性上没有该类值的时候,我们使用拉普拉斯修正来将这个值修正一下,避免得到0值。

 

sklearn当中的朴素贝叶斯

  朴素贝叶斯方法是一种基于贝叶斯定理和特征条件独立假设的分类方法。这一句话概括了朴素贝叶斯方法的所有内容,我们上面的推导也有体现,运用了贝叶斯方法来求解后验概率分布$p(y|\mathbf{x})$,运用特征条件独立假设来求解似然$p(\mathbf{x}|y)$。

  sklearn当中朴素贝叶斯的目标函数和我们上面的目标函数没有区别,为:$\arg  \max \limits_{y \in Y}  p(y)\prod \limits_{i=1}^{d} p(x_i|y)$。其中$p(y)$可以用数据集上标签的频率来进行估计。 而对于其中$p(x_i|y)$的计算需要假定它的分布模型,假设的分布模型不一样,那么使用的贝叶斯方法也不一样,sklearn中介绍了三种。

1:高斯贝叶斯

  顾名思义,假设$p(x_i|y)$服从高斯分布:$p(x_i|y) = \frac{1}{\sqrt{2 \pi \delta_y^2}} exp(- \frac{(x_i – \mu_y)^2}{2 \delta_y^2})$

其中$\delta_y ,\mu_y$采用最大似然估计来进行求解。

而要想使用高斯贝叶斯,则是这样的: from sklearn.naive_bayes import GaussianNB 

(这一有个问题是这样的:如果假定x的属性不独立,并且假设$p(\mathbf{x}|y)$服从高斯分布,那么这就变成了我们上面介绍的直接用最大似然法来进行求解了,这个时候这种方法也能够求解,但是并不属于朴素贝叶斯方法。 如果假设属性是相互独立的,然后假设$p(x_i|y)$是高斯分布,那么就是贝叶斯方法了。前者求出来的是在y的条件下,整体x的概率,而后者是在y的条件下,每个属性$x_i$的概率。我也不确定上面的描述是否正确?)

  sklearn当中的参数为priors,是输入$p(y)$的先验概率。

2:多项式贝叶斯

  多项式贝叶斯(MultinomialNB)是假定数据符合多项式分布。在每个分类y下面,需要计算n个特征的参数,即$\theta_y = (\theta_{y1},\theta_{y2},...,\theta_{yn})$其中的每个$\theta_{yi}$代表的是在标签y的条件下,特征为$x_i$的概率,即$p(x_i|y)$。

  计算的时候使用相对频率计算,这里采用了平滑处理:

  $\hat {\theta_{yi}} = \frac{N_{yi} + \alpha}{N_{y} + \alpha n}$

  其中$N_{yi}$表示的是类标签为y,并且在属性上为$x_i$的样本个数。 $N_y$表示的是类标签为y的样本的个数。

  这里的$\alpha$为平滑因子。$\alpha = 1$ 拉普拉斯平滑 。$\alpha < 1$叫做Lidstone平滑。

  sklearn当中MultinomialNB的参数为:

  alpha,即上面介绍的$\alpha$平滑参数。

  fit_prior:布尔类型,是否使用类先验概率,如果为false,那么各个类的概率均相等。

  class_prior:类的先验概率,在fit_prior为true的时候起作用。如果不指定,那么根据样本调整,如果指定,那么按照指定的类先验概率来进行计算。

3:伯努利贝叶斯

  伯努利贝叶斯(BernoulliNB)是假设数据分布符合多元伯努利分布。比如有多个特征,每个特征都是两个值。所以数据特征的值要进行二值化。

  伯努利贝叶斯是按照这个公式进行决策的:

  $p(x_i|y) = p(i|y)x_i + (1-p(i|y))(1-x_i)$

  sklearn中BernoulliNB的参数:

  和上面的MultinomialNB相比多了一个binarize参数,这个是二值化的阈值,默认的数据已经进行了二值化。如果指定这个值,会按照这个值进行二值化。

 

 

参考:

  周志华《机器学习》

  Naive Bayes

  scikit-learn 朴素贝叶斯类库概述

推荐阅读