面试问题决策树合集

文章目录

    • ID3、C4.5和CART三种决策树的区别
    • 一、决策树的优点和缺点
    • 二、决策树思想及生成过程
    • 三,前后剪枝区别
    • 四,决策树优缺点:
    • 五, Bagging和boosting的区别
    • 六,XGBOOST和GDBT的区别
    • 七,xgboost,rf,lr优缺点有哪些?
    • 八,xgboost特征并行化怎么做的
    • 九,xgboost和lightgbm的区别和适用场景
    • 十,GDBT的原理,以及常用的调参参数
    • 十一,AdaBoost和GBDT的区别
    • 十二,GBDT推导
    • 十三,gbdt推导和适用场景
    • 十四,说一下gbdt的全部算法过程
    • 随机森林和 GBDT 的区别
    • 十五,stacking和blending的区别?
  • 附加:
    • 1.什么是xgboost?
    • 2.什么是GBDT?
    • 3.什么是RF?
    • 4.什么是AdaBoost?
    • 5.分类树和回归树的区别是什么?
    • 6.XGBoost的参数调优有哪些经验(工具)
    • 7.XGBoost的正则化是如何实现的(工具)
    • 8,随机森林如何填充缺失值?
    • 9,解释相似度矩阵:
    • 10,说一下Adaboost及权值更新公式
      • **请问GBDT和XGBoost的区别是什么?**
  • 补充:
    • 问题:xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
    • 5、集成学习
  • RF、GBDT、xgboost相关面试题:
    • 1、RF的原理是什么?
    • 2、GBDT
    • 3、XGBoost
    • 4、区别
    • RF(随机森林)与GBDT之间的区别
    • GBDT如何评估特征值的权重大小?
    • Xgboost中如何防止过拟合?
    • 相对于GBDT来讲, xgboost在实现时还做了许多优化?
    • xgboost是用二阶泰勒展开的优势在哪?
      • 相比GBDT的一阶泰勒展开,xgboost二阶优势在哪?

● Bagging和boosting的区别 13
参考回答: 13
● XGBOOST和GDBT的区别 14
参考回答: 14
● xgboost的特征重要性计算 14
参考回答: 15
● xgboost的正则项表达式 15
参考回答: 15
● xgboost原理,怎么防过拟合 15
参考回答: 15
● xgboost,rf,lr优缺点有哪些? 18
参考回答: 18
● xgboost特征并行化怎么做的 20
参考回答: 20
● xgboost和lightgbm的区别和适用场景 20
参考回答: 20
● GDBT的原理,以及常用的调参参数 21
参考回答: 21
● AdaBoost和GBDT的区别 21
参考回答: 21
● GBDT推导 22
参考回答: 22
● gbdt推导和适用场景 24
参考回答: 24
● 说一下gbdt的全部算法过程 25
参考回答: 25
rf和gbdt基分类器区别,里面的决策树分别长啥样,怎么剪枝? 26
参考回答: 26
● 随机森林和 GBDT 的区别 28
参考回答: 28
● stacking和blending的区别? 29
参考回答: 29
随机森林如何填充缺失值? 32
10:说一下Adaboost及权值更新公式 33
1.理解kaggle比赛大杀器xgboost 34
2. GBDT、XGBoost、LightGBM的区别和联系 34
3.gging与boosting两种集成模型的偏差bias以及方差variance 的理解 34
4. 提升树(boosting tree)算法的思想 34
7和8:xgboost为什么用泰勒展开(或者相对于GBDT的一阶泰勒展开式,xgboost的优势在哪?)?是有放回选特征吗? 35
请问GBDT和XGBoost的区别是什么? 36
5、集成学习 39
xgboost是用二阶泰勒展开的优势在哪? 49

ID3、C4.5和CART三种决策树的区别

参考回答:
ID3决策树优先选择信息增益大的属性来对样本进行划分,但是这样的分裂节点方法有一个很大的缺点,当一个属性可取值数目较多时,可能在这个属性对应值下的样本只有一个或者很少个,此时它的信息增益将很高,ID3会认为这个属性很适合划分,但实际情况下叫多属性的取值会使模型的泛化能力较差,所以C4.5不采用信息增益作为划分依据,而是采用信息增益率作为划分依据。但是仍不能完全解决以上问题,而是有所改善,这个时候引入了CART树,它使用gini系数作为节点的分裂依据。

面试问题决策树合集_第1张图片
面试问题决策树合集_第2张图片
面试问题决策树合集_第3张图片
面试问题决策树合集_第4张图片
面试问题决策树合集_第5张图片
面试问题决策树合集_第6张图片
面试问题决策树合集_第7张图片
面试问题决策树合集_第8张图片
面试问题决策树合集_第9张图片
面试问题决策树合集_第10张图片

一、决策树的优点和缺点

优点:

  1. 决策树算法中学习简单的决策规则建立决策树模型的过程非常容易理解,
  2. 决策树模型可以可视化,非常直观
  3. 应用范围广,可用于分类和回归,而且非常容易做多类别的分类
  4. 能够处理数值型和连续的样本特征
    缺点:
  5. 很容易在训练数据中生成复杂的树结构,造成过拟合(overfitting)。剪枝可以缓解过拟合的负作用,常用方法是限制树的高度、叶子节点中的最少样本数量。
  6. 学习一棵最优的决策树被认为是NP-Complete问题。实际中的决策树是基于启发式的贪心算法建立的,这种算法不能保证建立全局最优的决策树。Random Forest 引入随机能缓解这个问题

二、决策树思想及生成过程

