朴素贝叶斯专题

朴素贝叶斯算法

“朴素”的含义

朴素贝叶斯模型(Naive Bayesian Model)朴素的含义:建立在两个前提假设上:

  1. 特征之间相互独立
  2. 每个特征同等重要

然而这种属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果原因在于:

(1)对于分类任务来说,只要各类别的条件概率排序正确、无需精准概率值即可导致正确分类;

(2)如果属性间依赖对所有类别影响相同,或依赖关系的影响能够相互抵消,则属性条件独立性假设在降低计算开销的同时不会对性能产生负面影响

工作原理

  1. 假设现在有样本$x = (a_1,a_2,a_3,…a_n)$这个待分类项(并认为x里面是特征独立的)
  2. 再假设现在有分类目标$Y = {y_1,y_2,y_3,..y_n}$
  3. 那么$\max(P(y_1|x),P(y_2|x),P(y_3|x)…,P(y_n|x))$就是最终的分类类别
  4. $P(y_i|x) = \frac{P(x|y_i)*P(y_i)}{P(x)}$
  5. 因为x对于每个分类目标来说都一样,所以就是求$\max(P(x|y_i)*P(y_i))$
  6. $P(x|y_i)*p(y_i)= p(y_i)*\prod{P(a_i|y_i)}$
  7. 而具体的$P(a_i|y_i)$和$P(y_i)$都是能从训练样本中统计出来

$P(a_i|y_i)$表示该类别下该特征出现的频率,$P(y_i)$表示全部类别中这个类别出现的概率。

工作流程

  1. 准备阶段

    确定特征属性,并对每个特征属性适当划分,然后由人工对一部分待分类项进行分类,形成训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

  2. 训练阶段

    计算每个类别在训练样本中的出现频率以及每个特征属性划分对每个类别的条件概率估计

  3. 应用阶段

    使用分类器进行分类,输入是分类器和待分类样本,输出是样本属于的分类类别

朴素贝叶斯的应用场景

  1. 文本分类/垃圾文本过滤/情感判别
  2. 多分类实时预测
  3. 推荐系统

朴素贝叶斯和协同过滤是一对好搭档,协同过滤是强相关性,但泛化能力略弱,朴素贝叶斯和协同过滤一起,能增强推荐的覆盖度和效果。

贝叶斯决策理论

将分类看做决策,进行贝叶斯决策时考虑各类的先验概率和类条件概率,即后验概率。考虑先验概率意味着对样本总体的认识,考虑类条件概率是对每一类中某个特征出现频率的认识。由此不难发现,贝叶斯决策的理论依据就是贝叶斯公式。

  1. 最小错误率贝叶斯决策
    贝叶斯决策的基本理论依据就是贝叶斯公式,判决遵从最大后验概率。这种仅根据后验概率作决策的方式称为最小错误率贝叶斯决策,可以从理论上证明这种决策的平均错误率是最低的。
  2. 最小风险贝叶斯决策
    另一种方式是考虑决策风险,加入了损失函数,称为最小风险贝叶斯决策。

朴素贝叶斯三种常用的分类模型

朴素贝叶斯的三个常用模型:高斯、多项式、伯努利。

  1. 高斯模型主要处理包含连续型变量的数据,使用高斯分布概率密度来计算类的条件概率密度;

  2. 多项式模型:

    其中$\alpha$是拉普拉斯平滑,加和的是属性出现的总次数,也防止了零概率问题。在文本分类问题中,反映一个词出现的词频,类似投骰子问题n次出现m次这个点数的场景。

  3. 伯努利模型:

    伯努利模型特征的取值为布尔型,即出现为true,没有出现为false,在文本分类中,就是一个单词有没有在一个文档中出现。

朴素贝叶斯细节问题

零概率问题

描述:在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果为0。

解决方案:通常解决这个问题的方法是要进行平滑处理,常用拉普拉斯修正。

拉普拉斯修正的含义是,在训练集中总共的分类数,用 N 表示;di 属性可能的取值数用 $N_i$ 表示,因此,

原来的先验概率$P(c)$的计算公式由:$P(c) = \frac{D_c}{D}$

被拉普拉斯修正为:$P(c) = \frac{D_c+1}{D+N}$

类的条件概率$P(x|c)$的计算公式由:$P(xi|c) = \frac{D{c,st}}{D_c}$

被拉普拉斯修正为:$P(xi|c) = \frac{D{c,st}+1}{D_c+N_i}$

使用拉普拉斯平滑,拉普拉斯因子的大小如何确定?

朴素贝叶斯中的拉普拉斯因子$\alpha$无法通过公式求出最优大小,需要根据程序员的经验去设置,使用交叉验证的方式求取最优大小。

下溢问题

问题描述:在计算过程中,需要对特定分类中各个特征出现的概率进行连乘,小数相乘,越乘越小,造成下溢出,计算结果变成0。

