Date: 2019-08-19
机器学习岗位,集成学习是必不可少要了解的知识点,
所谓集成学习,是指构建多个分类器(弱分类器)对数据集进行预测,然后用某种策略将多个分类器预测的结果集成起来,作为最终预测结果。通俗比喻就是“三个臭皮匠赛过诸葛亮”,或一个公司董事会上的各董事投票决策,它要求每个弱分类器具备一定的“准确性”,分类器之间具备“差异性”。
集成学习根据各个弱分类器之间有无依赖关系,分为Boosting和Bagging两大流派:
Bagging流派,各分类器之间没有依赖关系,可各自并行,比如随机森林(Random Forest)
Boosting流派,各分类器之间有依赖关系,必须串行,比如传统的Boosting(Adaboost)和Gradient Boosting(GBDT、XGBoost、LightBoost)
2.1 原理
提到随机森林,就不得不提Bagging,Bagging可以简单的理解为:放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。
Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,因此可以概括RF包括四个部分:1、随机选择样本(放回抽样);2、随机选择特征;3、构建决策树;4、随机森林投票(平均)。
随机选择样本和Bagging相同,随机选择特征是指在树的构建中,会从样本集的特征集合中随机选择部分特征,然后再从这个子集中选择最优的属 性用于划分,这种随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随机森林的‘平均’特性,会使得它的方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。
(As a result of this randomness, the bias of the forest usually slightly increases (with respect to the bias of a single non-random tree) but, due to averaging, its variance also decreases, usually more than compensating for the increase in bias, hence yielding an overall better model.)
在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。
RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。
RF和Bagging对比:RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。
2.2 优缺点
随机森林的优点较多,简单总结:1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;3、容易做成并行化方法。
RF的缺点:在噪声较大的分类或者回归问题上回过拟合。
2.3
决策树
C4.5信息增益比:克服了ID3用信息增益选择属性时偏向选择取值多的属性的不足(某个属性存在大量的不同值,在划分时将每个值分为一个结点)
回归时:Los为 平方损失函数,最小化均方误差选择划分特征,切分点(值)将数据切分成两部分,用平方误差最小的准则(最小二乘法)求解每个单元上的最优输出值(每个叶子节点上的预测值为所有样本的平均值)。
用选定的对(j,s)划分区域并决定相应的输出值,每个叶子节点上的预测值为所有样本的平均值:
可以参看该repository中的另外文章中介绍的回归树
决策树的生成通常使用 信息增益最大、信息增益比最大或基尼指数最小作为特征选择的准则
2.4
随机森林
随机行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。
假如输入的样本为N个,那么采样的样本也是N个。这使得在训练的时候,每棵树的输入的样本都不是全部的样本,使得相对不容易出现over-fitting。
随机森林的随机性主要体现在两个方面:
数据集的随机选取:从原始的数据集中采取有放回的抽样(bagging),构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
待选特征的随机选取:与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。
随机森林用于回归的话,划分标准是mse(mean squared error)或者mae(mean absolute error)
Why is it called random then?
提升方法也是集成学习中发展比较好的一个分支,其每个基分类器的学习不能进行并行,下一个基分类器行和上一个分类器是有着强依赖性的关系,只能串行(后面延伸的XGBoost的并行性是基于特征而言的,并不是基于tree(每一个基分类器))。其根据是否引入了梯度信息分为传统的Boosting方法(AdaBoost)和梯度提升树(GBDT+XGBoost+LightGBM)。前者是每一个分类器的学习是加大了上一个分类器分错样本的权重,减少上一个分类器分正确样本的权重【特征二:在最后组合最终分类器时,分类错误率大的基分类器在组合时权重较小,分类错误率小的基分类器在组合时权重较大。】。后者是基于梯度提升树的拓展方法,每次训练基分类器(学习)实际上是在减少目前的分类器组合得到的预测值和真实值之间的残差,后面有年龄预测例子解释,则因此最后的到的分类器=第一个分类器的预测值+残差1+参差2+……。GBDT是简单的提升提升树的思想,每次训练主要基于梯度的负方向(小),
而XGBoost做了如下改进:
计算梯度的二阶泰勒展式,所以考虑了梯度的一阶导数和二阶导数信息。但GBDT仅仅考虑了一阶导数信息;
在每一个基分类器的学习时加入了正则化项 (在该轮引入了降低偏差的思想,防止过拟合);
列采样(对特征进行采样);
可以自定义损失函数,只需要其满足一阶导数和二阶导数存在即可;
因为每次训练基分类器时需要对特征进行排序,所以在训练之前先将所有特征进行排序,并将结果保存在Block结构中,后续直接使用,减少时间开销!
3.1 AdaBoost
AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
具体说来,整个Adaboost 迭代算法就3步:
3.2 GBDT (Gradient Boost Decision Tree)
另一种boosting方法GBDT(Gradient Boost Decision Tree),则与AdaBoost不同,GBDT每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型。
boosting集成学习由多个相关联的决策树联合决策,什么叫相关联?举个例子
很快你会意识到,Xgboost为何也是一个boosting的集成学习了。
而一个回归树形成的关键点在于:
至于另一类集成学习方法,比如Random Forest(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥关系。本文暂不展开介绍。
说到Xgboost,不得不先从GBDT(Gradient Boosting Decision Tree)说起。而且前面说过,两者都是boosting方法(如图所示:Y = Y1 + Y2 + Y3)
咱们来看个年龄预测的例子。
简单起见,假定训练集只有4个人:A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。
如果是用一棵传统的回归决策树来训练,会得到如下图所示结果:
现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点最多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。
我们会得到如下图所示结果:
在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为左右两拨,每拨用平均年龄作为预测值。
残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。
进而得到A,B,C,D的残差分别为-1,1,-1,1。
然后拿它们的残差代替A B C D的原值-1、1、-1、1,到第二棵树去学习,第二棵树只有两个值1和-1,直接分成两个节点,即A和C分在左边,B和D分在右边,经过计算(比如A,实际值-1 - 预测值-1 = 残差0,比如C,实际值-1 - 预测值-1 = 0),此时所有人的残差都是0。
残差值都为0,相当于第二棵树的预测值和它们的实际值相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了,即每个人都得到了真实的预测值。
换句话说,现在A,B,C,D的预测值都和真实年龄一致了。Perfect!
A: 14岁高一学生,购物较少,经常问学长问题,预测年龄A = 15 – 1 = 14
B: 16岁高三学生,购物较少,经常被学弟问问题,预测年龄B = 15 + 1 = 16
C: 24岁应届毕业生,购物较多,经常问师兄问题,预测年龄C = 25 – 1 = 24
D: 26岁工作两年员工,购物较多,经常被师弟问问题,预测年龄D = 25 + 1 = 26
3.3 XGBoost
XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进。原始的GBDT算法基于经验损失函数的负梯度来构造新的决策树,只是在决策树构建完成后再进行剪枝。而XGBoost在决策树构建阶段就加入了正则项,即
XGBoost需要从所有的树结构中找出一个最优的树结构,这是一个NP-hard问题,因此在实际中通常采用贪心算法来构建一个次优的树结构,基本思想是从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能的分裂,根据特定的准则选取最优的分裂。不同的决策树算法采用不同的准则,如IC3算法采用信息增益,C4.5算法为了克服信息增益中容易偏向取值较多的特征而采用信息增益比,CART算法使用基尼指数和平方误差,XGBoost也有特定的准则来选取最优分裂。
通过将预测值代入到损失函数中可求得损失函数的最小值
容易计算出分裂前后损失函数的差值为
XGBoost采用最大化这个差值作为准则来进行决策树的构建,通过遍历所有特征的所有取值,寻找使得损失函数前后相差最大时对应的分裂方式。此外,由于损失函数前后存在差值一定为正的限制,此时γ 起到了一定的预剪枝效果。
4.1 随机森林和GBDT区别
1. 随机森林采用的bagging思想[并行、降低方差],而GBDT采用的boosting思想[串行、降低偏差]。这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
2. 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。
3. 组成随机森林的树可以并行生成;而GBDT只能是串行生成。
4. 对于最终的输出结果而言,随机森林采用多数投票或者平均(回归)等;而GBDT则是将所有结果累加起来,或者加权累加起来。
5. 随机森林对异常值不敏感;GBDT对异常值非常敏感。
6. 随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。
7. 随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能
4.2 AdaBoost和GBDT区别
4.3 GBDT 和XGBoost
1. 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
2. 传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
3. XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
4. shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
5. 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
6. 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;
7. XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
附上常问面试整理:
RF、GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性。
根据个体学习器的生成方式,目前的集成学习方法大致分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)。
1、RF
1.1 原理
提到随机森林,就不得不提Bagging,Bagging可以简单的理解为:放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。
Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,因此可以概括RF包括四个部分:1、随机选择样本(放回抽样);2、随机选择特征;3、构建决策树;4、随机森林投票(平均)。
随机选择样本和Bagging相同,随机选择特征是指在树的构建中,会从样本集的特征集合中随机选择部分特征,然后再从这个子集中选择最优的属 性用于划分,这种随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随机森林的‘平均’特性,会使得它的方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。
(As a result of this randomness, the bias of the forest usually slightly increases (with respect to the bias of a single non-random tree) but, due to averaging, its variance also decreases, usually more than compensating for the increase in bias, hence yielding an overall better model.)
在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。
RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。
RF和Bagging对比:RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。
1.2 优缺点
随机森林的优点较多,简单总结:1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;3、容易做成并行化方法。
RF的缺点:在噪声较大的分类或者回归问题上回过拟合。
2、GBDT
提GBDT之前,谈一下Boosting,Boosting是一种与Bagging很类似的技术。不论是Boosting还是Bagging,所使用的多个分类器类型都是一致的。但是在前者当中,不同的分类器是通过串行训练而获得的,每个新分类器都根据已训练的分类器的性能来进行训练。Boosting是通过关注被已有分类器错分的那些数据来获得新的分类器。
由于Boosting分类的结果是基于所有分类器的加权求和结果的,因此Boosting与Bagging不太一样,Bagging中的分类器权值是一样的,而Boosting中的分类器权重并不相等,每个权重代表对应的分类器在上一轮迭代中的成功度。
2.1 原理
GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,我们可以在残差减小的梯度方向上建立模型,所以说,在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法,与传统的Boosting中关注正确错误的样本加权有着很大的区别。
在GradientBoosting算法中,关键就是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。
GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)。
2.2 优缺点
GBDT的性能在RF的基础上又有一步提升,因此其优点也很明显,1、它能灵活的处理各种类型的数据;2、在相对较少的调参时间下,预测的准确度较高。
当然由于它是Boosting,因此基学习器之前存在串行关系,难以并行训练数据。
3、XGBoost
3.1 原理
XGBoost的性能在GBDT上又有一步提升,而其性能也能通过各种比赛管窥一二。坊间对XGBoost最大的认知在于其能够自动地运用CPU的多线程进行并行计算,同时在算法精度上也进行了精度的提高。
由于GBDT在合理的参数设置下,往往要生成一定数量的树才能达到令人满意的准确率,在数据集较复杂时,模型可能需要几千次迭代运算。但是XGBoost利用并行的CPU更好的解决了这个问题。
其实XGBoost和GBDT的差别也较大,这一点也同样体现在其性能表现上,详见XGBoost与GBDT的区别。
4、区别
4.1 GBDT和XGBoost区别
* 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
* 传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
* XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
* shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
* 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
* 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;
* XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
参考资料:总结的都比较全面:
RF、GBDT、XGBoost面试级整理
GBDT和XGBoost的区别
机器学习-树模型理论(GDBT,xgboost,lightBoost,随机森林)
Adaboost、GBDT与XGBoost的区别
GBDT、XGBoost、LightGBM的区别和联系
集成学习中Adaboost, 提升树,bagging和随机森林有什么区别?
随机森林和GBDT的区别
提升树,bagging与随机森林