决策树包含,特征选择、决策树构建、剪枝三个过程
决策树(Decision Tree)的思想是贪心(最优化分) 与 分治(子树划分)。构建决策树的目的是:随着划分过程的进行,使得决策树分支结点所包含的样本尽可能属于同一类别,即使得分类更准确
2. ID3采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的Feature,因为属性值多的Feature会有相对较大的信息增益?
(信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大)
3. 相比ID3,C4.5还能处理连续属性值,具体步骤为:
• 把需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序.
• 假设该属性对应的不同的属性值一共有N个,那么总共有N−1个可能的候选分割阈值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点,根据这个分割点把原来连续的属性分成bool属性.实际上可以不用检查所有N−1个分割点,具体请看下面的例子.
• 用信息增益比率选择最佳划分.

三,前后剪枝区别

1 预剪枝
通过提前停止树的构造进行剪枝.
• 树到达一定高度
• 节点下包含的样本点小于一定数目
• 信息增益小于一定的阈值等等
• 节点下所有样本都属于同一个类别
2 后剪枝
后剪枝首先通过完全分裂构造完整的决策树,允许过拟合,然后采取一定的策略来进行剪枝,常用的后剪枝策略包括:
• 降低错误剪枝 REP(Reduced Error Pruning)
• 悲观错误剪枝 PEP(Pessimistic Error Pruning)
• 基于错误剪枝 EBP(Error Based Pruning)
• 代价-复杂度剪枝 CCP(Cost Complexity Pruning)
• 最小错误剪枝 MEP(Minimum Error Pruning)
• 等等
• 拿 CCP 举例,CART用的就是CCP剪枝,其余的剪枝方法可以网上google一下. CCP剪枝类实际上就是我们之前讲到的最小化结构风险,对决策树,结构风险定义为:
• Cα(T)=C(T)+α|T|Cα(T)=C(T)+α|T|
• 其中: C(T)为模型对训练数据的误差.对分类树,可以采用熵,基尼指数等等.对回归树,可以采用平方误差,∣T∣为树的叶子节点个数, α为两者的平衡系数.

四,决策树优缺点:

优点:

  1. 模型特别容易解释,甚至比线性模型有更好的解释性.
  2. 决策过程跟人的思维习惯特别接近.
  3. 能很清楚的图形化显示模型.
  4. 能很方便的处理一些定性的Feature.
    缺点:
  5. 一般来说,准确率不如其他的模型.但有很多解方案,下面会逐一介绍.
  6. 不支持在线学习,有新样本来的时候,需要重建决策树.
  7. 很容易产生过拟合.
    8 Bagging
    面试问题决策树合集_第11张图片

9 Random Forest
面试问题决策树合集_第12张图片
Random Forest Vs Bagging:

  1. Rand forest是选与输入样本的数目相同多的次数(可能一个样本会被选取多次,同时也会造成一些样本不会被选取到),而bagging一般选取比输入样本的数目少的样本
  2. Bagging是用全部特征来得到分类器,而rand forest是需要从全部特征中选取其中的一部分来训练得到分类器。
  3. 一般Rand forest效果比bagging效果好。

五, Bagging和boosting的区别

参考回答:
1)Bagging是从训练集中进行子抽样组成每个基模型所需要的子训练集,然后对所有基模型预测的结果进行综合操作产生最终的预测结果。 Boosting中基模型按次序进行训练,而基模型的训练集按照某种策略每次都进行一定的转化,最后以一定的方式将基分类器组合成一个强分类器。
2)Bagging的训练集是在原始集中有放回的选取,而Boosting各轮训练集的选择与前面各轮的学习结果有关,每轮的训练集不变,只是训练集中的每个样本在分类器中的权重都会发生变化,此权值会根据上一轮的结果进行调整。
3)Bagging的所有预测函数的权重相等, 各个预测函数可以并行生成, 对于象神经网络这样极为耗时的学习方法,Bagging可通过并行训练节省大量时间开销. Boosting的各预测函数只能顺序生成。每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)Bagging中整体模型的期望近似于基模型的期望,所以整体模型的偏差相似于基模型的偏差,因此Bagging中的基模型为强模型(强模型拥有低偏差高方差)。 Boosting中的基模型为弱模型,若不是弱模型会导致整体模型的方差很大。Bagging是减少variance,Boosting是减少bias。
5) Bagging和boosting都可以有效地提高分类的准确性,在大多数数据集中,boosting的准确性比bagging高.( Bagging采用均匀取样,而Boosting根据错误率来取样)

补充:方差vs偏差

六,XGBOOST和GDBT的区别