解决方案:通过log运算增大概率的绝对值。log运算不会影响函数的趋势和极值只是扩大值得范围。将小数的乘法操作转化为取对数后的加法操作,规避了变为零的风险同时并不影响分类结果。

异常值敏感问题

朴素贝叶斯是一种对异常值不敏感的分类器,保留数据中的异常值,常常可以保持贝叶斯算法的整体精度,如果对原始数据进行降噪训练,分类器可能会因为失去部分异常值的信息而导致泛化能力下降。

异常值不敏感原因:可能是因为朴素贝叶斯分类器是一个概率模型,如果输入是一个正常的样本,则异常值并不会影响到正常样本的后验概率。因为对于正常样本而言$p(x|y_i)*p(y_i)=p(y_i)\prod_j{p(x_j|y_i)}$,其中$x_j$是正常的,并不会使用到异常值。如果是一个异常的$p(x_j|y_i)$,反而已有的异常值可以帮助到该异常样本更好的分类。

异常值有影响的情况:如果是对于连续型属性的异常值则会产生对分类器产生一定的影响,因贝叶斯对连续值的处理往往是通过估计其概率分布的参数,若有异常值存在则其概率分布将会产生偏移。若是分类变量则之间统计出现次数是不会产生偏移的。

缺失值敏感问题

不敏感

原因:朴素贝叶斯算法能够处理缺失的数据,在算法的建模时和预测时数据的属性都是单独处理的。因此如果一个数据实例缺失了一个属性的数值,在建模时将被忽略,不影响类条件概率的计算,在预测时,计算数据实例是否属于某类的概率时也将忽略缺失属性,不影响最终结果。

数据的属性是连续型变量的情况

当朴素贝叶斯算法数据的属性为连续型变量时,有两种方法可以计算属性的类条件概率。

第一种方法是把一个连续的属性离散化,然后用相应的离散区间替换连续属性值,之后用频率去表示类条件概率。但这种方法不好控制离散区间划分的粒度。如果粒度太细,就会因为每个区间内训练记录太少而不能对做出可靠估计,如果粒度太粗,那么有些区间就会有来自不同类的记录,因此失去了正确的决策边界。

第二种方法是假设连续变量服从某种概率分布,然后使用训练数据估计分布的参数,例如可以使用高斯分布来表示连续属性的类条件概率分布。

其中$\mu{i,j}$为类$y_j$的所有训练记录关于$X_i$的样本均值估计,$\sigma{i,j}^2$为类$y_i$的所有训练记录关于$X_i$的样本方差估计。通过高斯分布估计出类条件概率。

高度相关的特征对朴素贝叶斯的影响

假设有两个特征高度相关,相当于该特征在模型中发挥了两次作用(计算两次条件概率),使得朴素贝叶斯获得的结果向该特征所希望的方向进行了偏移,影响了最终结果的准确性,所以朴素贝叶斯算法应先处理特征,把相关特征去掉。

朴素贝叶斯的增量计算

传统的贝叶斯方法在有新的训练样本加入时,需要重新学习已经学习过的样本,耗费大量时间。增量计算就是在原有分类器的基础之上,自主选择学习新的文本来修正分类器。因为朴素贝叶斯在训练过程中实际只需要计算出各个类别的概率(先验)和各个特征的类条件概率,这些概率值可以快速的根据增量数据进行更新,无需重新全量训练,所以其十分适合增量计算,该特性可以使用在超出内存的大量数据计算和随时间等(流数据)获取数据的计算中。

朴素贝叶斯总结

朴素贝叶斯是高偏差低方差

在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为Error = Bias+Variance。这里的Error大概可以理解为模型的预测错误率,是有两部分组成的,一部分是由于模型太简单而带来的估计不准确的部分(Bias),另一部分是由于模型太复杂而带来的更大的变化空间和不确定性(Variance)。

Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望(平均值)之间的误差,即模型的稳定性,数据是否集中。

对于朴素贝叶斯,它简单的假设了各个数据之间是无关的,是一个被严重简化了的模型,对于复杂模型,充分拟合了部分数据,使得他们的偏差较小,而由于对部分数据的过度拟合,对于部分数据预测效果不好,整体来看可能引起方差较大,简单模型与之相反,大部分场合偏差部分大于方差部分,也就是高偏差低方差。

在实际中,为了让Error尽量小,我们在选择模型的时候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。

朴素贝叶斯的优缺点

优点:

  1. 对数据的训练快,分类也快
  2. 对缺失数据不太敏感,对异常值也不太敏感,算法也比较简单
  3. 对小规模的数据表现很好,能够处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练

缺点:

  1. 由于朴素贝叶斯的“朴素”特点,所以会带来一些准确率上的损失。
  2. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  3. 对输入数据的表达形式很敏感。(离散的类别之间统计频率即可,连续值就要估计概率分布。)

参考资料