<audio id="audio" title="09 机器学习 | 大道至简：朴素贝叶斯方法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3b/dd/3bea9432dec1d97e363a2c3e145d1fdd.mp3"></audio>

周二我和你分享了机器学习中的线性回归算法，这一算法解决的是从连续取值的输入映射为连续取值的输出的回归问题。今天我分享的算法则用于解决分类问题，即将连续取值的输入映射为离散取值的输出，算法的名字叫作“**朴素贝叶斯方法**”。

解决分类问题的依据是数据的属性。朴素贝叶斯分类器假定样本的不同属性满足条件独立性假设，并在此基础上应用贝叶斯定理执行分类任务。**其基本思想在于分析待分类样本出现在每个输出类别中的后验概率，并以取得最大后验概率的类别作为分类的输出**。

假设训练数据的属性由n维随机向量$\bf x$表示，其分类结果用随机变量y表示，那么x和y的统计规律就可以用联合概率分布$P(X, Y)$描述，每一个具体的样本$(x_i, y_i)$都可以通过$P(X, Y)$独立同分布地产生。

朴素贝叶斯分类器的出发点就是这个联合概率分布，根据条件概率的性质可以得到

 $$ P(X, Y) = P(Y) \cdot P(X|Y)$$ 

$$= P(X) \cdot P(Y|X) $$ 

在上式中，P(Y)代表着每个类别出现的概率，也就是**类先验概率**；P(X|Y)代表着在给定的类别下不同属性出现的概率，也就是**类似然概率**。

先验概率容易根据训练数据计算出来，只需要统计不同类别样本的数目即可。而似然概率受属性取值数目的影响，其估计较为困难。

如果每个样本包含100个属性，每个属性的取值都可能有100种，那么对分类的每个结果，要计算的条件概率数目就是$100 ^ 2 = 10000$。在这么多参数的情况下，对似然概率的精确估计就需要庞大的数据量。

要解决似然概率难以估计的问题，就需要“条件独立性假设”登台亮相。**条件独立性假设保证了所有属性相互独立，互不影响，每个属性独立地对分类结果发生作用**。**这样类条件概率就变成了属性条件概率的乘积**，在数学公式上可以体现为

 $$ P(X = {\bf x}|Y = c) = $$

$$P(X^{(1)} = x^{(1)}, X^{(2)} = x^{(2)}, \cdots, X^{(n)} = x^{(n)}|Y = c)$$ 

$$= \Pi_{j = 1}^n P(X^{(j)} = x^{(j)}|Y = c) $$

**这正是朴素贝叶斯方法的“朴素”之处，通过必要的假设来简化计算，并回归问题的本质**。

条件独立性假设对似然概率的估计无疑是个天大的好消息。没有这一假设时，每个样本的分类结果y只能刻画其所有属性$x_1, x_2, \cdots, x_n$形成的整体，只有具有相同$x_1, x_2, \cdots, x_n$的样本才能放在一起进行评价。当属性数目较多且数据量较少时，要让n个属性同时取到相同的特征就需要些运气了。

有了条件独立性假设后，分类结果y就相当于实现了n重复用。每一个样本既可以用于刻画$x_1$，又可以用于刻画$x_n$，这无形中将训练样本的数量扩大为原来的n倍，分析属性的每个取值对分类结果的影响时，也有更多数据作为支撑。

但需要说明的是，**属性的条件独立性假设是个相当强的假设**。

一个例子是银行在发放房贷时，需要对贷款申请人的情况进行调研，以确定是否发放贷款。本质上这就是个分类问题，分类的结果是“是”与“否”。分类时则需要考虑申请人的年龄、工作岗位、婚姻状况、收入水平、负债情况等因素。这些因素显然不是相互独立的。中年人的收入通常会高于青年人的收入，已婚者的负债水平通常也会高于未婚者的负债水平。

因而在实际应用中，属性条件独立性假设会导致数据的过度简化，因而会给分类性能带来些许影响。但它带来的数学上的便利却能极大简化分类问题的计算复杂度，性能上的部分折中也就并非不可接受。

有了训练数据集，先验概率P(Y)和似然概率P(X|Y)就可以视为已知条件，用来求解后验概率P(Y|X)。对于给定的输入$\bf x$，朴素贝叶斯分类器利用贝叶斯定理求解后验概率，并将后验概率最大的类作为输出。

由于在所有后验概率的求解中，边界概率P(X)都是相同的，因而其影响可以忽略。将属性条件独立性假设应用于后验概率求解中，就可以得到朴素贝叶斯分类器的数学表达式

$$ y = \arg \mathop {\max}\limits_{c_k} P(y = c_k) \cdot $$

$$\Pi_j P(X^{(j)} = x^{(j)}|Y = c_k) $$

应用朴素贝叶斯分类器处理连续型属性数据时，通常假定属性数据满足正态分布，再根据每个类别下的训练数据计算出正态分布的均值和方差。