参考回答:
GDBT在函数空间中利用梯度下降法进行优化而XGB在函数空间中使用了牛顿法进行优化。即GDBT在优化中使用了一阶导数信息,而XGB对损失函数进行了二阶泰勒展开,用到了一阶和二阶倒数信息。
XGB在损失函数中加入了正则项(树叶子节点个数,每个叶子节点上输出score的L2模平方和。
对于缺失的样本,XGB可以自动学习出它的分裂方向。
GDBT的节点分裂方式使用的是gini系数,XGB通过优化推导出分裂前后的增益来选择分裂节点。
XGB在处理每个特征列时可以做到并行。
xgboost的特征重要性计算
参考回答:
Xgboost根据结构分数的增益情况计算出来选择哪个特征作为分割点,而某个特征的重要性就是它在所有树中出现的次数之和。
xgboost的正则项表达式
参考回答:
γ T + 1 2 λ ∣ ∣ w ∣ ∣ 2 \gamma T+\frac{1}{2}\lambda||w||^2 γT+21λw2T为叶子节点的个数,w为叶子节点的分数
xgboost原理,怎么防过拟合
参考回答:
XGBoost是一个树集成模型,它使用的是K(树的总数为K)个树的每棵树对样本的预测值的和作为该样本在XGBoost系统中的预测,定义函数如下:
y i = θ ( x i ) = ∑ k = 1 K f k ( x i ) y_i=\theta(x_i)=\sum_{k=1}^Kf_k(x_i) yi=θ(xi)=k=1Kfk(xi)
对于所给的数据集有n个样本,m个特征,定义为:
D = { ( x i , y i ) } ( ∣ D ∣ = n , x i ∈ R m , y i ∈ R ) D=\{(x_i,y_i)\}(|D|=n,x_i\in R^m,y_i\in R) D={ (xi,yi)}(D=n,xiRm,yiR)
其中Xi表示第i个样本,yi表示第i个样本的类别标签。CART树的空间为F,如下:
F = { f ( x ) = w q ( x ) } ( q : R m − > T , w ∈ R T ) F=\{f(x)=w_{q(x)}\}(q:R^m->T,w\in R^T) F={ f(x)=wq(x)}(q:Rm>T,wRT)
其中q表示每棵树的结构映射每个样本到相应的叶节点的分数,即q表示树的模型,输入一个样本,根据模型将样本映射到叶节点输出预测的分数;Wq(x)表示树q的所有叶节点的分数组成集合;T是树q的叶节点数量。
所以,由(1)式可以看出,XGBoost的预测值为每棵树的预测值之和,即每棵树相应的叶节点的得分之和(Wi的和,Wi表示第i个叶节点的得分)。
我们的目标就是学习这样的K个树模型f(x).。为了学习模型f(x),我们定义下面的目标函数:

在这里插入图片描述

其中,(2)式右边第一项为损失函数项,即训练误差,是一个可微的凸函数(比如用于回归的均方误差和用于分类的Logistic误差函数等),第二项为正则化项,即每棵树的复杂度之和,目的是控制模型的复杂度,防止过拟合。我们的目标是在L(φ)取得最小化时得出对应的模型f(x)。
由于XGBoost模型中的优化参数是模型f(x),不是一个具体的值,所以不能用传统的优化方法在欧式空间中进行优化,而是采用additive training的方式去学习模型。每一次保留原来的模型不变,加入一个新的函数f到模型中,如下:
面试问题决策树合集_第13张图片

预测值在每一次迭代中加入一个新的函数f目的是使目标函数尽量最大地降低。
因为我们的目标是最小化L(φ)时得到模型f(x),但是L(φ)中并没有参数f(x),所以,我们将上图中的最后一式代入L(φ)中可得到如下式子:
在这里插入图片描述

对于平方误差(用于回归)来说(3)式转换成如下形式:
在这里插入图片描述

对于不是平方误差的情况下,一般会采用泰勒展开式来定义一个近似的目标函数,以方便我们的进一步计算。
根据如下的泰勒展开式,移除高阶无穷小项,得:
在这里插入图片描述

在这里插入图片描述

(3)式等价于下面的式子:
在这里插入图片描述

由于我们的目标是求L(φ)最小化时的模型f(x)(也是变量),当移除常数项时模型的最小值变化,但是取最小值的变量不变(比如:y=x^2+C,无论C去何值,x都在0处取最小值)。所以,为了简化计算,我们移除常数项,得到如下的目标函数:
在这里插入图片描述

定义在这里插入图片描述
为叶节点j的实例,重写(4)式,将关于树模型的迭代转换为关于树的叶子节点的迭代,得到如下过程:
面试问题决策树合集_第14张图片

此时我们的目标是求每棵树的叶节点j的分数Wj,求出Wj后,将每棵树的Wj相加,即可得到最终的预测的分数。而要想得到最优的Wj的值,即最小化我们的目标函数,所以上式对Wj求偏导,并令偏导数为0,算出此时的W*j为:
在这里插入图片描述
在这里插入图片描述

将W*j代入原式得:
在这里插入图片描述

方程(5)可以用作得分(score)函数来测量树结构q的质量。该得分类似于评估决策树的不纯度得分,除了它是针对更广泛的目标函数得出的。
在xgboost调中,一般有两种方式用于控制过拟合:
1)直接控制参数的复杂度:包括max_depth min_child_weight gamma;
2)add randomness来使得对训练对噪声鲁棒。包括subsample colsample_bytree,或者也可以减小步长 eta,但是需要增加num_round,来平衡步长因子的减小。

七,xgboost,rf,lr优缺点有哪些?

参考回答:
Xgboost:
优缺点:1)在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。2)xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。3)特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。4)按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。5)xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
适用场景:分类回归问题都可以。
RandomForest:
优点:1)表现性能好,与其他算法相比有着很大优势。2)随机森林能处理很高维度的数据(也就是很多特征的数据),并且不用做特征选择。3)在训练完之后,随机森林能给出哪些特征比较重要。4)训练速度快,容易做成并行化方法(训练时,树与树之间是相互独立的)。5)在训练过程中,能够检测到feature之间的影响。6)对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法。7)如果有很大一部分的特征遗失,用RF算法仍然可以维持准确度。8)随机森林算法有很强的抗干扰能力(具体体现在6,7点)。所以当数据存在大量的数据缺失,用RF也是不错的。9)随机森林抗过拟合能力比较强(虽然理论上说随机森林不会产生过拟合现象,但是在现实中噪声是不能忽略的,增加树虽然能够减小过拟合,但没有办法完全消除过拟合,无论怎么增加树都不行,再说树的数目也不可能无限增加的)。10)随机森林能够解决分类与回归两种类型的问题,并在这两方面都有相当好的估计表现。(虽然RF能做回归问题,但通常都用RF来解决分类问题)。11)在创建随机森林时候,对generlization error(泛化误差)使用的是无偏估计模型,泛化能力强。
缺点:1)随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上回过拟合)。2)对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。3)可能有很多相似的决策树,掩盖了真实的结果。4)对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。5)执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。
适用场景:数据维度相对低(几十维),同时对准确性有较高要求时。因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。
LR:
优点:实现简单,广泛的应用于工业问题上;分类时计算量非常小,速度很快,存储资源低;便利的观测样本概率分数;对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题。
缺点:当特征空间很大时,逻辑回归的性能不是很好;容易欠拟合,一般准确度不太高
不能很好地处理大量多类特征或变量;只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;对于非线性特征,需要进行转换。
适用场景:LR同样是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。

