
2.3 统计学习方法介绍
试想,需要从含有两个参数的分类问题开始设计垃圾邮件过滤算法:
表1

数据集中有已收集的200封电子邮件(X)(为简单起见,假设p1和p2互斥),此时需找到几个概率假设(下标用p1和p2表示)以确定:

同时,假设这两项是条件独立的,也就意味着
共同作用于垃圾邮件。
例如,考虑规则(假设):“如果有五个以上黑名单内的词”或“如果消息的长度小于20个字符”,那么“垃圾邮件的概率很高”(例如,概率超过50%)。然而,在不指定概率的情况下,当数据集变化时,很难进行泛化(像在真实世界的反垃圾邮件过滤器中)。此外,还需要确定分区阈值(例如绿色、黄色和红色信号),以帮助用户决定要保留什么以及放弃什么。
由于假设是通过数据集X来确定的,所以用离散形式表示为:

在本例中,每项的值都很容易确定。然而,一般来说,有必要引入贝叶斯公式(将在第6章中详细讨论):

上式中,是正比于而不是等于,这是为了避免引入边缘概率P(X)。实际上,在离散随机变量中,所有可能的概率结果的总和必须等于1,因而边缘概率在计算时仅作为归一化因子发挥作用。
在上面的公式中,第一项称为后验概率(后来的),后验概率由边缘前验概率(预先知道)乘以一个被称为似然的因子决定。要理解这种方法,可以看个简单的例子:抛硬币。每个人都知道硬币每个面的边缘概率等于0.5,但该概率由什么决定呢?虽然好的物理学家会说,它从来不是0.5,之所以等于0.5是因为我们仅仅简单地考虑了几个因素的作用,然而概率为0.5是逻辑和概率公理的理论结果,在抛100次硬币后观察所得到的结果。令人惊讶的是,可以发现得到的结果略有不同,例如结果可能是0.46。根据这个结果,如何修正我们的估计?称为似然的术语衡量了我们的实际实验能够多大程度上证实先验假设,并确定反映实际情况的另一个概率(后验)。因此,似然有助于动态地纠正我们的估计,克服固定概率的问题。
在第6章中将深入讨论朴素贝叶斯算法,并用scikit-learn实现一些例子。但是,有必要在这里先介绍两种常用的统计学习方法。
2.3.1 最大后验概率学习
当选择正确的假设时,贝叶斯方法通常是最佳选择之一,因为它考虑了所有的因素。正如以下将看到的,即使它是基于条件独立的,当因素是部分相关时,这种方法也是有效的。然而,因为必须考虑表达式中的所有项,所以该方法在概率方面的复杂度增长很快。例如,一个真正的硬币是一个非常短的圆柱体,所以在抛掷硬币时,我们也应该考虑硬币均匀的概率。假设P(even)=0.001,这意味着我们有三个可能的结果:P(head)=P(tail)=(1.0-0.001)/2.0和P(even)=0.001。显然,最后一个是很难出现的,但即使它远远小于其他项,在贝叶斯学习中也必须考虑。
另一种方法是根据后验概率找出最可能的假设:

这种方法被称为最大后验概率(MAP,maximum a posteriori)。当一些假设是不太可能的时候,可以用该方法简化假设。例如,在抛掷硬币时,MAP假设将丢弃P(even)。然而,MAP有一个显著的缺点,即取决于先验概率,因为最大化后验意味着也考虑先验。正如Russel和Norvig在Artificial Intelligence:A Modern Approach一书中指出的那样,这通常是推理过程的一个微妙部分,因为总有一个理论背景可以推动某一特定假设,而排除其他假设。为了仅依靠数据得到结论,有必要采用不同的方法。
2.3.2 最大似然学习
将贝叶斯公式中的筛选项定义为似然。一般来说,它的形式是:

公式中,第一项表示在给定数据集X时一个假设存在的实际可能性。在这个公式中,没有先验概率,所以最大化并不意味着接受一个理论上的优先假设,也不考虑不太可能的情况。一种非常常见的方法,称为期望最大化(Expectation Maximization),被很多算法采用,我们也将在后面的逻辑回归中给出一个例子。期望最大化分为两个主要部分:
根据模型参数确定对数似然表达式(相应地进行优化)。
最大化直到剩余误差足够小。
这是著名的同名通用算法(EM)的特例。完整的解释很复杂,超出了本书的范围(可以在Mastering Machine Learning Algorithms中找到),但是,主要概念很容易理解。
对数似然(通常称为L)是一个有用的技巧,可以简化梯度计算。似然表达式一般为:

由于所有参数都在hi内,所以梯度是一个复杂的表达式,不容易计算。然而,我们的目标是最大化似然,而最小化其倒数是非常简单的:

以上函数是单调的,通过应用自然对数可以变成更简单的表达式:

很容易求出上式中的最后一项,并将其应用于大多数优化算法中。最后,可以找到一组提供最大似然,但不需要任何强先验分布的参数。这种方法看起来技术性很强,但其逻辑非常简单直观。为了理解它是如何工作的,此处给出一个简单的练习,也是高斯混合技术的一部分,在Mastering Machine Learning Algorithms,Bonaccorso G.,Packt Publishing,2018中也有讨论。
考虑从零均值和标准偏差等于2.0的高斯分布中得到的100个点,该高斯分布是由独立样本组成的准白噪声:

点的曲线图如图2-6所示。

图2-6 高斯分布样本点
在这个例子中,由于我们知道这些点是如何生成的,因此没有必要进行深入的研究。在将假设空间限制到高斯族函数后,仅考虑图形是最适合的,目标是找到平均值和方差的最佳值。首先,计算对数似然(由于是指数函数,这很简单):

接下来提供一个简单的Python实现(为了易于使用,用一个数组包含均值(0)和方差(1)):

现在,需要用任何可用的方法(梯度下降或其他数值优化算法)来找到它的最小值(就均值和方差而言)。例如,使用scipy最小化函数,可以很容易地得到:

通过绘制negative_log_likelihood函数的图2-7,可以看到该函数的全局最小值对应于给定的分布的最优似然。但这并不意味着问题已经完全解决,因为这个算法的第一步是确定期望值,而这个期望一定是可实现的。由于似然函数对错误分布非常敏感,当概率很低时,似然函数很容易接近于零。因此,最大似然(maximum-likelihood,ML)学习通常比MAP学习更好,但这需要先验分布,并且如果没有以最适当的方式选择先验分布,该方法可能会失效。

图2-7 两个不同起点和最大似然目标的轨迹
这种方法已被应用于特定的分布,即使模型更复杂,该方法的效果也很好。当然,有必要初步了解如何确定可能性,因为多个可行的分布族可能生成相同的数据集。在所有这些情况下,奥卡姆剃须刀定律(Occams Razor)是最好的方法,即首先考虑最简单的假设。如果不适合,可以给模型增加额外的复杂度。正如我们将看到的,在许多情况下,最简单的解决方案是获胜的那一个,而增加参数数量或使用更详细的模型只能增加噪声和过拟合的可能性。
SciPy(https://www.scipy.org)是Python中一套面向数据的高端科学库。它包括NumPy、Pandas和许多其他有用的框架。如果想了解有关Python科学计算的更多信息,请参阅Learning SciPy for Numerical and Scientific Computing。