朴素贝叶斯算法详解

朴素贝叶斯[高斯、多项式、伯努利]是生成模型。可以把判别模型理解为应试教育的学生,因为更关心考试成绩(分类边界),所以考试(效果)很强;把生成模型理解为经常玩字母匹配板的儿童(先验概率),拿到一个字母跟字母板上的凹槽做对比(联合概率分布),选择一个最合适的凹槽镶嵌进去(联合概率分布最大)。

模型对比 生成模型 判别模型
根本 学习得到联合概率分布P(x,y) 学习得到条件概率分布P(y|x)
主要区别 p(class, context)=p(class|context)*p(context) p(class|context)
数据要求 生成模型需要的数据量比较大,能够较好地估计概率密度 判别模型对数据样本量的要求没有那么严格
常见模型 朴素贝叶斯、混合高斯模型、隐马尔可夫模型、LDA(Latent Dirichlet Allocation)等 感知机、KNN、DT、SVM、LR、CRF、CNN等
优点 1、实际上带的信息要比判别模型丰富;2、研究单类问题比判别模型灵活性强;3、模型可以通过增量学习得到;4、能用于数据不完整(missing data)情况;5、很容易将先验知识考虑进去 1、分类边界更灵活,比使用纯概率方法或生产模型得到的更高级 2、能清晰的分辨出多类或某一类与其他类之间的差异特征3、在聚类、视角变化、部分遮挡、尺度改变等方面效果较好4、适用于较多类别的识别5、判别模型的性能比生成模型要简单,比较容易学习。
缺点 1、容易会产生错误分类;2、学习和计算过程比较复杂 1、不能反映训练数据本身的特性,即能力有限,可以告诉你的是1还是2,但没有办法把整个场景描述出来;2、缺少生成模型的优点,即先验结构的不确定性;3、黑盒操作,即变量间的关系不清楚,不可视。

定义

朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立不考虑特征权重)的方法,先通过已给定的训练集,以特征向量之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入$X$求出使得后验概率最大的输出$Y$

$Y$的先验概率分布$P_{prior}=P(Y)$

通过已有标注数据可获取 $P(X)$ ; 条件概率$P(X|Y)$在$Y$发生的清空下$X$发生的概率

$Y$的后验概率$P(Y|X)=\frac{P(Y)P(X|Y)}{P(X)}$ ;贝叶斯认为后验概率最大即为分类结果

朴素的解释

条件概率分布是一个具有指数级数量参数的分布!

$P(X=x|Y=y_{k}) = P(X^{1}=x^{1},···,X^{n}=x^{n}|Y=y_{k})$ 其中$y_{k}$的个数为$Y$的类别

对条件概率分布$P(X=x|Y=y_{k})$ 来讲,假设$x^{j}$的取值有$S_{j}$个,$j=1,2,···,n$, $Y$的取值有$K$个,那么分布的参数为$K\displaystyle\prod_{j=1}^{n}{S_{j}}$

当我们做出假设特征条件之间相互独立时,

$P(X=x|Y=y_{k}) = P(X^{1}=x^{1},···,X^{n}=x^{n}|Y=y_{k}) = \displaystyle\prod_{j=1}^{n}{P(X^{j}=x^{j}|Y=y_k)}$

即当$x^{1}$与$x^{2}$之间相互独立时有$P(X=x^1,X=x^2|Y=y_k) = P(x=x^1|Y=y_k)*P(X=x^2|Y=y_k)$

成功的将参数由积降为和,但同时由于该假设过强在实际应用中往往是不成立的!所以在属性个数比较多或者属性之间相关性较大时,分类效果不好。

算法优缺

优点:

1、对小规模的数据表现很好,适合多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练;

2、对缺失数据不太敏感,算法也比较简单,常用于文本分类;

3、发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率,当数据呈现不同的特点时,分类性能不会有太大的差异,健壮性好;

4、当数据集属性之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果。

缺点:

1、对输入数据的表达形式很敏感(离散、连续,值极大极小之类的);

2、需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳;

3、由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率;

4、理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进

应用场景

数据敏感度

1、朴素贝叶斯对异常值不敏感

贝叶斯在计算的时候使用的是特征概率分布,单个异常值不会影响概率分布

2、朴素贝叶斯对缺失值不敏感

贝叶斯算法能够处理缺失的数据,在算法的建模时和预测时数据的属性都是单独处理的。因此如果一个数据实例缺失了一个属性的数值,在建模时将被忽略

应用场景

  • 文本分类/垃圾文本过滤/情感判别

这大概是朴素贝叶斯应用最多的地方了,即使在现在这种分类器层出不穷的年代,在文本分类场景中,朴素贝叶斯依旧坚挺地占据着一席之地。因为多分类很简单,同时在文本数据中,分布独立这个假设基本是成立的。而垃圾文本过滤(比如垃圾邮件识别)和情感分析(微博上的褒贬情绪)用朴素贝叶斯也通常能取得很好的效果。

  • 多分类实时预测

对于文本相关的多分类实时预测,它因为上面提到的优点,被广泛应用,简单又高效。

  • 推荐系统

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

面试常见问题

1、朴素贝叶斯算法的前提假设是什么?

  • 特征之间相互独立
  • 每个特征同等重要

