机器学习基础知识点②:决策树、随机森林、GBDT与xgboost

ID3、C4.5、CART、随机森林、bagging、boosting、Adaboost、GBDT、xgboost算法总结

干货|XGBoost进阶—调参+实战

GBDT、XGBoost、LightGBM 的使用及参数调优

零、集成学习常见问题

1、bagging与boosting

偏差低对应的点都打在靶心附近(偏差高:偏离靶心);方差低对应就是点都打的很集中(方差高:分布比较分散)。

  • 偏差主要是由于分类器的表达能力有限导致的系统性错误, 表现在训练误差不收敛
  • 方差是由于分类器对于样本分布过于敏感,导致在训练样本数较少时,产生过拟合

1)

  • Bagging通过减少模型方差提高性能(采用分而治之的策略,通过对样本多次采样,分别训练多个模型),
  • Boosting通过减少模型偏差提高性能(通过逐步聚焦分类器分错的样本)

2)

  • Boosting 方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。Boosting 的过程很类似于人类学习新知识的过程,迭代式学习
  • Bagging 方法在训练过程中,各基分类器之间无强依赖,可以并行训练。Bagging 方法更像是一个集体决策的过程,每个个体都进行单独学习,最终集体投票决策

3)(并不是所有集成学习框架中的基模型都是弱模型。)Bagging 和 Stacking 中的基模型为强模型(偏差低,方差高),而Boosting 中的基模型为弱模型偏差高,方差低)。

4)这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样,因此Boosting的分类精度要优于Bagging。

2、随机森林与GBDT

1)随机森林采用的bagging思想,而GBDT采用的boosting思想。

2)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。

3)组成随机森林的树可以并行生成;而GBDT只能是串行生成。

4)对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。

5)随机森林对异常值不敏感;GBDT对异常值非常敏感(异常点会获得较高权重)。

6)随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。

7)随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。

3、AdaBoost和GBDT

相同:  都是 Boosting 家族成员,使用弱分类器; 都使用前向分布算法;

不同:  

1)迭代思路不同:Adaboost 是通过提升错分数据点的权重来弥补模型的不足(利用错分样本),而 GBDT 是通过算梯度来弥补模型的不足(利用残差);

最主要的区别在于两者如何识别模型的问题。

AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。与AdaBoost不同。GBDT每一次的计算是为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新模型。

AdaBoost用错分数据点来识别问题,通过调整错分数据点的权重来改进模型。Gradient Boosting通过负梯度来识别问题,通过计算负梯度来改进模型。

2)损失函数不同:AdaBoost 采用的是指数损失,GBDT 使用的是绝对损失或者 Huber 损失函数;

https://www.nowcoder.com/ta/review-ml?query=GBDT

https://zhuanlan.zhihu.com/p/87885678

一、GBDT和xgboost

(1)GBDT

基本思想:根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有的模型中。(《百面》)

GBDT是以决策树(CART)为基学习器的梯度提升算法,是迭代树,而不是分类树。Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。

梯度提升和梯度下降的异同(《百面p293》)

同:都是利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新。

不同:

  • 梯度下降,模型的更新等价于参数空间的更新
  • 梯度提升,直接定义在函数空间,模型不需要进行参数化表示,从而大大扩展了可以使用的模型种类。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第1张图片

GBDT的核心就在于:每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第2张图片

(2)xgboost

Xgboost相比于GBDT来说,更加有效应用了数值优化,

最重要是对损失函数(预测值和真实值的误差)变得更复杂

目标函数依然是所有树的预测值相加等于预测值。

损失函数,引入了一阶导数,二阶导数。

综合以上的解说,我们可以得到xgboost相比于GBDT的创新之处:

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;
  • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • 忽略缺失值:在寻找splitpoint的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找splitpoint的时间开销
  • 指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
  • 并行化处理:在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第3张图片

xgboost常考点

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第4张图片

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第5张图片

 

二、决策树

首先,决策树是一个有监督的分类模型,其本质是选择一个能带来最大信息增益的特征值进行树的分割,直到到达结束条件或者叶子结点纯度到达一定阈值。按照分割指标和分割方法,决策树的经典模型可以分为ID3、C4.5以及CART

(1)ID3:以信息增益为准则来选择最优划分属性

信息增益的计算要基于信息熵(度量样本集合纯度的指标)

信息熵越小,数据集X的纯度越大

因此,假设于数据集D上建立决策树,数据有K个类别:

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第6张图片

公式(1)中:

表示第k类样本的数据占数据集D样本总数的比例

公式(2)表示的是以特征A作为分割的属性,得到的信息熵:

Di表示的是以属性A为划分,分成n个分支,第i个分支的节点集合

因此,该公式求的是以属性A为划分,n个分支的信息熵总和

公式(3)为分割后与分割前的信息熵的差值,也就是信息增益,越大越好

但是这种分割算法存在一定的缺陷