八,xgboost特征并行化怎么做的

参考回答:
决策树的学习最耗时的一个步骤就是对特征值进行排序,在进行节点分裂时需要计算每个特征的增益,最终选增益大的特征做分裂,各个特征的增益计算就可开启多线程进行。而且可以采用并行化的近似直方图算法进行节点分裂。
加:
附加题:
XGBoost的并行化部分是如何实现的(工具)

面试问题决策树合集_第15张图片

九,xgboost和lightgbm的区别和适用场景

参考回答:
(1)xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
(2)lightgbm使用了基于histogram的决策树算法,这一点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。1)内存上优势:很明显,直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。2)计算上的优势,预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)
(3)直方图做差加速,一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
(4)lightgbm支持直接输入categorical 的feature,在对离散特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个category“的gain。类似于one-hot编码。
(5)xgboost在每一层都动态构建直方图,因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。
其适用场景根据实际项目和两种算法的优点进行选择。

十,GDBT的原理,以及常用的调参参数

参考回答:
先用一个初始值去学习一棵树,然后在叶子处得到预测值以及预测后的残差,之后的树则基于之前树的残差不断的拟合得到,从而训练出一系列的树作为模型。
n_estimators基学习器的最大迭代次数,learning_rate学习率,max_lead_nodes最大叶子节点数,max_depth树的最大深度,min_samples_leaf叶子节点上最少样本数。

十一,AdaBoost和GBDT的区别

参考回答:
AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。
AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正确分类的样本权值,提高被错误分类的样本权值,而随机森林在训练每棵树的时候,随机挑选部分训练集进行训练。在对新数据进行预测时,AdaBoost中所有树加权投票进行预测,每棵树的权重和错误率有关,而随机森林对所有树的结果按照少数服从多数的原则进行预测。

十二,GBDT推导

参考回答:
GBDT 全称为 Gradient Boosting Decision Tree。顾名思义,它是一种基于决策树(decision tree)实现的分类回归算法。
Gradient Descent: method of steepest descent
梯度下降作为求解确定可微方程的常用方法而被人所熟知。它是一种迭代求解过程,具体就是使解沿着当前解所对应梯度的反方向迭代。这个方向也叫做最速下降方向。具体推导过程如下。假定当前已经迭代到第 k 轮结束,那么第 k+1 轮的结果怎么得到呢?我们对函数 f 做如下一阶泰勒展开:
在这里插入图片描述

为了使得第k+1 轮的函数值比第 k 轮的小,即如下不等式成立。
在这里插入图片描述

则只需使:
在这里插入图片描述

按照这样一直迭代下去,直到 ∇f(xk)=0, xk+1=xk ,函数收敛,迭代停止。由于在做泰勒展开时,要求xk+1−xk 足够小。因此,需要γ比较小才行,一般设置为 0~1 的小数。
顺带提一下,Gradient Descent 是一种一阶优化方法,为什么这么说呢?因为它在迭代过程中不需要二阶及以上的信息。如果我们在泰勒展开时,不是一阶展开,而是二阶展开。那对应的方法就是另一个被大家所熟知的可微方程求解方法:Newton Method,关于牛顿法的详细内容,我们会在后续文章介绍。
Boosting: Gradient Descent in functional space
Boosting一般作为一种模型组合方式存在,这也是它在 GBDT 中的作用。那Boosting 与 gradient descent 有什么关系呢?上一节我们说到 gradient descent 是一种确定可微方程的求解方法。这里的可微有一个要求,就是说上文中的损失函数 f 针对模型 x 直接可微。因此模型x可以根据梯度迭代直接求解。而这种损失函数针对模型直接可微是一个很强的假设,不是所有的模型都满足,比如说决策树模型。现在我们回到第一节,将f(x)写的更具体一点:
f(x)=l(h(x,D),Y)
其中D 为数据特征;Y 为数据 label;h 为模型函数,解决由 D->Y 的映射,x为模型函数参数,即通常我们说的模型;l 为目标函数或损失函数。
以逻辑回归为例, x为权重向量, h模型函数展开为:
在这里插入图片描述

目标函数l展开为:
在这里插入图片描述

我们发现函数1对h可微,同时h对x可微,因此l对x可微。因此,我们可以通过 gradient descent的方式对x进行直接求解,而不用将h保存下来。然而,如果l对h可微,但h对x不可微呢?我们仍按照第一节的方法先对l进行泰勒展开,只不过不是针对x,而是对 h。为了简单起见,我们省略D,Y。
在这里插入图片描述

其中:
在这里插入图片描述

按照第一节的逻辑,我们不难得出如下迭代公式:
在这里插入图片描述

但别忘了,我们的目的不是求 h,而是 x。由于 h 对 x 不可微,所以 x 必须根据数据重新学习得到。而此时我们重新学习 x 的目标已经不是源目标 Y,而是原损失函数 l 在当前 H 处的梯度,即:

在这里插入图片描述

这个重新学习x的过程正是每个base weak learner所做的事情。而这种通过weak learner 拟合每一步迭代后的梯度,进而实现weak learner组合的方式,就是Boosting。又由于我们在求导过程中,损失函数l没法对模型x直接求导,而只能对模型函数h求导。因此 Boosting又有一个别名:“函数空间梯度下降“。
此外,你可能会听过boosting的可加性(additive)。这里顺便提一句,可加性指的是 h 的可加,而不是x的可加。比如x是决策树,那两棵决策树本身怎么加在一起呢?你顶多把他们并排放在一起。可加的只是样本根据决策树模型得到的预测值 h(x,D)罢了。
Decision Tree: the based weak learner
Boosting 的本质就是使用每个weak learner来拟合截止到当前的梯度。则这里的D,还是原来数据中的D,而Y已经不是原来的Y了。而GBDT 中的这个weak learner 就是一棵分类回归树(CART)。因此我们可以使用决策树直接拟合梯度:∇l(H(xt))。此时我们要求的x就变成了这样一棵有k个叶子节点的、使得如下目标函数最小化的决策树:
在这里插入图片描述

