朴素贝叶斯分类算法


现有的分类算法很多,主要分为两种,一是单一分类器,包括决策树、贝叶斯、人工神经网络、支持向量机等;二是集成学习算法,如Bagging和Boosting等。贝叶斯(Bayes)分类算法是一类利用概率统计知识进行分类的算法,如朴素贝叶斯(Naive Bayes)算法。这些算法主要利用Bayes定理来预测一个未知类别的样本属于各个类别的可能性,选择其中可能性最大的一个类别作为该样本的最终类别。为了计算简单,朴素贝叶斯算法假设条件概率相互独立。

设样本的类别有\(K\)种,记\(Y={c_1,c_2,...,c_N}\),则基于后验概率\(P(c_i|x)\)可获得将样本\(x\)分类成为\(c_i\)所产生的期望损失(条件风险)为,
\[R(c_i|x)=\sum_{j=1}^K \lambda_{ij} P(c_i|x)\]
其中,\(\lambda_{ij}\)是将一个真实标记为\(c_j\)标记为\(c_i\)产生的损失。因为我们目标是最小化分类错误率,此时\(\lambda_{ij}\)为0/1损失函数,即分类正确时\(\lambda_{ij}=1\),否则为\(0\)。所以,此时条件风险为
\[R(c|x)= 1 - P(c|x)\]

为了最小化风险,只需要在每个样本上选择能使条件风险\(R(c|x)\)最小的类别标记,即使得\(P(c|x)\)取最大值的类别标记,即
\[h^*(x) = \arg \min_{c \in Y}R(c|x) = \arg \max_{c \in Y}P(c|x)\]
其中,\(\arg \min f(c)\)表示当\(f(c)\)取最小值时,\(c\)的取值,\(\arg \max f(c)\)同理。通常情况下,概率\(P(c|x)\)很难直接观测,利用Bayes定理对\(h^*(x)\)进行化简,
\[h^*(x) = \arg \max_{c \in Y} \frac{P(x|c)P(c)}{P(x)} = \arg \max_{c \in Y} P(x|c)P(c)\]
其中,\(P(c)\)为先验概率,\(P(x|c)\)为样本\(x\)被划分成类别\(c\)的概率。所以,当前求解最小化错误率问题转化成了求解先验概率\(P(c)\)和条件概率\(P(x|c)\)问题。

求解先验概率\(P(c)\)


我们用最大似然方法估计先验概率\(P(c)\)。令\(P(Z=c_k)=\theta_k\),其中\(c_k \in Y\)。则似然函数(\(P(c)\)的概率联合密度函数)可以表示为
\[ L(\theta; z_1, z_2, ..., z_N)= \prod_{i=1}^N P(z_i) = \prod_{k=1}^{K} {\theta_k}^{N^k}\]

其中,\(N\)为训练集样本个数,\(N_k\)是类别为\(k\)的样本数量。对上式取对数,可得
\[l(\theta)=\ln(L(\theta)) = \sum_{i=1}^K N_k \ln \theta_k\]

求\(L(\theta)\)最大值转化为在\(\sum_{i=1}^K \theta_k =1\)的条件下,求解\(l(\theta)\)的最大值。构造拉格朗日乘子函数,
\[F(\theta, \lambda)=\sum_{i=1}^K N_k \ln \theta_k + \lambda (\sum_{i=1}^K \theta_k - 1)\]

分别令\(\theta\)和\(\lambda\)偏导为0,可解得\(\theta_k=\frac{N_k}{N}\)。所以,可以得到先验概率,
\[P(c_k)=\frac{N_k}{N}\]

求解条件概率\(P(x|c)\)


属性取值离散

使用贝叶斯公式来估计后验概率最大的困难是难以从现有训练样本中准确的估计出条件概率\(P(x|c)\)。 所以,朴素贝叶斯算法基于条件概率相互独立假设,即有
\[P(x|c)= \prod_{i=1}^{d} P(x_i|c)\]
其中,\(d\)表示特征向量长度,\(x_i\)特征向量第\(i\)个分量。
当属性取值离散时,与求解先验概率类似,条件概率可以根据\(c_k\)类别中属性等\(x_i\)的训练实例的比例来估计,即
\[P(x_i|c_k)=\frac{N_{ki}}{N_k}\]
其中,\(N_{ki}\)为在类别为\(c_k\)的条件下样本第\(i\)个分量取值为\(x_i\)的数量。

属性取值连续

当属性是连续取值时,有两种方法来估计属性的条件概率。

  • 第一种方法是把每一个连续的属性离散化,即用相应的离散区间替换连续属性值。这种方法不好控制离散区间划分的粒度,如果粒度太细,就会因为每个区间中的训练记录太少而不能对条件概率\(P(x|c)\)做出可靠的估计。如果粒度太粗,那么有些区间就会含有来自不同类的纪录,因此失去了正确的决策边界。
  • 第二种方法是,可以假设连续变量服从 某种概率分布,然后使用训练数据估计分布的参数,通常用高斯分布来表示条件概率分布。对每个类别\(c_k\),属性\(x_i\)条件概率为
    \[P(x_i|c_k)=\frac{1}{\sqrt{2\pi}\sigma_{ik}}\exp {-\frac{(x_i-\mu_{ik})^2}{2\sigma_{ik}^2}}\]
    参数\(\mu_{ik}\)和\(\sigma_{ik}\)可以用类\(c_k\)的所有训练样本关于\(x_i\)的样本均值和方差来估计。