假设每个记录有一个属性“ID”,若按照ID来进行分割的话,由于ID是唯一的,因此在这一个属性上,能够取得的特征值等于样本的数目,也就是说ID的特征值很多。那么无论以哪个ID为划分,叶子结点的值只会有一个,纯度很大,得到的信息增益会很大,但这样划分出来的决策树是没意义的。由此可见,ID3决策树偏向于取值较多的属性进行分割,存在一定的偏好。为减小这一影响,有学者提出C4.5的分类算法。

(2)C4.5:基于信息增益率准则选择最优分割属性的算法

信息增益比率通过引入一个被称作分裂信息(Split information)的项来惩罚取值较多的属性。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第7张图片

分母IV为数据集D关于a的取值熵。分子是信息增益。

上式,分子计算与ID3一样,分母是由属性A的特征值个数决定的,个数越多,IV值越大,信息增益率越小,这样就可以避免模型偏好特征值多的属性,但是聪明的人一看就会发现,如果简单的按照这个规则来分割,模型又会偏向特征数少的特征。因此C4.5决策树先从候选划分属性中找出信息增益高于平均水平的属性,在从中选择增益率最高的。对ID3进行优化,一定程度上对取值比较多的特征进行惩罚,避免ID3出现过拟合的特性,提高决策树的泛化能力。

对于连续值属性来说,可取值数目不再有限,因此可以采用离散化技术(如二分法)进行处理。将属性值从小到大排序,然后选择中间值作为分割点,数值比它小的点被划分到左子树,数值不小于它的点被分到又子树,计算分割的信息增益率,选择信息增益率最大的属性值进行分割。

(3)CART:以基尼系数为准则选择最优划分属性,可以应用于分类和回归

CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第8张图片

Di表示以A是属性值划分成n个分支里的数目

Gini(D)反映了数据集D的纯度,值越小,纯度越高。我们在候选集合中选择使得划分后基尼指数最小的属性作为最优化分属性。

三者不同

  • ID3 只能处理离散型变量,而C4.5 和 CART 都可以处理连续型变量。
  • ID3 和C4.5 只能用于分类任务。CART (Classification and Regression Tree ,分类回归树)从名字就可以看出真不仅可以用
  • 于分类, 也可以应用于回归任务(回归树使用最小平方误差准则)。
  • ID3 对样本特征缺失值比较敏感,而C4.5 和CART 可以对缺失值进行不同方式的处理。
  • ID3 和C4. 5 可以在每个结点上产生出多叉分支,且每个特征在层级之间不会复用,而CART 每个结点只会产生两个分支,因此最后会形成一颗二叉树,且每个特征可以被重复使用;
  • ID3 和C4.5 通过剪枝来权衡树的准确性与泛化能力,而CART 直接利用全部数据发现所有可能的树结构进行对比。

分类树和回归树

提到决策树算法,很多想到的就是上面提到的ID3、C4.5、CART分类决策树。其实决策树分为分类树和回归树,前者用于分类,如晴天/阴天/雨天、用户性别、邮件是否是垃圾邮件,后者用于预测实数值,如明天的温度、用户的年龄等。

作为对比,先说分类树,我们知道ID3、C4.5分类树在每次分枝时,是穷举每一个特征属性的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的熵最大的feature和阈值。按照该标准分枝得到两个新节点,用同样方法继续分枝直到所有人都被分入性别唯一的叶子节点,或达到预设的终止条件,若最终叶子节点中的性别不唯一,则以多数人的性别作为该叶子节点的性别。

回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差--即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

三、随机森林

在讲随机森林之前,我们需要补充一点组合分类器的概念,将多个分类器的结果进行多票表决或者是取平均值,以此作为最终的结果。

1、构建组合分类器的好处:

(1)提升模型精度:整合各个模型的分类结果,得到更合理的决策边界,减少整体错误,实现更好的分类效果;

(2)处理过大或过小的数据集:数据集较大时,可以将数据集划分成多个子集,对子集构建分类器;数据集较小时,可通过多种抽样方式(bootstrap)从原始数据集抽样产生多组不同的数据集,构建分类器。

(3)若决策边界过于复杂,则线性模型不能很好地描述真实情况。因此先对于特定区域的数据集,训练多个线性分类器,再将它们集成。

(4)比较适合处理多源异构数据(存储方式不同(关系型、非关系型),类别不同(时序型、离散型、连续型、网络结构数据))

随机森林是一个典型的多个决策树的组合分类器。主要包括两个方面:数据的随机性选取,以及待选特征的随机选取。

(1)数据的随机选取:
第一,从原始的数据集中采取有放回的抽样(bootstrap),构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。如下图,假设随机森林中有3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么随机森林的分类结果就是A类。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第9张图片

(2)待选特征的随机选取:
与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

机器学习基础知识点②:决策树、随机森林、GBDT与xgboost_第10张图片

组合树示例图

 

你可能感兴趣的:(算法面试,集成学习,决策树,随机森林)