其中T为目标∇l(H(xt)),W为每个叶子节点的权重,L为叶子节点集合。容易求得每个叶子节点的权重为归属到当前叶子节点的样本均值。即 :

在这里插入图片描述

每个样本的预测值即为其所归属的叶子节点的权重,即h(xt+1)

十三,gbdt推导和适用场景

参考回答:
1)明确损失函数是误差最小
在这里插入图片描述

2)构建第一棵回归树
在这里插入图片描述

3)学习多棵回归树
面试问题决策树合集_第16张图片

迭代:计算梯度/残差gm(如果是均方误差为损失函数即为残差)
步长/缩放因子p,用 a single Newton-Raphson step 去近似求解下降方向步长,通常的实现中 Step3 被省略,采用 shrinkage 的策略通过参数设置步长,避免过拟合:第m棵树fm=pgm;模型Fm=Fm-1+pgm
4)F(x)等于所有树结果累加
在这里插入图片描述

适用场景:GBDT几乎可用于所有回归问题(线性/非线性),GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。

十四,说一下gbdt的全部算法过程

参考回答:
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种用于回归的机器学习算法,该算法由多棵回归决策树组成,所有树的结论累加起来做最终答案。当把目标函数做变换后,该算法亦可用于分类或排序。
1)明确损失函数是误差最小
在这里插入图片描述

2)构建第一棵回归树
在这里插入图片描述

3)学习多棵回归树
面试问题决策树合集_第17张图片

迭代:计算梯度/残差gm(如果是均方误差为损失函数即为残差)
步长/缩放因子p,用 a single Newton-Raphson step 去近似求解下降方向步长,通常的实现中 Step3 被省略,采用 shrinkage 的策略通过参数设置步长,避免过拟合
第m棵树fm=pgm
模型Fm=Fm-1+p
gm
4)F(x)等于所有树结果累加
在这里插入图片描述

rf和gbdt基分类器区别,里面的决策树分别长啥样,怎么剪枝?
参考回答:
GBDT和RF都是集成方法中的经典模型,我们需要弄清楚下面几个问题:1)GBDT是采用boosing方法,RF采用的是baggging方法;2)bias和variance是解释模型泛化性能的,其实还有噪声。
然后,理解GBDT和RF执行原理,其中GBDT中的核心是通过用分类器(如CART、RF)拟合损失函数梯度,而损失函数的定义就决定了在子区域内各个步长,其中就是期望输出与分类器预测输出的查,即bias;而RF的核心就是自采样(样本随机)和属性随机(所有样本中随机选择K个子样本选择最优属性来划分),样本数相同下的不同训练集产生的各个分类器,即数据的扰动导致模型学习性能的变化,即variance。
Gradient boosting Decision Tree(GBDT)
GB算法中最典型的基学习器是决策树,尤其是CART,正如名字的含义,GBDT是GB和DT的结合。要注意的是这里的决策树是回归树,GBDT中的决策树是个弱模型,深度较小一般不会超过5,叶子节点的数量也不会超过10,对于生成的每棵决策树乘上比较小的缩减系数(学习率<0.1),有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。
Random Forest:
bagging (你懂得,原本叫Bootstrap aggregating),bagging 的关键是重复的对经过bootstrapped采样来的观测集子集进行拟合。然后求平均。。。一个bagged tree充分利用近2/3的样本集。。。所以就有了OOB预估(outof bag estimation)
GBDT和随机森林的相同点:
1)都是由多棵树组成;2)最终的结果都是由多棵树一起决定
GBDT和随机森林的不同点:
1)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成;
2)组成随机森林的树可以并行生成;而GBDT只能是串行生成;
3)对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来;
4)随机森林对异常值不敏感,GBDT对异常值非常敏感;
5)随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成;
6)随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能。
RF决策树:
学习随机森林模型前,一定要先了解决策树模型。树越深,模型越复杂。
决策树模型的优点如下。1)容易理解和解释,树可以被可视化。2)不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作。3)隐含地创造了多个联合特征,并能够解决非线性问题。
GBDT决策树:
迭代决策树GBDT(Gradient Boosting Decision Tree)也被称为是MART(Multiple Additive Regression Tree))或者是GBRT(Gradient Boosting Regression Tree),也是一种基于集成思想的决策树模型,但是它和Random Forest有着本质上的区别。不得不提的是,GBDT是目前竞赛中最为常用的一种机器学习算法,因为它不仅可以适用于多种场景,更难能可贵的是,GBDT有着出众的准确率。
树的剪枝:
(1)前剪枝( Pre-Pruning)
通过提前停止树的构造来对决策树进行剪枝,一旦停止该节点下树的继续构造,该节点就成了叶节点。一般树的前剪枝原则有:a.节点达到完全纯度;b.树的深度达到用户所要的深度;c.节点中样本个数少于用户指定个数;d.不纯度指标下降的最大幅度小于用户指定的幅度。
(2)后剪枝( Post-Pruning)
首先构造完整的决策树,允许决策树过度拟合训练数据,然后对那些置信度不够的结点的子树用叶结点来替代。CART 采用Cost-Complexity Pruning(代价-复杂度剪枝法),代价(cost) :主要指样本错分率;复杂度(complexity) :主要指树t的叶节点数,(Breiman…)定义树t的代价复杂度(cost-complexity):信息熵H(X),信息增益=H(D)-H(Y|X),信息增益率=gain(x)/H(x),Gini系数=1-sum(pk2),基尼系数就是熵在x=1的地方一阶泰勒展开得到f(x)=1-x,所以gini=sum[x(1-x)]=1-sum(x2)。

