【机器学习】《机器学习》周志华西瓜书 笔记/习题答案 总目录
——————————————————————————————————————————————————————
集成学习
集成学习(ensemble learning) 通过构建并结合多个学习器来完成学习任务,有时也被称为 多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning) 等。
这一章的内容大致如下:
-
个体与集成:同质集成和异质集成有什么不同?集成学习对个体学习器有什么要求?集成学习研究的核心是什么?集成学习分哪两大类?
-
Boosting:Boosting的基本概念?AdaBoost算法的流程?如何基于加性模型最小化指数损失函数来推导?怎样处理基学习算法无法处理带权样本的情况?Boosting的优势是什么?
-
Bagging与随机森林:Bagging算法如何获得各个基学习器的训练集?预测时如何进行结合?相比AdaBoost有什么优势?随机森林的核心思想是什么?相比Bagging有什么优势?
-
结合策略:结合多个学习器有什么好处?平均法是怎样的?投票法是怎样的?学习法又是怎样的?
-
多样性:如何进行误差-分歧分解?说明了什么?有哪些多样性度量指标?有哪些增强多样性的手段?
个体与集成
如下图显示出集成学习的一般结构:先产生一组 个体学习器(individual learner),再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训练数据产生,例如C4.5 决策树算法、BP 神经网络算法等。
当所有个体学习器都由同样的学习算法生成时,也即集成中只包含同种类型的个体学习器时,称为 同质(homogeneous) 集成。同质集成中的个体学习器亦称 基学习器(base learner),相应的学习算法称为 基学习算法(base learning algorithm)。
当个体学习器由不同的学习算法生成时,称为 异质(heterogenous) 集成。异质集成中的个体学习器由不同的学习算法生成,这时就不再有基学习算法;相应的,个体学习器一般不称为基学习器,常称为**组件学习器(component learner)**或直接称为个体学习器。
集成学习通过结合多个学习器,通常能获得比单一学习器更优越的泛化性能,对 弱学习器(weak learner) 的提升尤为明显,因此集成学习的很多理论都是针对弱学习器进行的,而基学习器有时也被直接称为若学习器。
注意:弱学习器即略优于随机猜测的学习器,例如二分类任务中精度略高于50%。虽然理论上,集成弱学习器已经能获得很好的性能。但现实任务中,出于种种考虑,例如希望使用较少的个体学习器,或是重用关于常见学习器的一些经验等,人们往往会使用比较强的学习器。
在一般经验中,如果把好坏不等的东西掺到→起,那么结果会是比最坏的要好一些,比最好的要坏一些,也就是比上不足比下有余。那么集成学习把多个学习器结合起来,如何能获得比最好的单一学习器更好的性能呢?
举一个简单的例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如图所示:
其中 √ 表示分类正确,× 表示分类错误,集成学习的结果通过投票法(voting)产生,即 少数服从多数。在图(a)中,每个分类器都只有66.6% 的精度,但集成学习却达到了100%;在图(b)中,三个分类器没有差别,集成之后性能没有提高;在图© 中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。这个简单的例子显示出:要获得好的集成,个体学习器应好而不同。
通过单一变量法,a表示好而不同的分类器,b表示好但相同的分类器,c表示不好但不同的分类器。
必须注意,上面的例子说明了一个关键:基学习器相互独立。在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能相互独立!事实上,个体学习器的 准确性和多样性 本身就存在冲突。一般地,准确性很高之后,要增加多样性就需牺牲准确性。事实上,如何产生并结合好而不同的个体学习器,恰是集成学习研究的核心。
根据个体学习器的生成方式,集成学习方法大致可分为两个大类:
- 个体学习器间存在强依赖关系,必须串行生成的序列化方法,例如:Boosting算法族;
- 个体学习器间不存在强依赖关系,可同时生成的并行化方法,例如:Bagging,随机森林;
Boosting
Boosting 是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
Boosting 族算法最著名的代表是AdaBoost 啦!!!描述如下图:
如何理解AdaBoost?(转自知乎)
一个二元分类问题,如何划分红球和篮球。显然这个问题用一个线性分类器的话很难取得最好的效果。有没有办法通过组合一系列和正方形平行的线(每条线都相当于一个线性分类器)来获得一个比较好的分类效果呢?
第一步:先矮子里拔将军,选择一条平行于四边且最不坏的线段。下图第一排中间的小图里,直线把图分为左边(红点)和右边(蓝点)两类,被错分的点只有3个,这似乎是能得到的最好的结果了。然后我们想去找第二条线(第二个线性分类器)。如果只是基于现有的这些点的话那么说不定得到的线段还是和之前那条差不多,那多个线段(线性分类器)就没有意义了。所以我们要稍微调整一下某些点在分类结果里的重要性,提升他们的权重。我们在这里提升了那三个被错分的点的权重。
第二步:我们找到了一条新的线段,因为之前提升了把蓝点和蓝点分在一起的重要性,所以这条线段没有选择平行于上下两边把上面4个点(1红3蓝)和下面7个点(5红2蓝)分开,而是选择尽可能多地把蓝点归在一起。然而这次不同的是我们分错的是右边那4个红点,于是我们放大那4个红点,提升他们的权重。
不断重复这一过程。
最终我们得到了多个线性分类器,把这些线性分类器的结果做一个线性组合,我们就得到了整个集成模型的结果。每个线性分类器的结果的系数(权重)取决于它的表现,表现越好,权重越高。比如第一条线段的分类错误就优于第二条线段,那么它获得的权重也就会更大。集成模型的效果非常好。
顺带一提,第一条线段的分类正确率是8/11,第二条线段的分类正确率是7/11,第三条线段的分类正确率是8/11,确实要好于随机猜测(以1/2为界)。
AdaBoost 算法有多种推导方式,比较容易理解的是基于 加性模型(additive model),即基学习器的线性组合:
来最小化 指数损失函数(exponentialloss function)。
若H(x) 能令指数损失函数最小化,则考虑指数损失函数对H(x) 的偏导
令上式为零,可解得
解析:
南瓜书——https://datawhalechina.github.io/pumpkin-book/#/
这意味着 达到了贝叶斯最优错误率,即若指数损失函数最小化,则分类错误率也将最小化。这说明指数损失函数是分类任务原本的0 / 1 损失函数的 一致的(consistent)替代损失函数。由于这个替代函数有更好的数学性质,例如它是连续可微函数,因此用它替代0 / 1 损失函数作为优化目标。
在AdaBoost 算法中,第一个基分类器
是通过直接将基学习算法用于初始数据分布而得;此后迭代地生成
和
,当基分类器
基于分布
产生后,该基分类器的权重
应使得
最小化指数损失函数
考虑指数损失函数的导数
令上式为零可解得
这恰是AdaBoost 描述图中算法第6 行的分类器权重更新公式。
AdaBoost 算法在获得
之后样本分布将进行调整,使下一轮的基学习器
能纠正
的一些错误。理想的
能纠正
的全部错误,即最小化
注意到:
使用
的泰勒展式进行整理:
泰勒展开公式:
于是,理想的基学习器
解析:
南瓜书——https://datawhalechina.github.io/pumpkin-book/#/
从而得出
则理想的基学习器
由此可见,理想的
将在分布
下最小化分类误差。因此,弱分类器将基于分布
来训练,且针对
的分类误差应小于0.5。这在一定程度上类似 残差逼近 的思想。考虑到
和
的关系,有
这恰是AdaBoost 描述图中算法第7 行的样本分布更新公式。
Boosting 算法要求基学习器能:
- 对 特定的数据分布 进行学习,这可通过 重赋权法(re-weighting) 实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。
- 对无法接受 带权样本 的基学习算法,则可通过 重采样法(re-sampling) 来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。
一般而言,两种方法没有显著的优劣差别。
如果从偏差 - 方差分解的角度看,Boosting 主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。
Bagging与随机森林
前面提到过想要泛化性能强,个体学习器应尽可能相互独立。但我们也知道 独立 很难,那咋办呢?
可以设法使基学习器尽可能具有较大的差异:给定一个训练数据集,然后对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。这样,由于训练数据不同,获得的基学习器可望具有比较大的差异。然而,为获得好的集成,同时还希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法确保产生出比较好的基学习器。为解决这个问题,可考虑使用相互有交叠的采样子集。
Bagging
Bagging 是井行式集成学习方法最著名的代表。从名字即可看出,它直接基于 《机器学习》周志华西瓜书学习笔记(二):模型评估与选择 中的自助采样法(bootstrap sampling)。
给定包含m 个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m 次随机采样操作,我们得到含m 个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。继而可采样出T 个含m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合,这就是Bagging 的基本流程。
在对预测输出进行结合时, Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。Bagging 的算法描述图如下:
Bagging 集成有以下优点:
- 第一,训练一个Bagging 集成与直在使用基学习算法训练一个学习器的复杂度同阶,这说明Bagging 是一个很高效的集成学习算法。
- 第二,与标准AdaBoost 只适用于二分类任务不同,Bagging 能不经修改地用于多分类、回归等任务。
- 第三,由于每个基学习器只使用了初始训练集中约63.2% 的样本,剩下约36.8% 的样本可用作验证集来对泛化性能进行包外估计(out-oιbag estimate)。
从偏差方差分解的角度看,Bagging 主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。
随机森林
随机森林(Random Forest ,简称RF) 是Bagging 的一个扩展变体。RF 在以决策树为基学习器构建Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有d 个属性)中选择一个最优属性;而在RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
这里的参数k 控制了随机性的引入程度;若令k = d , 则基决策树的构建与传统决策树相同;若令k = 1 , 则是随机选择一个属性用于划分;一般情况下,推荐值 。
随机森林简单、容易实现、计算开销小,令人惊奇的是, 它在很多现实任务中展现出强大的性能,被誉为 代表集成学习技术水平的方法。可以看出,随机森林对Bagging 只做了小改动, 但是与Bagging 中基学习器的 多样性 仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自 样本扰动,还来自 属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
随机森林的收敛性与Bagging 相似。如下图所示:
随机森林的起始性能往往相对较差, 特别是在集成中只包含一个基学习器时,这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。值得一提的是,随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中, Bagging 使用的是 确定型决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的 随机型决策树 则只需考察一个属性子集。
结合策略
学习器结合可能会从三个方面带来好处:
- 首先,从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器则会减小这一风险;
- 第二,从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合, 可降低陷入糟糕局部极小点的风险;
- 第三, 从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器, 由于相应的假设空间有所扩大,有可能学得更好的近似。
直观示意图如下:
平均法
对数值型输出, 最常见的结合策略是使用 平均法(averaging)。
- 简单平均法(simple averaging)
- 加权平均法(weighted averaging)
其中
是个体学习器
的权重,通常要求
加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠.尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合。
一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
技票法
对分类任务来说,学习器 将从类别标记集合 中预测出一个标记,最常见的结合策略是使用投票法(voting)。为便于讨论,我们将 在样本x 上的预测输出表示为一个N 维向量 , 其中 是队在类别标记 上的输出。
- 绝对多数投票法(majority voting)
即若某标记得票过半数,则预测为该标记;否则拒绝预测。
- 相对多数投票法(plurality voting)
即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。
- 加权投票法(weighted yoting)
与加权平均法类似, Wi 是岛的权重,通常要求
学习法
当训练数据很多时,一种更为强大的结合策略是使用学习法,即通过另一个学习器来进行结合。
Stacking 是学习法的典型代表。这里把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner)。即先从初始数据集训练出初级学习器,然后"生成"一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。
算法描述图如下,这里假定初级学习器使用不同学习算法产生,即初级集成是异质的。
在训练阶段,次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此,一般是通过使用交叉验证或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。
多样性
误差 - 分歧分解
前面提到了,想要个体分类器好而不同,简单理论分析一下。
假定我们用个体学习器
通过加权平均法结合产生的集成,来完成回归学习任务。对示例x,定义学习器
的分歧(ambiguity)为
则集成的分歧是
显然,这里的分歧项表征了个体学习器在样本x 上的不一致性,即在一定程度上反映了个体学习器的多样性。个体学习器
和集成H 的平方误差分别为
个体学习器误差的加权均值为
则有
令p(x) 表示样本的概率密度,则在全样本上有
类似的,个体学习器
在全样本上的泛化误差和分歧项分别为
集成的泛化误差为
个体学习器泛化误差的加权均值为
个体学习器的加权分歧值
故而
这个漂亮的式子明确提示出:个体学习器准确性越高、多样性越大,则集成越好,称之为误差一分歧分解(error-ambiguity decomposition)。
那么直接把 E 作为优化目标来求解,不就能得到最优的集成了?
遗憾的是,在现实任务中很难直接对 E 进行优化,不仅由于它们是定义在整个样本空间上,还由于 A 不是一个可直接操作的多样性度量,它仅在集成构造好之后才能进行估计。此外,上面的推导过程只适用于回归学习,难以直接推广到分类学习任务上去。
多样性度量
又称差异性反量,顾名思义,多样性度量(diversity measure) 是用于度量集成中个体分类器的多样性,即估算个体学习器的多样化程度。典型做法是考虑个体分类器的两两相似 / 不相似性。
给定数据集,对二分类任务,,分类器 与 的预测结果列联表(contingency table) 为
其中, α 表示
与
均预测为正类的样本数目;b 、c、d 含义由此类推;α +b+c+d = m。
基于这个列联表,下面给出一些常见的多样性度量:
- 不合度量(disagreement measure)
的值域为 [0,1],值越大则多样性越大。
- 相关系数(correlation coefficient)
值域为 [-1,1],若
与
无关,则值为0;若
与
正相关则值为正,否则为负。
- Q - 绩计量(Q-statistic)
与相关系数的符号相同,且。
- κ - 统计量(κ-statistic)
其中,
是两个分类器取得一致的概率;
是两个分类器偶然达成一致的概率,它们可由数据集D 估算:
若分类器
与
在D 上完全一致,则 κ= 1;若它们仅是偶然达成一致,则 κ= o。κ 通常为非负值,仅在
与
达成一致的概率甚至低于偶然性的情况下取负值。
以上介绍的都是 “成对型” (pairwise) 多样性度量,它们可以容易地通过2维图绘制出来。例如著名的"κ-误差图", 就是将每一对分类器作为图上的一个点,横坐标是这对分类器的 κ 值, 纵坐标是它们的平均误差,显然,数据点云的位置越高,则个体分类器准确性越低;点云的位置越靠右, 则个体学习器的多样性越小。
多样性增强
在集成学习中需有效地生成多样性大的个体学习器。与简单地直接用初始数据训练出个体学习器相比,如何增强多样性呢?一般思路是在学习过程中引入随机性,常见做法主要是对数据样本、输入属性、输出表示、算法参数进行扰动。
补充内容
本章仅介绍了最基本的几种结合方法,常见的还有 基于D-S 证据理论的方法、动态分类器选择、混合专家(mixture of experts) 等。除此之外,还介绍了成对型多样性度量,但是现有多样性度量都存在显著缺陷。至于如何理解多样性,被认为是集成学习中的圣杯问题。
在集成产生之后再试图通过去除一些个体学习器来获得较小的集戚,称为 集成修剪(ensemble pruning)。这有助于减小模型的存储开销和预测时间开销。其中,对并行化集成的修剪亦称 “选择性集成” (selectiveensemble) ,但现在一般将选择性集成用作集成修剪的同义语,亦称 “集成选择” (ensemble selection)。
boosting系列算法之提升树,如
- 梯度提升GBDT(Gradient Boosting Decison Tree)
- XGB:GBDT的C++实现
- LightGBM
- ThunderGBM:快成一道闪电的梯度提升决策树
转载:https://blog.csdn.net/TeFuirnever/article/details/100527191