生成式学习算法是对新样本计算其属于不同类别的概率,然后选择概率最大的作为其最终分类。这是一种软分类,而且关注数据分布,相对于逻辑回归来说是一种表达力更强的算法
高斯判别分析(GDA)
机器学习算法分为了两大类,一类是我们之前学过的判别式学习算法,另一类是这一章重点讲的生成式学习算法,而高斯判别分析就是最经典、最简单的生成学习算法之一。判别式算法,比如逻辑回归,它的目标是直接学习 “输入特征 x ,判断属于哪一类 y”,也就是直接学习分类边界,它不关心每一类数据长什么样子,只关心怎么把两类分开。
判别式算法不关心数据是怎么生成的,它只关心如何把数据区分开,也就是根据训练集数据直接画出一条分界线,使得不同类别训练样本能够完全区分开。从数学角度看,它是在直接建模条件概率 P(y|x) (在已知特征x的情况下,属于类别y的概率)。
绝大多数模型都是判别式模型
而生成学习算法完全不一样,它不直接学分界线,而是先分别学习每一类自己的数据分布,比如先专门学习 “类别 0 的数据通常长什么样、集中在哪里、怎么散开”,再专门学习 “类别 1 的数据通常长什么样、集中在哪里、怎么散开”,学会这两个分布之后,遇到一个新样本,就把它和两个分布比对,看它更符合哪一类的样子,就判断它属于哪一类。这就是生成式算法的核心思想。
生成式学习算法就是先建模P(x|y),即学习不同类别y的特征分布x,然后新样本进入后,看它是更像类别0的特征分布还是更像特征1的特征分布。
接下来正式进入高斯判别分析模型,它是生成学习算法中最基础、最常用的一个,专门用来处理特征是连续数值的分类问题。GDA 做了一个非常明确的假设:每一类别y的特征数据,都服从多元正态分布,也就是我们常说的高斯分布。其实它就是我们高中所学的正态分布从一维扩展到多维的版本,一维正态分布由均值和方差决定,而多维正态分布由均值向量和协方差矩阵决定,均值决定了分布的中心位置,协方差矩阵决定了分布的形状,是圆的、扁的、朝哪个方向倾斜的,协方差越大,数据就越分散,协方差越小,数据就越集中,不同的协方差值还会让分布呈现出不同方向的椭圆形状,只要确定了均值和协方差,整个分布的样子就完全确定了。
多元正态分布:是所有特征合在一起,整体呈现一个 “椭圆球状” 的联合分布,中心最密集,越往外越疏,整体对称,形状是一个标准椭圆,没有凹凸、没有棱角、没有扭曲、没有分叉,特征之间是纯粹的线性关系,这个线性关系可以通过协方差矩阵表示;而不仅仅是每个特征单独是个正态分布。确实,每个特征本身是正态分布,但不仅仅是正态分布,特征之间还有线性关系。
协方差矩阵:
对于两个特征 x_1(身高)和 x_2(体重),协方差矩阵 \Sigma 是一个 2 \times 2 的对称矩阵:
\Sigma = \begin{bmatrix} \text{Var}(x_1) & \text{Cov}(x_1, x_2) \ \text{Cov}(x_2, x_1) & \text{Var}(x_2) \end{bmatrix}
对角线是各个特征自己的方差(Var,反映数据的散开程度),非对角线是特征之间的协方差(Cov,反映两个特征的相关性)。
\Sigma = \begin{bmatrix} 25 & 15 \ 15 & 9 \end{bmatrix}
身高的方差是 25,体重的方差是 9
协方差是 15 > 0,说明身高和体重是正相关的。如果这个值是 0,说明两者完全无关。如果这个值是负数,说明两者负相关。
这四个数字也叫协方差矩阵的参数,体现了两类信息:①特征的分散程度(方差);②特征之间的相关性(非对角线)
所以协方差矩阵有点像相关性热图,对角线上是1,其他地方是相关系数;只不过这里对角线换成了方差,其他地方不是相关系数但也表示相关性。
在高斯判别分析模型中,还有一个非常关键的设定,那就是假设两个类别共享同一个协方差矩阵(因为两个类别的数据所包含的特征是完全一样的,所以特征的方差和特征间的相关性理应相同,比如肾素和钠离子,无论在用药过量群体中还是不足的群体中二者的关系应当是一样的),也就是说,大象和小狗这两个类别的数据分布,中心位置不一样,但是散开的形状、倾斜角度、密集程度是完全一样的,这个设定非常重要,它让模型变得简单,而且最终形成的分类边界是一条直线,也就是线性分类器。模型训练的过程,本质上就是用最大似然估计,从训练数据里算出三个部分的参数:第一个是每个类别的先验概率,也就是训练数据中类别 0 和类别 1 各自占多少比例;第二个是类别 0 的均值向量,代表这个类别所有数据的中心;第三个是类别 1 的均值向量;第四个就是两个类别共享的协方差矩阵,描述数据的整体散开形状。
这里最大似然估计计算的参数就是两个类别数据的高斯分布的参数(均值向量、协方差矩阵),改变参数使模型与当前数据的形状相似。
当这些参数都计算出来之后,GDA 就拥有了两个明确的高斯分布,一个代表类别 0,一个代表类别 1。预测新样本时,模型会用贝叶斯规则,分别计算这个新样本属于每一类的概率,哪个概率大,就预测为哪一类。由于两个高斯分布共享协方差矩阵,它们的分界线恰好是一条直线,这一点和逻辑回归看起来非常像,那么我们进一步深入讨论 GDA 和逻辑回归的关系。这里有一个重要结论:如果数据确实服从高斯分布,并且共享协方差,那么由 GDA 推导出的后验概率,形式上完全等同于逻辑回归的模型形式,也就是说,GDA 是逻辑回归的一个特例。但是反过来不成立,逻辑回归成立,并不代表数据一定是高斯分布,这就意味着 GDA 对数据做出了更强、更具体的假设,而逻辑回归的假设更弱、但是更通用。
意思是,当数据确实服从高斯分布,并且共享协方差,则GDA得到的分类器和逻辑回归得到的分类器是同一个分类器,也就是说画出来的分界线一模一样,这俩就变成了同一个模型
先验概率:已知数据中各类别的比例,比如0类占30%,1类占70%
后验概率:在看到样本 x 之后,判断它 “属于某一类” 的概率
基于这个关系,讲义给出了非常实用的选择建议:如果训练数据确实符合或接近高斯分布,那么 GDA 的效果会比逻辑回归更好,尤其是在数据量比较小的时候,GDA 能够更高效地利用数据,因为它利用了更多的数据结构信息;但如果数据并不服从高斯分布,那么 GDA 的强假设就会成为缺点,模型会不准确,而逻辑回归因为假设更弱,不要求特定分布,适应性更强、更稳健,在数据量大、分布不确定的情况下,表现通常比 GDA 更稳定可靠。这就是为什么在实际应用中,逻辑回归更常见,而 GDA 更多用于数据分布已知(高斯分布)、特征较少、需要解释性强的场景。
在高斯判别分析中,我们的目标是为每一个类别学习一个概率分布,当一个新样本进来后,利用贝叶斯规则计算后验概率,即其属于每个类别的概率( P(y|x) = \frac{P(x|y)P(y)}{P(x)} ),选择概率最大的类别作为其预测类别。其在数据确实服从高斯分布并且共享协方差时等于逻辑回归,但其参数仍然是高斯分布的参数 ,而非逻辑回归的参数
朴素贝叶斯
朴素贝叶斯法是一种在处理特征值为离散型数据时非常有效的学习算法,它经常被应用于垃圾邮件过滤等文本分类问题。在构建这种分类器时,我们首先要将每一封邮件转化为一个特征向量,这个向量的长度取决于我们词汇表的大小。如果某个单词出现在邮件中,向量中对应的位置就标记为一,否则标记为零。为了提高效率,词汇表通常不需要包含整部词典,而是通过遍历训练集,提取出现次数超过一次的单词来构成,同时还会剔除像定冠词或介词这类在判断邮件属性上没有实际意义的停用词。
朴素贝叶斯法提出了一个极强的假设,即在给定邮件类别的条件下,各个单词是否出现是相互独立的。这意味着,如果我们已知一封邮件是垃圾邮件,那么邮件中出现某个特定单词这一事实,并不会改变我们对另一个单词出现概率的判断。
基于这个条件独立性假设,我们可以将原本复杂的联合概率简化为各个独立特征概率的乘积。在实际计算中,我们通过观察训练集来估计每个单词在垃圾邮件和正常邮件中出现的频率,从而得到模型的参数。当需要对一封新邮件进行分类时,我们只需根据已有的参数计算该邮件属于各类别的后验概率,并选择概率最高的那一个作为预测结果。此外,这种方法不仅适用于二值化的特征,也可以通过多项式分布来处理具有多个离散值的特征;对于房屋面积等连续值,我们也可以通过将其划分为不同的区间来实现离散化处理,这在输入值不符合多元正态分布时往往比高斯判别分析表现得更好。
然而,朴素贝叶斯算法在实际应用中会遇到一个尴尬的问题,即如果某个单词在训练集中从未出现过,那么模型就会认为该单词出现的概率为零。由于算法需要进行连乘运算,一旦其中一个概率项为零,整个类别的后验概率就会变成零,导致模型无法做出合理的预测。为了修正这种因为样本有限而导致的概率估计偏差,我们引入了拉普拉斯光滑技术。这种技术通过在计算概率的分子上加一个小的常数,同时在分母上进行相应的调整,确保了即使是未见过的单词也能分配到一个微小但非零的概率。这不仅保证了所有概率之和依然为一,更避免了算法崩溃,使得分类器在面对新词汇时更加稳健和智能。
假设我们有一封邮件 x,它由一组单词特征组成:x = (x_1, x_2, \dots, x_n)
判断垃圾邮件的最终算式:
P(y=1|x_1, \dots, x_n) = \frac{P(y=1) \prod_{i=1}^{n} P(x_i|y=1)}{P(x)}
其中:
P(x_i|y=1)是单词i 在垃圾邮件中出现的频率;
\prod_{i=1}^{n} P(x_i|y=1)把邮件里每一个单词在垃圾邮件中出现的“频率”全部乘起来
P(y=1)是先验概率,在你的邮箱里,平均每 100 封邮件有多少封是垃圾邮件,也就是垃圾邮件出现的频率
我们扫描数万封已有的邮件,建立单词表。此时我们计算的是:在这个单词表中,每个词在垃圾邮件里的固有频率(比如“中奖”在垃圾邮件里出现的频率是 80%)。当一封新邮件进来时,我们不是去算新邮件里每个单词的频率,而是去查表。如果新邮件里有“中奖”这个词,我们就把表里存的那个 “80%” 拿出来参与乘法运算。如果遇到一个新词(比如之前提到的 nips),模型就没法从历史数据里找到对应的“固有频率”,那么就需要用到拉普拉斯平滑。
朴素贝叶斯跟高斯判别分析一样,需要先得到不同类别的特征分布(每个单词在不同类别中出现的概率),当新样本进入后,也是用贝叶斯规则去利用先验概率和先验特征分布去计算后验概率,也是一种软分类。