随机森林和 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是通过减少模型偏差提高性能。

十五,stacking和blending的区别?

参考回答:
Stacking和blending的区别在于数据的划分,blending用不相交的数据训练不同的基模型,并将其输出取加权平均。而stacking是将数据集划分为两个不相交的集合,在第一个集合的数据集中训练多个模型,在第二个数据集中测试这些模型,将预测结果作为输入,将正确的标签作为输出,再训练一个高层的模型。

面经问题汇总:
1. lightgbm、GBDT、xgb区别和适用场景,XGB残差怎么用一次和二次梯度求,分裂点怎么求,思想原理是什么。XGB实际使用中重要的超参数,为什么lightgbm速度更快,其并行计算如何实现
2.bagging,boosting 的区别,谁是更关注方差 ,谁是更关注偏差及不同情况下的选用
3.bagging 中随机有放回采样,假如一共有N个样本 采样了N次,得到N个采样数据,去重后有X个数据 求E(X)
4. xgboost原理,怎么防过拟合 ?
5. gbdt推导/全部算法过程
6. xgb,rf,lr优缺点场景
7. rf和gbdt基分类器区别,里面的决策树分别长啥样,怎么剪枝
8. LR、SVM、决策树 的区别(从模型复杂度,激活函数等方面来阐述)
11. GBDT和随机森林的比较(GBDT是指梯度提升树)

附加:

1.什么是xgboost?

2.什么是GBDT?

3.什么是RF?

4.什么是AdaBoost?

5.分类树和回归树的区别是什么?

不同点1:
  分类树主要用于将数据集分类到响应变量所对应的不同类别里,通常响应变量对应两类0或1。如果目标变量对应了2个以上的类别,则需要使用分类树的一个扩展版C4.5。然而对于一个二分类问题,常常使用标准的CART算法。不难看出分类树主要用于响应变量自然对应分类的情况。
回归树主要用于响应变量是数值的或者连续的,例如预测商品的价格,其适用于预测一些非分类的问题。
【注意:预测源或者说自变量也可能是分类的或者数值的,但决策树的选择只和目标变量的类型有关】
不同点2:
  标准分类树的思想是根据数据的相似性(homogeneity)来进行数据的分类。对于标准的非纯度计算,一般会基于一个可计算的模型,比如entropy 或者Gini index通常用来量化分类树的均匀性。
用于回归树里的目标变量是连续的,我们通常用自变量拟合一个回归模型。然后对于每个自变量,数据被几个分割点分离。在每个分割点,最小化预测值和真实值的误差和 (SSE)得到回归模型的分类方法。

6.XGBoost的参数调优有哪些经验(工具)

1.选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使交叉验证,并返回理想的决策树数量。
2.对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。
3.xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
4.降低学习率,确定理想参数。

7.XGBoost的正则化是如何实现的(工具)

Xgboost的正则化利用了树的复杂度来实现的,xgboost对树的复杂度包含了两个部分:

  1. 一个是树里面叶子节点的个数T
  2. 一个是树上叶子节点的得分w的L2模平方(对w进行L2正则化,相当于针对每个叶结点的得分增加L2平滑,目的是为了避免过拟合)

面试问题决策树合集_第18张图片

8,随机森林如何填充缺失值?

1.暴力填补
Python中的na.roughfix包提供简单的缺失值填补策略:
对于训练集中处于同一个类别下的数据,如果是类别变量缺失,则用众数补全,如果是连续变量,则用中位数。
2.相似度矩阵填补
RF的Python实现中,有一个rfImpute包,可以提供更加高层的缺失值填补。
1.首先先用暴力填补法进行粗粒度填充。
2.然后使用上述填补后的训练集来训练随机森林模型,并统计相似度矩阵(proximity matrix),然后再看之前缺失值的地方,如果是分类变量,则用没有缺失的观测实例的相似度中的权重进行投票;如果是连续性变量,则用相似度矩阵进行加权求均值。
3.上述投票方案迭代进行4~6次。

9,解释相似度矩阵:

相似度矩阵就是任意两个观测实例间的相似度矩阵,原理是如果两个观测实例落在同一棵树的相同节点次数越多,则这两个观测实例的相似度越高。
详细来说:
Proximity 用来衡量两个样本之间的相似性。原理就是如果两个样本落在树的同一个叶子节点的次数越多,则这两个样本的相似度越高。当一棵树生成后,让数据集通过这棵树,落在同一个叶子节点的”样本对(xi,xj)” proximity 值 P(i,j) 加 1 。所有的树生成之后,利用树的数量来归一化 proximity matrix。继而,我们得到缺失值所在样本的权重值,权重值相近的可以用于缺失值的填补参考。

10,说一下Adaboost及权值更新公式

Adaboost算法,全称 Adaptive Boosting 自适应增强,前一个基分类器分错的样本权值会得到增强,分对的权值减弱,得到样本点的新权值分布,并用于下一次迭代。算法简单来说分为3步:
1.初始化训练数据的权值分布;
2.训练若分类器;
3.将步骤2中得到的弱分类器组合。

在每轮训练中,在每个属性上根据分割的阈值不同得到多个单层分类器,在这些分类器中选取一个带权误差率最小的单层分类器作为该轮训练的弱分类器。
一般只进行一次判定,可以包含两个或者多个叶结点,可以选择属性的一个阈值做为分割点进行判定,大于该阈值分配到一类,小于该阈值分配到另一类;当然也可以选取多个阈值并由此得到多个叶结点。
注:其实统计学习与方法中说的很详细
有关boost的boost tree以及XGBoost的详细解释,请参考:
https://blog.csdn.net/v_JULY_v/article/details/81410574