**从模型最优化的角度观察，朴素贝叶斯分类器是平均意义上预测能力最优的模型，也就是使期望风险最小化**。期望风险是风险函数的数学期望，度量的是平均意义下模型预测的误差特性，可以视为单次预测误差在联合概率分布P(X, Y)上的数学期望。

朴素贝叶斯分类器通过将实例分配到后验概率最大的类中，也就同时让1 - P(Y|X)取得最小值。在以分类错误的实例数作为误差时，期望风险就等于1 - P(Y|X)。这样一来，后验概率最大化就等效于期望风险最小化。

受训练数据集规模的限制，某些属性的取值在训练集中可能从未与某个类同时出现，这就可能导致属性条件概率为0，此时直接使用朴素贝叶斯分类就会导致错误的结论。

还是以贷款申请为例，如果在训练集中没有样本同时具有“年龄大于60”的属性和“发放贷款”的标签，那么当一个退休人员申请贷款时，即使他是坐拥百亿身家的李嘉诚，朴素贝叶斯分类器也会因为后验概率等于零而将他无情拒绝。

因为训练集样本的不充分导致分类错误，显然不是理想的结果。为了避免属性携带的信息被训练集中未曾出现过的属性值所干扰，在计算属性条件概率时需要添加一个称为“**拉普拉斯平滑**”的步骤。

所谓拉普拉斯平滑就是在计算类先验概率和属性条件概率时，在分子上添加一个较小的修正量，在分母上则添加这个修正量与分类数目的乘积。这就可以保证在满足概率基本性质的条件下，避免了零概率对分类结果的影响。当训练集的数据量较大时，修正量对先验概率的影响也就可以忽略不计了。

事实上，朴素贝叶斯是一种非常高效的方法。当以分类的正确与否作为误差指标时，只要朴素贝叶斯分类器能够把最大的后验概率找到，就意味着它能实现正确的分类。至于找到的最大后验概率的估计值是否精确，反而没那么重要了。

如果一个实例在两个类别上的后验概率分别是0.9和0.1，朴素贝叶斯分类器估计出的后验概率就可能是0.6和0.4。虽然数值的精度相差较大，但大小的相对关系并未改变。依据这个粗糙估计的后验概率进行分类，得到的依然是正确的结果。

上面的说法固然言之成理，却不能解释另外一个疑问。虽然属性条件独立性看起来像是空中楼阁，却给朴素贝叶斯分类器带来了实实在在的优良性能，这其中的奥秘何在？为什么在基础假设几乎永远不成立的情况下，朴素贝叶斯依然能够在绝大部分分类任务中体现出优良性能呢？

一种可能的解释是：在给定的训练数据集上，两个属性之间可能具有相关性，但这种相关性在每个类别上都以同样的程度体现。 这种情况显然违背了条件独立性假设，却不会破坏朴素贝叶斯分类器的最优性。

即使相关性在不同类别上的分布不是均匀的也没关系，只看两个单独的属性，它们之间可能存在强烈的依赖关系，会影响分类的结果。但当所有属性之间的依赖关系一起发挥作用时，它们就可能相互抵消，不再影响分类。

简而言之，决定性的因素是所有属性之间的依赖关系的组合。**影响朴素贝叶斯的分类的是所有属性之间的依赖关系在不同类别上的分布，而不仅仅是依赖关系本身**。可即便如此，属性条件独立性假设依然会影响分类性能。为了放宽这一假设，研究人员又提出了“**半朴素贝叶斯分类器**”的学习方法。

半朴素贝叶斯分类器考虑了部分属性之间的依赖关系，既保留了属性之间较强的相关性，又不需要完全计算复杂的联合概率分布。**常用的方法是建立独依赖关系：假设每个属性除了类别之外，最多只依赖一个其他属性**。由此，根据属性间依赖关系确定方式的不同，便衍生出了多种独依赖分类器。

朴素贝叶斯分类器的应用场景非常广泛。它可以根据关键词执行对一封邮件是否是垃圾邮件的二元分类，也可以用来判断社交网络上的账号到底是活跃用户还是僵尸粉。在信息检索领域，这种分类方法尤为实用。总结起来，**以朴素贝叶斯分类器为代表的贝叶斯分类方法的策略是：根据训练数据计算后验概率，基于后验概率选择最佳决策**。

今天我和你分享了机器学习基本算法之一的朴素贝叶斯方法的基本原理，其要点如下：

- 朴素贝叶斯方法利用后验概率选择最佳分类，后验概率可以通过贝叶斯定理求解；
- 朴素贝叶斯方法假定所有属性相互独立，基于这一假设将类条件概率转化为属性条件概率的乘积；
- 朴素贝叶斯方法可以使期望风险最小化；
- 影响朴素贝叶斯分类的是所有属性之间的依赖关系在不同类别上的分布。

在使用高维数据集时，每个样本都会包含大量的属性，这时属性条件概率连乘的结果会非常接近于零，导致下溢的发生。如何防止因概率过小造成的下溢呢？

欢迎发表你的观点。

<img src="https://static001.geekbang.org/resource/image/1d/ab/1d23a0935e1e853e21a0d6a0dab9e4ab.jpg" alt="">


