集成学习之Bagging
Boosting是一种基学习器间存在强依赖关系、必须串行生成的序列化方法。Bagging是一种基学习器间不存在强依赖关系、可同时生成的并行化方法,它的特点在“自助采样”。
想要得到泛化性能强的集成,基学习器应尽可能相互独立;虽然独立在现实任务中无法做到,但可以使基学习器尽可能具有较大的差异。给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生若干个不同的子集,再从每个数据子集中训练出一个基学习器。这样,由于训练数据不同,获得的基学习器可能具有比较大的差异。然而,为获得好的集成,个体学习器的学习能力不能太差,如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,往往学习能力较差。为了解决这个问题,bagging引入了自助采样(有放回采样)。
自助采样(有放回采样)就是从训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回,之前采集到的样本在放回后有可能继续被采集到。对于Bagging算法,对包含m个样本的数据集,进行m次有放回的随机采样,这样可以获得包含m个样本的采样集,当然有的样本是重复的,也有样本没有在采样集中出现过。这个过程重复m次,就可以得到m个采样集。然后,基于每个采样集分别训练一个单模型,对这m个单模型进行融合(与GBDT子采样不同,GBDT的子采样是无放回采样,而Bagging的子采样是有放回采样)。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,回归任务使用简单平均法(每个基学习器使用相同权重的投票、平均)。若分类预测时两个类票数相同,可以随机选择一个,也可通过学习器投票的置信度来确定最终胜者。
对于大约36.8%的没有被采样到的数据,常被称为包外数据(Out Of Bag,OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力,包外样本还有许多其他用途,例如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合的风险。
从偏差一方差的角度看,由于Bagging算法每次都进行采样来训练模型,泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,模型的偏差会变大,因此,它在不剪枝决策树、神经网络等易受样本扰动的学习器上效果更为明显。
bagging算法流程
随机森林
随机森林(Random Forest,简称RF) 是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择。传统决策树在选择划分特征时是在当前结点的特征集合(假定有d个特征)中选择一个最优特征;而在RF中,对基决策树的每个结点,先从该结点的特征集合中随机选择一个包含k个特征的子集,然后再从这个子集中选择一个最优特征用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个特征用于划分;k越小,模型约健壮,但对于训练集的拟合程度会变差。即:模型的方差会减小,但是偏差会增大。在实际应用中,一般会通过交叉验证调参获取一个合适的k的值,一般情况下,推荐值k=log2d。
随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动不同(对初始训练集采样),随机森林中基学习器的多样性不仅来自样本扰动,还来自特征扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
随机森林的收敛性与Bagging相似,随机森林的起始性能往往相对较差,特别是在集成中只包含一个基学习器时。因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。
与梯度提升决策树GBDT类似,RF也常使用CART决策树作为弱学习器。
常规的随机森林算法的优缺点总结:
RF的主要优点有:
- 通过随机取样、随机取特征,增加了模型之间的独立性,训练出的模型的方差小,泛化能力强。
- 训练可以高度并行化,训练速度快。
- 由于随机选择决策树节点划分特征,其在样本特征维度很高的时候,仍然能高效的训练模型。
- 在训练后,可以得到变量重要性排序
- 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
- 对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化,对部分特征缺失不敏感。
RF的主要缺点有:
- 在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
- 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
Extra trees
extra trees是RF的一个变种, 原理几乎和RF一样,仅有区别有:
- 对于每个决策树的训练集,RF采用的是随机采样来选择采样集作为每个决策树的训练集,而extra trees是每个决策树采用原始训练集。
- 在选定了划分特征后,RF选择一个最优的特征值划分点,而extra trees会随机的选择一个特征和随机的阈值来划分决策树。
由于选择了随机的特征和随机的阈值进行决策树节点的划分,提供了额外的随机性,模型训练速度更快,并且可以很好的抑制过拟合,模型的方差相对于RF进一步减少,但是偏差会增大。在某些时候,extra trees的泛化能力比RF更好。
集成学习之Boosting
Boosting是一种个体学习器间存在强依赖关系、必须串行生成的序列化方法,它可将一系列的弱学习器提升为强学习器。这族算法的工作机制类似:在每一轮迭代中,基于已生成的弱分类器集合的预测结果,新的弱分类器会重点关注那些还没有被正确预测的样本(Adaboost在每一个迭代中调整样本的权重,GBDT让新的学习器针对当前模型的残差进行拟合);该过程不断重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
Bagging 和 Boosting 的区别:
1. 样本选择上:
- Bagging:各轮训练集是在原始集中有放回采样的,具有一定的独立性。
- Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重根据上一轮的分类结果进行调整。
2. 样本及基学习器权重:
- Bagging:基学习器训练时使用有放回采样,每个样例的权重相等;训练完成进行模型融合时所有基学习器的权重也相等。
- Boosting:基学习器训练时根据错误率不断调整样本的权值,错误率越大的样本权重越大;训练完成进行模型融合时每个弱分类器都有相应的权重,误差小的学习器会有更大的权重。
3. 并行计算:
- Bagging:各个基学习器可以并行生成。
- Boosting:各个基学习器只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
4. 偏差与方差:
- Bagging 是减少方差 ,而 Boosting是减少偏差。
AdaBoost
AdaBoost算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率来更新训练样本的权重,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。然后基于调整权重后的训练集来训练弱学习器2,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
AdaBoost算法主要解决以下4个问题:
- 如何计算学习误差率e
- 如何得到弱学习器权重系数α
- 如何更新样本权重D
- 使用何种结合策略
AdaBoost二元分类问题算法流程:
对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数
其中R为类别数。如果是二元分类,R=2。
Adaboost回归问题的算法流程
AdaBoost回归算法变种很多,下面的算法为Adaboost R2回归算法过程。
Adaboost算法的正则化
Adaboost算法的优缺点总结:
Adaboost的主要优点有:
- Adaboost作为分类器时,分类精度很高
- Adaboost算法提供的是框架,可以使用各种回归分类模型来构建弱学习器,非常灵活。
- 作为简单的二元分类器时,构造简单,结果可理解。
- 不容易发生过拟合
Adaboost的主要缺点有:
- 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
1.2 梯度提升树(GBDT)原理小结
梯度提升树(Gradient Boosting Decison Tree, GBDT)有很多简称GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其实都是GBDT。
Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
GBDT的负梯度拟合
用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为:
通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,通过其损失函数的负梯度的拟合,就可以用GBDT来解决分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。
GBDT回归算法
算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。第2(b)步估计回归树叶结点区域,以拟合残差的近似值。第2(c)步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步更新回归树。第3步得到输出的最终模型f (X)。
GBDT分类算法
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。用对数似然损失函数的GBDT分类,有二元分类和多元分类的区别。
二元GBDT分类算法
对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。
多元GBDT分类算法
多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,多元GBDT分类和二元GBDT分类以及GBDT回归算法过程相同。
GBDT常用损失函数
对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
如果是指数损失函数,则损失函数表达式为
其负梯度计算和叶子节点的最佳残差拟合参见Adaboost。
如果是对数损失函数,分为二元分类和多元分类两种,参见前两节。
对于回归算法,常用损失函数有如下4种:
a)均方差,这个是最常见的回归损失函数了
b)绝对损失,这个损失函数也很常见
对应负梯度误差为:
c)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
对应的负梯度误差为:
d) 分位数损失。它对应的是分位数回归的损失函数,表达式为
其中θ为分位数,需要我们在回归前指定。对应的负梯度误差为:
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
GBDT的正则化
为防止过拟合GBDT也需要进行正则化。GBDT的正则化主要有以下三种方式:
第一种是和Adaboost类似的正则化项,即步长。定义为v,对于前面的弱学习器的迭代如果我们加上了正则化项,则有
,v的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的v意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
第二种正则化的方式是通过子采样比例。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
第三种是对于弱学习器即CART回归树进行正则化剪枝。
GBDT的算流程
GBDT是一种个体学习器间存在强依赖关系、必须串行生成的序列化方法,它可将一系列的弱学习器提升为强学习器。在每一轮迭代中,首先计算出当前模型在所有样本上的残差(负梯度),新的学习器针对当前模型的残差进行拟合并计算出该分类器的权重;该过程不断重复进行,直至基学习器数目达到事先指定的值T或残差收敛到某个阈值以下,最终将这T个基学习器进行加权结合。(提升树的损失函数为平方损失和指数损失时,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化并不那么容易,针对一般损失函数优化困难问题,利用损失函数的负梯度在当前模型的值,作为残差的近似值进行求解。)
梯度提升和梯度下降的区别和联系是什么?
相同点:两者都是在每一轮迭代中,利用损失函数负梯度信息对当前模型进行更新
不同点:在梯度下降中,模型是以参数化形式表示,模型的更新等价于参数的更新。在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而扩展了可以使用的模型种类。
GBDT的算法推导
GBDT的优缺点总结
GBDT主要的优点有:
- 预测阶段的计算速度较快,树与树之间可以进行并行化计算
- 在分布稠密的数据集上,泛化能力和表达能力都很好
- 使用CART决策树作为弱分类器具有很好的解释性和鲁棒性,能够自动发现特征间的高阶关系
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 在相对少的调参时间情况下,预测的准备率也可以比较高。
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:
- 模型训练阶段由于弱学习器之间存在依赖关系,难以并行训练数据,只能在决策树内部采用一些局部并行的手段提高训练速度,也可以通过自采样的SGBT来达到部分并行。
- 在高维稀疏数据集上表现不如支持向量机和神经网络。
GBDT的效果相比于传统的LR,SVM效果为什么好一些 ?
- GBDT基于树模型,继承了树模型的优点 :对异常点鲁棒、受噪声的干扰小;不相关的特征干扰性低、可以很好地处理缺失值
- GBDT是集成学习,结合了多个弱分类器,而且串行生成的弱分类器是对上一个模型的残差进行拟合,所以泛化能力和准确率更高
GBDT和XGBoost的区别与联系(论文层面)
- GBDT是机器学习算法,XGBoost是该算法的工程实现
- GBDT无显式正则化;XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,提高模型的泛化性能。
- GBDT仅使用了目标函数一阶导数信息,而XGBoost使用了目标函数的二阶的泰勒展开值(函数二阶可导,支持自定义损失函数,加快收敛速度)
- GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器
- 节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导分裂前后损失函数的差值
- GBDT在每轮迭代中使用全部数据,XGBoost采用了与随机森林相似的策略,支持对数据进行采样
- GBDT没有设计对缺失值进行处理,XGBoost能自动学习出缺失值的处理策略
- XGBoost通过预排序的方法来实现特征并行,提高模型训练效率
- XGBoost支持分布式计算
sklearn GBDT vs. XGBoost(实现层面)
- 正则化方式不同
- sklearn GBDT中仅仅通过超参数learning_rate对每棵树的贡献进行缩放(影响到基学习器的数目)。如果设置为低值,如0.1,则需要更多的树来拟合训练集,但是预测的泛化效果通常更好;此外gbdt里的early stopping也达到了一个正则化的效果,对应的主要参数是
min_impurity_split
即控制了判断叶节点是否进一步切分不纯度的阈值,若超过该阈值则可以进一步切分,即控制了树的深度,避免基学习器的复杂度过高 - XGBoost除了学习率以外还有显示的设置正则化项L1,L;以及对应论文里的叶节点数(参数gamma),节点权重和(参数min_child_weight)来控制模型复杂度
- sklearn GBDT中仅仅通过超参数learning_rate对每棵树的贡献进行缩放(影响到基学习器的数目)。如果设置为低值,如0.1,则需要更多的树来拟合训练集,但是预测的泛化效果通常更好;此外gbdt里的early stopping也达到了一个正则化的效果,对应的主要参数是
- early-stopping意义不同:sklearn GBDT中控制基学习器进一步切分、生长;XGBoost控制基学习器的数目
- 特征重要性的判断标准:sklearn GBDT是根据树节点特征对应的深度来判断;XGBoost则有三种方法(get_score):
- cover:各个树中该特征平均覆盖情况
- gain:使用特征进行切分的平均增益
- weight:特征用来作为切分特征的次数
- XGBoost存在三种树的切分算法:直方图算法;近似贪心(分位点切分;使得对于大量的特征取值尤其是连续变量时XGBoost会比sklearn-gbdt快很多);原始的贪心算法(每个特征值切分)
- XGBoost支持level-wise和leaf-wise两种树的生长方式
- XGBoost支持GPU
- XGBoost支持多种评价标准、支持多种任务(回归、分类、排序)
常用的基学习器是什么?
最常用的基学习器是决策树,主要有以下3个方面的原因:
- 决策树可以较为方便地将样本的权重整合到训练过程中,而不需要使用过采样的方法来调整样本权重。
- 决策树的表达能力和泛化能力,可以通过调节树的层数来做折中。
- 决策树为不稳定学习器,可以通过引入数据扰动和属性扰动增加模型之间的独立性。数据扰动:数据样本的扰动对于决策树的影响较大,因此不同的样本子集生成的基学习器随机性较大。属性扰动:在决策树节点分裂时,随机地选择一个特征子集,在该特征子集中找出最优分裂特征,可以很好地引入了随机性。
除了决策树外,神经网络模型也适合作为基学习器,因为神经网络模型也比较“不稳定”,而且可以通过调整神经元数量、连接方式、网络层数、初始权值等方式引入随机性。
可否将随机森林中的基学习器,由决策树替换为线性分类器或K-近邻?
随机森林属于Bagging类的集成学习,Bagging的主要优势是集成后学习器的方差比基学习器小。所以Bagging所采用的基分类器应该是对样本和特征较为敏感,方差较大的不稳定学习器,这样Bagging才能有好的集成效果。线性分类器或者K-近邻都是较为稳定的分类器,本身方差就不大,所以以它们为基学习器进行集成的话不会有特别明显的效果,甚至可能因为Bagging的自助采样,增大基学习器的偏差,从而使集成学习器的效果还不如基学习器使用全量训练数据的效果。
偏差和方差的角度去解释Boosting和Bagging
偏差:度量模型输出结果的期望与真实结果的偏离程度。偏差通常是由于我们对学习算法做了错误的假设所导致的,比如真实模型是某个二次函数,但我们假设模型是一次函数。由偏差带来的误差通常在训练误差上就能体现出来。
方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动造成的影响(方差较大的表现为:数据的一点点扰动都会较大地影响模型)。方差通常是由于模型的复杂度过高对训练样本产生过拟合导致的。由方差带来的误差通常体现在测试误差相对于训练误差的增量上。
Bagging能够提高弱学习器性能的原因是降低了方差,Boosting能够提升弱学习器性能的原因是降低了偏差。
在随机变量完全独立的情况下,n个随机变量取平均后,方差可以减小到了原来的1/n。但模型之间不可能完全独立,为了追求模型的独立性,Bagging类算法使用了自助采样,随机森林在bagging的基础上引入了属性扰动:每次选取节点分裂特征时,会在随机抽取的特征子集中选取最优特征,而不是从所有特征中选取最优特征。这样可以避免弱学习器之间有过强的相关性,降低Bagging集成后模型的方差。
Boosting是在训练好一个弱分类器后,计算弱学习器的错误或者残差,作为下一个学习器的输入。这个过程本身就是在不断减小损失函数,降低模型的偏差。由于Boosting的训练过程使得各弱分类器之间是强相关的,缺乏独立性,所以并不会对降低方差有作用。
泛化误差、偏差、方差和模型复杂度的关系:方差和偏差是矛盾统一的。对于给定的学习任务和训练数据集,我们需要对模型的复杂度做合理的假设。如果模型复杂度过低,虽然方差很小,但是偏差会很高;如果模型复杂度过高,虽然偏差很小,但是方差会很高。所以需要综合考虑偏差和方差选择合适复杂度的模型进行训练。