1.理解kaggle比赛大杀器xgboost
https://blog.csdn.net/v_JULY_v/article/details/81410574
2. GBDT、XGBoost、LightGBM的区别和联系
https://www.jianshu.com/p/765efe2b951a
3.gging与boosting两种集成模型的偏差bias以及方差variance 的理解
https://blog.csdn.net/shenxiaoming77/article/details/53894973
4. 提升树(boosting tree)算法的思想
https://mp.weixin.qq.com/s/1gPaXLqqF8vYa3mbUBo9Cg
或者还可以参见统计学习与方法《第二版》的资料;
7和8:xgboost为什么用泰勒展开(或者相对于GBDT的一阶泰勒展开式,xgboost的优势在哪?)?是有放回选特征吗?
第一个回答:
因为这样做使得我们可以很清楚地理解整个目标是什么,并且一步一步推导出如何进行树的学习。这一个抽象的形式对于实现机器学习工具也是非常有帮助的。传统的GBDT可能大家可以理解如优化平法残差,但是这样一个形式包含可所有可以求导的目标函数。也就是说有了这个形式,我们写出来的代码可以用来求解包括回归,分类和排序的各种问题,正式的推导可以使得机器学习的工具更加一般。
简答说一说吧:实际上使用二阶泰勒展开是为了xgboost能够【自定义loss function】,如果按照最小二乘法的损失函数直接推导,同样能够得到陈佬最终的推导式子:
在这里插入图片描述

二阶泰勒展开实际约等于最小二乘法,平方损失函数的二阶泰勒展开=最小二乘法。但陈佬为何想用二阶泰勒展开呢,我猜是为了xgboost库的可扩展性,因为任何损失函数只要二阶可导即能【复用】陈佬所做的关于最小二乘法的任何推导。而且泰勒的本质是尽量去模仿一个函数,我猜二阶泰勒展开已经足以近似大量损失函数了,典型的还有基于分类的对数似然损失函数。嘿,这样同一套代码就能完成回归或者分类了,而不是每次都推导一番,重写训练代码。
第二个回答:
面试问题决策树合集_第19张图片

因为,在最小化object function ,也就是求解最优叶子权重W_j的时候,此object function就变成了,简单的关于(每个)叶子权重的一元二次方程。这样是不是很简单。
有人问:那用一阶导数不是一元一次方程, 更简单么?
回答:不对啊,这是找最值,二次公式的最值点在顶点,一次公式不限定定义域就没有最值了啊,这样就没办法继续下去了;
注:其实和gbdt的一阶梯度比起来,本质上和梯度下降法和牛顿法的差异是类似的。梯度下降按最快速度下降,牛顿法不仅有速度信息(一阶),还有加速度信息(二阶) ;
8.XGBoost如何寻找最优特征?是有放回还是无放回的呢?
XGBoost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性。XGBoost利用梯度优化模型算法, 样本是不放回的,想象一个样本连续重复抽出,梯度来回踏步,这显然不利于收敛。
XGBoost支持子采样, 也就是每轮计算可以不使用全部样本。

请问GBDT和XGBoost的区别是什么?

1 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
2 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
3 xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。(关于这个点,接下来详细解释)
4 Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
5 列抽样(column subsampling)即特征抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
6 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
7 xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。
我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
8可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

补充:

问题:xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?

回答:
一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;**Bagging主要关注降低方差,**因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X2)-[E(X)]2)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。这个有点儿绕,不过你一定知道过拟合。
如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以
模型过于复杂的时候会导致过拟合。

面试问题决策树合集_第20张图片

5、集成学习

5.1 Bagging
Bagging即套袋法,其算法过程如下:
1、从原始样本集中抽取训练集.每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中).共进行k轮抽取,得到k个训练集.(k个训练集相互独立)
2、每次使用一个训练集得到一个模型,k个训练集共得到k个模型.(注:根据具体问题采用不同的分类或回归方法,如决策树、神经网络等)
3、对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果.
5.2 Boosting
Boosting是一族可将弱学习器提升为强学习器的算法。关于Boosting的两个核心问题:
1、在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样本的权值,而误分的样本在后续受到更多的关注.
2、通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
5.3 Bagging和Boosting的方差-偏差分析
我们都知道,Bagging主要降低的是模型的方差,而Boosting主要减小的是模型的偏差,这是为什么呢?
这里我们主要引用参考文献13中的解释:
5.4 Stacking
stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。

   在stacking的模型训练阶段,二级模型的训练集是使用一级模型产生的,如果直接使用一级模型对初始的训练集样本进行预测来产生二级模型的训练集,这样会有极大的过拟合的风险,因此一般是用训练一级模型未使用的样本来产生二级模型的训练集,交叉验证方法是比较常用的方法。
   Stacking的二级模型的训练样本的shape应该是训练集长度 * 基分类器个数,因此对于每个一级模型来说的,通过下面的图示来产生部分该模型对应的部分,最后进行横向拼接:

而对于二级模型的测试集来说,由于每次交叉验证的过程中都要进行一次预测,假设我们是5折交叉验证,那么对于每个一级模型来说,得到的shape是测试集行数 * 交叉验证折数,此时的做法是,对axis=1方向取平均值,以得到测试集行数 * 1 的测试数据,最后将每个一级模型的结果进行横向拼接,得到二级模型的测试样本的shape是测试集行数 * 基分类器个数,可以跟训练集保持一致:

RF、GBDT、xgboost相关面试题:

RF、GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性。
  根据个体学习器的生成方式,目前的集成学习方法大致分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)。

1、RF的原理是什么?