2、为什么属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果?

  • 对于分类任务来说,只要各类别的条件概率排序正确、无需精准概率值即可导致正确分类;
  • 如果属性间依赖对所有类别影响相同,或依赖关系的影响能相互抵消,则属性条件独立性假设在降低计算开销的同时不会对性能产生负面影响。

3、什么是朴素贝叶斯中的零概率问题?如何解决?

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

解决办法:若$P(x)$为零则无法计算。为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑

$P(y) = \frac{|D_y|+1}{|D|+N}$ 其中$|D_y|$是数据集$D$中结果为$y$的个数的绝对值,$N$为训练集$D$中的类别数

$P(x^i|y) = \frac{|D_{y,x^i}|+1}{|D_y|+N_i}$ 其中$N_i$为第$i$个属性可能的取值数

4、朴素贝叶斯中概率计算的下溢问题如何解决?

下溢问题:在朴素贝叶斯的计算过程中,需要对特定分类中各个特征出现的概率进行连乘,小数相乘,越乘越小,这样就造成了下溢出。 为了解决这个问题,对乘积结果取自然对数。通过求对数可以避免下溢出或者浮点数舍入导致的错误。 $\prod_{i=x}^{n} p\left(x_{i} | y_{j}\right)$ 解决办法:对其取对数: $\log \prod_{i=1}^{n} p\left(x_{i} | y_{j}\right)$

$=\sum_{i=1}^{n} \log p\left(x_{i} | y_{j}\right)$

将小数的乘法操作转化为取对数后的加法操作,规避了变为零的风险同时并不影响分类结果。

5、当数据的属性是连续型变量时,朴素贝叶斯算法如何处理?

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

  • 第一种方法:把一个连续的属性离散化,然后用相应的离散区间替换连续属性值。但这种方法不好控制离散区间划分的粒度。如果粒度太细,就会因为每个区间内训练记录太少而不能对$P(X|Y)$

做出可靠的估计,如果粒度太粗,那么有些区间就会有来自不同类的记录,因此失去了正确的决策边界。

  • 第二种方法:假设连续变量服从某种概率分布,然后使用训练数据估计分布的参数,例如可以使用高斯分布来表示连续属性的类条件概率分布。
  • 高斯分布有两个参数,均值$\mu$和方差$\sigma 2$,对于每个类$y_i$,属性$X_i$的类条件概率等于:

$$P\left(X_{i}=x_{i} | Y=y_{j}\right)=\frac{1}{\sqrt{2 \Pi} \sigma_{i j}^{2}} e^{\frac{\left(x_{i}-\mu_{j}\right)^{2}}{2 \sigma_{i}^{2}}}$$

$\mu_{i j}$:类$y_j$的所有训练记录关于$X_i$的样本均值估计

$\sigma_{i j}^{2}$:类$y_j$的所有训练记录关于$X$的样本方差

通过高斯分布估计出类条件概率。

6、朴素贝叶斯有哪几种常用的分类模型?

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

  • 高斯模型:

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

  • 多项式模型:

    其中$\alpha$为拉普拉斯平滑,加和的是属性出现的总次数,比如文本分类问题里面,不光看词语是否在文本中出现,也得看出现的次数。如果总词数为$n$,出现词数为$m$的话,说起来有点像掷骰子$n$次出现$m$次这个词的场景。

$P\left(x_{i} | y_{k}\right)=\frac{N_{y k_{1}}+\alpha}{N_{y_{k}}+\alpha n}$

  • 伯努利模型:

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

    • 伯努利模型适用于离散特征情况,它将重复的词语都视为只出现一次。

$P( ‘代开’, ‘发票’, ‘发票’, ‘我’ | S) = P(‘代开’ | S) P( ‘发票’ | S) P(‘我’ | S)$ 我们看到,”发票“出现了两次,但是我们只将其算作一次。我们看到,”发票“出现了两次,但是我们只将其算作一次。

7、为什么说朴素贝叶斯是高偏差低方差?

在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为$Error=Bias +Variance$。

  • $Error$反映的是整个模型的准确度,
  • $Bias$反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,
  • $Variance$反映的是模型每一次输出结果与模型输出期望(平均值)之间的误差,即模型的稳定性,数据是否集中。
  • 对于复杂模型,充分拟合了部分数据,使得他们的偏差较小,而由于对部分数据的过度拟合,对于部分数据预测效果不好,整体来看可能引起方差较大。
  • 对于朴素贝叶斯了。它简单的假设了各个数据之间是无关的,是一个被严重简化了的模型,简单模型与复杂模型相反,大部分场合偏差部分大于方差部分,也就是说高偏差而低方差。

8、高度相关的特征对朴素贝叶斯有什么影响?

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

9、朴素贝叶斯与 LR 区别?

  • 朴素贝叶斯是生成模型**,根据已有样本进行贝叶斯估计学习出先验概率 $P(Y)$ 和条件概率 $P(X|Y)$,进而求出联合分布概率 $P(X,Y)$,最后利用贝叶斯定理求解$P(Y|X)$, 而LR是判别模型,根据极大化对数似然函数直接求出条件概率 $P(Y|X)$
  • 朴素贝叶斯是基于很强的条件独立假设(在已知分类Y的条件下,各个特征变量取值是相互独立的),而 LR 则对此没有要求
  • 朴素贝叶斯适用于数据集少的情景,而LR适用于大规模数据集。

参考:

朴素贝叶斯面试