【机器学习】《机器学习》周志华西瓜书 笔记/习题答案 总目录
——————————————————————————————————————————————————————
贝叶斯分类器
贝叶斯分类器(Bayes Classifier) 各种分类器中分类错误概率最小或者在预先给定代价的情况下平均风险最小的分类器,是一种通过最大化后验概率进行单点估计的分类器。
这一章的内容大致如下:
-
贝叶斯决策论:如何计算某个样本误分类的期望损失 / 条件风险?贝叶斯判定准则是怎样的?什么是判别式模型?什么是生成式模型?贝叶斯定理中各个概率代表什么?估计后验概率有什么难处?
-
极大似然估计:如何估计类条件概率?频率学派和贝叶斯学派对参数估计有什么不同的见解?极大似然估计的思想是什么?如何处理概率连成造成的下溢?试想一下连续属性和离散属性的极大似然估计。这种估计方法有什么缺点?
-
朴素贝叶斯分类器:朴素贝叶斯分类器是基于什么假设的?表达式怎么写?为什么估计概率值时需要进行平滑?拉普拉斯修正是怎样的?现实任务中中如何使用朴素贝叶斯分类器?
-
半朴素贝叶斯分类器:半朴素贝叶斯分类器是基于什么假设的?什么是独依赖估计?独依赖分类器有哪些学习方法?AODE有什么优点?是否可以通过考虑属性之间的高阶依赖来进一步提升模型的泛化性能?
-
贝叶斯网络:什么是贝叶斯网络?它的结构是怎样的?如何进行模型的学习?如何对新样本进行推断?
-
EM算法:什么是隐变量?EM算法的步骤是怎样的?和梯度下降有什么不同?
贝叶斯决策论
贝叶斯决策论(Bayesian decision theory) 是概率框架下实施决策的基本方法。具体来说,对分类任务来说,在所有相关概率都己知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。
以多分类任务为例,假设有 种可能的类别标记,即 ,用 表示把一个真实标记为 的样本误分类为 所产生的损失。那么基于后验概率 可获得将样本 分类为 所产生的 期望损失(expected loss),或者说,在样本 上的 条件风险(conditional risk):
它描述的是,给定一个样本 分类为 需要冒多大的风险。或者说,当样本真实标记不是 时,会有多大的损失。这个损失是一个求和,每一个求和项都是某一类别的后验概率和对应误分类损失的乘积。(注:书中这个地方不够细致,求和项的下标是要排除 本身的)
在单个样本条件风险的基础上,可以定义 总体风险:
描述的是,所有样本的条件风险的数学期望,其中 是一种用于产生分类结果的判断准则 。我们的任务就是找出能最小化总体风险 的判断准则。
怎样的判断准则能满足这个要求呢?很直观地,如果一个判断准则 能最小化所有样本 的条件风险,那它对应的总体风险必然也是最小的。这就产生了 贝叶斯判定准则(Bayes decision rule):为了最小化总体风险,只需 在每个样本上选择那个能使对应的条件风险 最小的标记。即:
这个判断准则 称为 贝叶斯最优分类器(Bayes optimal classifier),与之对应的总体风险 称为 贝叶斯风险(Bayes risk),而 则反映了分类器所能达到的最好性能,也即通过机器学习所能产生的 模型精度的理论上限。
具体来说,如果学习模型的目标是 令分类错误率最小,那么分类正确时误分类损失 为0,反之为1。
这时条件风险就是:
解析:
南瓜书——https://datawhalechina.github.io/pumpkin-book/#/
于是,最小化分类错误率的贝叶斯最优分类器为
即要令风险最小,我们只需选择使样本 后验概率 最大的一个类别标记就可以了。
问题在于,怎样获取后验概率呢?(在现实任务中通常难以获得)
事实上,从概率的角度来理解,机器学习的目标就是 基于有限的训练样本集尽可能准确地估计出后验概率(当然,大多数机器学习技术无需准确估计出后验概率)。要实现这个目标,主要有两种策略:
-
构建 判别式模型(discriminative models):给定样本 ,直接对后验概率 建模来预测 。这类模型包括决策树、BP神经网络、支持向量机等等。
-
构建 生成式模型(generative models) :给定样本 ,先对联合概率分布 建模,然后再利用联合概率计算出后验概率 ,也即 。
又因为联合概率 ,由此,能得到 贝叶斯定理:
解析:
南瓜书——https://datawhalechina.github.io/pumpkin-book/#/
在贝叶斯定理中,每个概率都有约定俗成的名称:
-
是类标记 相对于样本 的条件概率,也由于得自 的取值而被称作 的后验概率。
-
是样本 相对于类标记 的 类条件概率(class-conditional probability),或称为 似然(likelihood)。
-
是 的先验概率(也称为边缘概率),之所以称为"先验"是因为它不考虑任何 方面的因素。在这里又称为 类先验(prior)概率。
-
是 的先验概率。在这里是用作归一化的 证据(evidence)因子,与类标记无关。
有了贝叶斯定理,如何估计后验概率 的问题就转化为 如何计算类先验概率 和类条件概率 了。
类先验概率 表示的是 样本空间中各类样本的比例,根据大数定律,当训练集包含足够多的独立同分布样本 时, 可以直接通过 训练集中各类样本出现的频率 进行估计。
类条件概率 的情况就复杂多了,它涉及到类 中 样本 所有属性的联合概率,直接根据样本出现的频率来估计将会遇到严重的困难。例如:假设每个样本有 个二值属性,那么样本空间中可能的取值组合就多达 种,这个数目可能 远多于训练集的规模,也就意味着很多样本的取值没有在训练集中出现,所以 直接用训练集出现的频率进行估计是不可行的,因为"未被观测到"与"出现概率为零"通常是不同的,必须注意 未被观测到 和 出现概率为0 的区别。
注意,上述讨论中,均假设属性是离散型,对于连续型属性,只需把概率质量函数 换为概率密度函数 就可以了。
极大似然估计
估计类条件概率的一种常用策略是:先 假定该类样本服从某种确定的概率分布形式,然后再 基于训练集中的该类样本对假定的概率分布的参数进行估计。比方说假定该类样本服从高斯分布,那么接下来就是利用训练集中该类样本来估计高斯分布的参数——均值和方差。
具体来说,如果类 的样本服从参数为 (可能不止一个参数)的分布,那么从样本空间抽取到该类的某一个样本 的概率就是 。使用 来表示训练集 中第 类样本组成的子集,假设这些样本是独立同分布的,则可以定义参数 对于数据集 的 似然(likelihood) 为:
由于 连乘操作容易造成下溢,实际任务中通常使用 对数似然(log-likelihood) 来代替:
所谓 极大似然估计(Maximum Likelihood Estimation,简称MLE) 就是 找出令似然最大的参数 。也即从 的所有可能的取值中找到一个 令所抽取样本出现的可能性最大 的值。
求解的过程也很简单,就是求似然函数的导数,令导数为0,得到似然方程,解似然方程得到最优解,也即该类样本分布的参数。
特别地,概率模型的训练过程就是 参数估计(parameter estimation) 过程。对于参数估计,频率主义学派(Frequentist) 和 贝叶斯学派(Bayesian) 有不同的见解。前者认为,参数虽然未知,却是 客观存在的固定值,因此可以用优化似然函数等准则确定参数值;后者认为,参数是 未观测到的随机变量,参数本身也存在分布。所以可以先假定参数服从一个先验分布,然后再根据观测到的数据计算参数的后验分布。这一节讨论的极大似然估计方法源于频率主义学派。
尽管极大似然估计这种参数化的方法能使我们求取类条件概率的过程变得相对简单,但 估计结果的准确性严重依赖于所假设的概率分布形式是否符合潜在的真实数据分布。在现实应用中,欲做出能较好地接近潜在真实分布的假设,往往需在一
定程度上利用关于应用任务本身的经验知识,否则若仅凭"猜测"来假设概率分布形式,很可能产生误导性的结果.
P.S:关于最大似然、最大后验与贝叶斯估计的爱恨纠缠,准备写统计学习方法的笔记的时候再详细写一下,先挖个坑 ?
朴素贝叶斯分类器
前面提到了基于贝叶斯公式来估计后验概率 最大的一个难处是:类条件概率 是所有属性上的联合概率,难以从有限的训练样本直接估计而得,而多个属性的不同属性值组合并不一定全部囊括在训练集内,所以很难通过训练集估计。
为了避免这个障碍,朴素贝叶斯分类器(naive Bayes clssifier) 采用 属性条件独立性假设(attribute conditional independence assumption)。也就是说,对已知类别,假设 所有属性相互独立,单独地对分类结果产生影响。
基于这个假设,可以把类条件概率写成连乘的形式,因此贝叶斯定理可重写为:
其中 为属性数目, 为样本 在第 个属性上的取值。又因为 与类别无关,所以 朴素贝叶斯分类器的表达式 可以写为:
当训练集包含足够多独立同分布样本时,类先验概率 可以直接算出,也即训练集该类样本的数目占训练集规模的比例:
而条件概率 ,根据属性类型分离散和连续两种情况:
- 离散型属性:条件概率 可以估计为,在类别 的样本子集中,第 个属性取值为 的样本所占的比例:
- 连续性属性:替换为概率密度函数,假设第 个属性服从高斯分布,那么条件概率就写成 。我们利用类别 的样本子集在该属性上的取值算出分布的均值和方差,然后把属性取值 代入概率密度函数就可算出这个条件概率。
平滑
注意了,若 某个属性值在训练集中没有与某个类同时出现过,那么它对应的条件概率 就为0。在连乘中,这就意味着整个式子值为0了,其他属性携带的信息都被抹去了。这是很常见的情况,举个例子,假设有一篇新闻应该在体育版发布的,它包含了 “罗纳尔多” 这个词,但由于我们构造分类器时,训练集中所有 “体育” 类的文本都没有出现这个词,于是,该新闻按照式(1)计算出的体育类的条件概率必定为0;而恰好 “娱乐” 类的文本中有一篇包含了这个词,那么计算出的娱乐类的条件概率就大于0,从而使得这篇新闻被误分到娱乐版发布了,这显然很不合理。
此时,我们就需要对概率值进行 平滑(smoothing) 了,最常用的是 拉普拉斯修正(Laplacian correction),假设 训练集中 包含 个类别,第 个属性包含 种取值,则拉普拉斯修正把式(2)和式(3)修改为:
再回想一下上面新闻分类的例子,尽管所有 “体育” 类的文本都没有出现 “罗纳尔多” 这个词,但使用拉普拉斯修正后,这个词(文本分类中每个词是一个属性)对应的条件概率就不为0了,而是一个很小的值;而该新闻的其他词,比如 “足球”、“球场” 等等在体育类新闻中都出现得很频繁,所以最后累乘计算出的体育类的类条件概率就大于其他类,从而能正确地进行划分了。
拉普拉斯修正保证了 不会因为训练集样本不充分导致概率估值为零。但它实际上是假设了 类别和属性值是均匀分布的,相当于额外引入了先验,这个 假设并不总是成立。不过当训练集规模足够大时,引入先验所产生的影响会变得非常低。也可以理解为,此时式(4)和式(5)的分母很大,使得分子中引入的1带来的变化非常小,此时概率的估计值会趋向于真实值。
书上是西瓜的例子,也是一样的。
对一个"敲声=清脆"的测试例,有:
由于式的连乘式计算出的概率值为零,因此,无论该样本的其他属性是什么,哪怕在其他属性上明显像好瓜,分类的结果都将是"好瓜=否",这显然不太合理。
实际使用
朴素贝叶斯分类器和前面学习的模型有一个不同的地方就是,我们并不是基于训练集和某些算法来学习模型的参数;而是利用训练集来算出一些概率,在预测时,根据新样本的情况,使用不同的概率计算出它被分到各个类的后验概率,然后取后验概率最大的一个类作为结果。
在实际任务中,有两种使用方式:
-
查表:若对预测速度要求较高,则对给定训练集,可将朴素贝叶斯分类器涉及的所有概率估值事先计算好,然后存储起来,这样在进行预测时只需"查表"即可进行判别。
-
懒惰学习:若数据更替比较频繁,也可以理解为用训练集算出的概率可能很快就失效了,更新换代的速度很快,那就采取懒惰学习(lazy learning)的方式,先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值。
特别地,若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现 增量学习。
半朴素贝叶斯分类器
朴素贝叶斯分类器基于属性条件独立性假设,每个属性仅依赖于类别,如上图。但在现实任务中这个假设往往很难成立的,有时候 属性之间会存在依赖关系,这时我们就需要对属性条件独立性假设进行一定程度的放松,适当考虑一部分属性间的相互依赖信息,从而既不需进行完全联合概率计算,又不至于彻底忽略了比较强的属性依赖关系,这就是 半朴素贝叶斯分类器(semi-naive Bayes classifier) 的基本思想。
独依赖估计(One-Dependent Estimator,简称ODE) 是半朴素贝叶斯分类器最常用的一种策略,顾名思义,它假设的就是 每个属性在类别之外最多仅依赖于一个其他属性。也即:
其中 是属性 依赖的另一属性,称为 的 父属性。若已知父属性,就可以按式(5)来计算了。现在问题转化为 如何确定每个属性的父属性?
这里介绍两种产生独依赖分类器的方法:
SPODE
在 SPODE(Super-Parent ODE) 中,所有属性都依赖于一个共同的属性,称为 超父(super-parent),比方说上图中的 ,可以通过交叉验证等模型选择方法来确定最合适的超父属性。
TAN
TAN(Tree augmented naive Bayes) 则是一种基于 最大带权生成树(maximum weighted spanning tree) 的方法,包含以下四个步骤:
-
计算任意两个属性间的 条件互信息(conditional mutual information):
-
以属性为节点构建完全图,任意两个结点之间边的权重设为 。
-
构建此完全图的最大带权生成树,挑选根变量,将边置为有向。
-
加入类别节点 ,并增加从 到每个属性的有向边。
容易看出,条件互信息 刻画了属性 和 在己知类别情况下的相关性,因此,通过最大生成树算法, TAN 实际上仅保留了强相关属性之间的依赖性。
AODE
特别地,有一种更为强大的独依赖分类器——AODE(Average One-Dependent Estimator),它基于集成学习机制。无须通过模型选择来确定超父属性,而是尝试将每个属性都作为超父属性来构建模型,然后把有足够训练数据支撑的SPODE模型集成起来导出最终结果。
类似于朴素贝叶斯分类器,AODE的训练过程也是"计数",即在训练数据集上对符合条件的样本进行计数的过程。除此之外,无需进行模型选择,既可以 通过预计算来节省预测时间,又可以 采取懒惰学习,需要预测时再进行计数,并且可以容易地实现 增量学习。
高阶依赖
ODE假设每个属性最多依赖类别以外的另一属性,但如果我们继续放宽条件,允许属性最多依赖类别以外的 k 个其他属性,也即考虑属性间的 高阶依赖,那就得到了 kDE。
是不是考虑了高阶依赖就一定能带来性能提升呢?并不是这样的。随着 k 的增加,要准确估计条件概率 所需的训练样本会呈指数上升。如果训练样本不够,很容易陷入高阶联合概率的泥沼;但如果训练样本非常充足,那就有可能带来泛化性能的提升。
贝叶斯网
贝叶斯网(Bayesian network) 亦称 信念网(belief network),它借助 有向无环图(Directed Acyclic Graph,简称DAG) 来刻画属性之间的依赖关系,并使用 条件概率表(Conditional Probability Table,简称CPT) 来描述属性的联合概率分布。
具体来说,一个贝叶斯网 由结构 和参数 两部分构成,即 。网络结构 是一个有向无环图,其每个结点对应于一个属性,若两个属性有直接依赖关系,则它们由一条边连接起来;参数 定量描述这种依赖关系,假设属性 在 中的父结点集为 ,则 包含了每个属性的条件概率表 。
贝叶斯网的学习包括 结构 的学习和 参数 的学习,而预测新样本的过程则称为 推断(inference)。
1、结构
贝叶斯网结构有效地表达了属性间的条件独立性。给定父结点集,贝叶斯网假设每个属性与它的非后裔属性独立,于是 将属性 的联合概率分布定义为:
2、学习
若网络结构己知,即属性间的依赖关系己知,则贝叶斯网的学习过程相对简单,只需通过对训练样本"计数",估计出每个结点的条件概率表即可。但在现实应用中我们往往并不知晓网络结构,于是,贝叶斯网学习的首要任务就是 根据训练数据集来找出结构最"恰当"的贝叶斯网。
“评分搜索” 是求解这一问题的常用办法。具体来说,我们先定义一个评分函数(score function) ,以此来评估贝叶斯网与训练数据的契合程度,然后基于这个评分函数来寻找结构最优的贝叶斯网。显然,评分函数引入了关于我们希望获得什么样的贝叶斯网的 归纳偏好。
不幸的是,从所有可能的网络结构空间搜索最优贝叶斯网结构是一个NP难问题,难以快速求解。有两种常用的策略能在有限时间内求得近似解:第一种是 贪心法,例如从某个网络结构出发,每次调整一条边(增加、删除或调整方向),直到评分函数值不再降低为止;第二种是 通过给网络结构施加约束来削减搜索空间,例如将网络结构限定为树形结构等。
3、推断
贝叶斯网训练好之后就能用来回答"查询" (query),即通过一些属性变量的观测值来推测其他属性变量的取值。例如在西瓜问题中,若我们观测到西瓜色泽青绿、敲声烛响、根蒂蜷缩,想知道它是否成熟、甜度如何。这样通过已知变量观测值来推测待查询变量的过程称为"推断" (inference) ,己知变量观测值称为"证据" (evidence)。
最理想的是直接根据贝叶斯网定义的联合概率分布来精确计算后验概率,不幸的是,这样的"精确推断"己被证明是 NP 难的;换言之,当网络结点较多、连接稠密时,难以进行精确推断,此时需借助"近似推断",通过降低精度要求,在有限时间内求得近似解。在现实应用中,贝叶斯网的近似推断常使用 吉布斯采样(Gibbs sampling) 来完成,这是一种随机采样方法。
需注意的是,由于马尔可夫链通常需很长时间才能趋于平稳分布,因此吉布斯采样算法的收敛速度较慢.此外γ 若贝叶斯网中存在极端概率"0" 或 “1” ,则不能保证马尔可夫链存在平稳分布,此时吉布斯采样会给出错误的估计结果。
EM算法
极大似然估计方法是一种常用的参数估计方法,它是假设分布的形式,然后用训练样本来估计分布的参数。但实际任务中,我们遇到一个很大的问题就是 训练样本不完整。这时就需要用到 EM(Expectation-Maximization)算法 了。
所谓不完整的样本,说的是这个样本某些属性的值缺失了。将每个属性的取值看为一个变量,那么缺失的就可以看作“未观测”变量,比方说有的西瓜根蒂脱落了,没办法看出根蒂是“蜷缩”还是“硬挺”,那么这个西瓜样本的根蒂属性取值就是一个“未观测”变量,更准确地说,称作 隐变量(latent variable),也就是未观测变量的学名。
整个训练集可以划分为已观测变量集 和隐变量集 两部分。按照极大似然估计的思路,我们依然是想找出令训练集被观测到的概率最大的模型参数 。也即最大化对数似然:
但是,由于 是隐变量,上式没法直接求解,我们也没办法观测的到,所以上面这个式子实际是没法求的。
怎么办呢?EM算法的思路很简单,步骤如下:
- 设定一个初始的
- 按当前的 推断隐变量 的(期望)值,记为
- 基于已观测变量 和 步骤2得到的 对 做最大似然估计得到新的
- 若未收敛(比方说新的 与旧的 相差仍大于阈值),就回到步骤2,否则停止迭代
进一步,若我们不是取 的期望,而是基于所计算隐变量 的概率分布 ,则EM算法的两个步骤是:
- E 步(Expectation):以当前参数 推断隐变量分布 ,并计算对数似然 关于 的期望。
- M 步(Maximization):寻找参数最大化期望似然,即
EM算法可以看作是用 坐标下降(coordinate descent) 法来最大化对数似然下界的过程,每次固定 或者 中的一个去优化另一个,直到最后收敛到局部最优解。
事实上,隐变量估计问题也可通过梯度下降等优化算法求解,但由于求和的项数将随着隐变量的数目以指数级上升,会给梯度计算带来麻烦;而EM算法则可看作一种非梯度优化方法。
补充内容
贝叶斯决策论在机器学习、模式识别等诸多关注数据分析的领域都有极为重要的地位。对贝叶斯定理进行近似求解,为机器学习算法的设计提供了一种有效途径.为避免贝叶斯定理求解时面临的组合爆炸、样本稀疏问题,朴素贝叶斯分类器引入了属性条件独立性假设。这个假设在现实应用中往往很难成立,但有趣的是,朴素贝叶斯分类器在很多情形下都能获得相当好的性能。
关于这点,有以下两种解释:
- 对分类任务来说,只需各类别的条件概率 排序正确,即使概率值不准确,也可以产生正确的分类结果;
- 若属性间的相互依赖对所有类别影响都相同,或者依赖关系互相抵消,则属性条件独立性假设在降低开销的同时不会给性能带来负面影响;
注意,本章讨论的 贝叶斯分类器 和一般意义上的 贝叶斯学习(Bayesian learning) 是有很大差别的,本章讨论的贝叶斯分类器只是通过最大化后验概率来进行 单点估计,获得的仅仅是一个数值;而贝叶斯学习则是进行 分布估计 或者说 区间估计,获得的是一个分布。
数据挖掘十大算法:
一、 C4.5;
二、KNN;
三、Naive Bayes;
四、CART;
五、K-means;
六、Apriori;
七、SVM;
八、EM;
九、PageRank;
十、AdaBoost;