提到随机森林,就不得不提Bagging,Bagging可以简单的理解为:放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。
  Random Forest(随机森林)是Bagging的扩展变体,它在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,因此可以概括RF包括四个部分:1、随机选择样本(放回抽样);2、随机选择特征;3、构建决策树;4、随机森林投票(平均)。
  随机选择样本和Bagging相同,随机选择特征是指在树的构建中,会从样本集的特征集合中随机选择部分特征,然后再从这个子集中选择最优的属性用于划分,这种随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随机森林的‘平均’特性,会使得它的方差减小,而且方差的减小补偿了偏差的增大,因此总体(高偏差低方差)而言是更好的模型。
  在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。
  RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。
RF和Bagging对比:
RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。
1.2 RF的优缺点
  随机森林的优点较多,简单总结:1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;3、容易做成并行化方法。
  RF的缺点:在噪声较大的分类或者回归问题上回过拟合。

2、GBDT

提GBDT之前,谈一下Boosting,Boosting是一种与Bagging很类似的技术。不论是Boosting还是Bagging,所使用的多个分类器类型都是一致的。但是在前者当中,不同的分类器是通过串行训练而获得的,每个新分类器都根据已训练的分类器的性能来进行训练。Boosting是通过关注被已有分类器错分的那些数据来获得新的分类器。
  由于Boosting分类的结果是基于所有分类器的加权求和结果的,因此Boosting与Bagging不太一样,Bagging中的分类器权值是一样的,而Boosting中的分类器权重并不相等,每个权重代表对应的分类器在上一轮迭代中的成功度。
2.1 GBDT的原理是什么?
  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区别(貌似这个问题也都被问烂了)
1)传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
2)传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
3)XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
4)shrinkage(缩减),(权重衰减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(传统的GBDT也有学习速率);
5)列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;
6)XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

RF(随机森林)与GBDT之间的区别

相同点:
1)都是由多棵树组成的
2)最终的结果都是由多棵树一起决定
不同点:
1) 组成随机森林的树可以是分类树也可以是回归树,而GBDT只由回归树组成;
2) 组成随机森林的树可是并行生成,而GBDT只能是串行生成
3) 随机森林的结果是多棵树表决决定,而GBDT则是多棵树累加之和
4) 随机森林对异常值不敏感,而GBDT对异常值比较敏感
5) 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能
6) 随机森林不需要进行数据预处理、归一化,而GBDT需要进行归一化
GBDT怎样设置单颗树的停止生长条件?
1) 节点分裂时的最小样本数(也就是能分类的节点的最小样本数)
2) 树的最大深度DEPTH
3) 最多叶子节点数(单棵树的叶子节点达到最大值停止)
4) Loss满足约束条件(损失函数基本不会下降)

GBDT如何评估特征值的权重大小?

1) 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值。
2) 借鉴投票机制。用相同的GBDT参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值
GBDT当增加样本数量时,训练时长是线性增加吗?
不是的,因为生成单棵决策树时,对于损失函数极小值与样本数量N不是线性相关的

当增加树的棵数时,训练时长是线性增加吗?
不是的,因为每棵树的生成时间复杂度O(N)不同

当增加一棵树叶子节点数目时,训练时长是线性增加吗?
不是的,叶子节点数和每棵树的生成之间复杂度O(N)不成正比
每个节点上都保存什么信息?
中间节点保存某个特征的分割值,叶节点保存预测是某个类别的概率w

Xgboost中如何防止过拟合?

1)增加样本,移除噪声
2)减少特征,保留一些重要的特征
3)对样本进行采样,就是在构建树的时候,不是把所有的样本都作为输入,而是选择一部分数据作为子集
4)对特征进行采样化,和对样本采样基本一致,就是在每次建树的时候只对部分的特征进行切分
GBDT中哪些部分可以并行?
1)计算每个样本的负梯度时
2)分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
3)更新每个样本的负梯度时
4)最后预测的过程当中,每个样本将之前的所有树的结果累加的时候
树生成畸形树,会带来哪些危害,如何预防?
在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚。

相对于GBDT来讲, xgboost在实现时还做了许多优化?

1)在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
2)xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。对于缺失值,xgboost可以自动分裂出它的方向。
4)特征列排序后以块(block)的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
5)按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
6) xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

xgboost是用二阶泰勒展开的优势在哪?

相比GBDT的一阶泰勒展开,xgboost二阶优势在哪?

引用陈佬的话:
因为这样做使得我们可以很清楚地理解整个目标是什么,并且一步一步推导出如何进行树的学习。这一个抽象的形式对于实现机器学习工具也是非常有帮助的。传统的GBDT可能大家可以理解如优化平方残差,但是这样一个形式包含可所有可以求导的目标函数(也就是损失函数的负梯度==残差(两数相减))。也就是说有了这个形式,我们写出来的代码可以用来求解包括回归,分类和排序的各种问题,正式的推导可以使得机器学习的工具更加一般。(因为分类和回归都有指定的损失函数)
简答说一说吧:实际上使用二阶泰勒展开是为了xgboost能够【自定义loss function】,如果按照最小二乘法的损失函数直接推导,同样能够得到陈佬最终的推导式子:

二阶泰勒展开实际不是 最小二乘法,平方损失函数的二阶泰勒展开=最小二乘法。但陈佬为何想用二阶泰勒展开呢,我猜是为了xgboost库的可扩展性,因为任何损失函数只要二阶可导即能【复用】陈佬所做的关于最小二乘法的任何推导。而且泰勒的本质是尽量去模仿一个函数,我猜二阶泰勒展开已经足以近似大量损失函数了,典型的还有基于分类的对数似然损失函数。所以,这样同一套代码就能完成回归或者分类了,而不是每次都推导一番,重写训练代码。
回答二:

因为,在最小化目标函数(也就是损失函数) ,也就是求解最优叶子权重W_j的时候,此目标函数就变成了简单的关于(每个)叶子权重w的一元二次方程,这样可以直接求解出来,非常简单。

你可能感兴趣的:(算法,python,面试,决策树,机器学习)