GBDT和XGBoost面试总结

更新时间:2023-05-20 09:32:26 阅读: 评论:0

GBDT和XGBoost⾯试总结
xgboost和随机森林的区别:meibi
XGB和随机森林
1)随机森林采⽤的bagging思想,⽽xgboost采⽤的boosting思想。Bagging的训练集的选择是随机的,各训练集之间相互独⽴,弱分类器可并⾏,⽽Boosting的训练集的选择与前⼀轮的学习结果有关,是串⾏的。corporation
2)组成随机森林的树可以并⾏⽣成;⽽xgboost只能是串⾏⽣成树。
3)对于最终的输出结果⽽⾔,随机森林采⽤多数投票等;⽽xgboost则是将所有结果累加起来,或者加权累加起来。
4)随机森林是通过减少模型⽅差提⾼性能;xgboost是通过减少模型偏差提⾼性能。
GBDT
1、GBDT训练过程如何选择特征?
GBDT使⽤基学习器是CART树,CART树是⼆叉树,每次使⽤yes or no进⾏特征选择,数值连续特征使⽤的最⼩均⽅误差,离散值使⽤的gini指数(找gini指数少的特征以及特征值进⾏分裂)。在每次划分特征的时候会遍历所有可能的划分点找到最佳的特征分裂点,这是⽤为什么gbdt会⽐rf慢的主要原因之⼀。
2、GBDT如何防⽌过拟合?由于gbdt是前向加法模型,前⾯的树往往起到决定性的作⽤,如何改进这个问题?
sporting hou⼀般使⽤缩减因⼦对每棵树进⾏降权,可以使⽤带有dropout的GBDT算法,dart树,随机丢弃⽣成的决策树,然后再从剩下的决策树集中迭代优化提升树。
GBDT与Boosting区别较⼤,它的每⼀次计算都是为了减少上⼀次的残差,⽽为了消除残差,可以在残差减⼩的梯度⽅向上建⽴模型;
surpri是什么意思在GradientBoost中,每个新的模型的建⽴在残损函数的负梯度(也就是残差)上。
3、GBDT对标量特征要不要one-hot编码?
从效果的⾓度来讲,使⽤category特征和one-hot是等价的,所不同的是category特征的feature空间更⼩。微软在lightGBM的⽂档⾥也说了,category特征可以直接输⼊,不需要one-hot编码,准确度差不
多,速度快8倍。⽽sklearn的tree⽅法在接⼝上不⽀持category输⼊,所以只能⽤one-hot编码。
4、为什么GBDT⽤负梯度当做残差?(如果下⼀颗树拟合的是残差,那么损失函数⼀般要均⽅损失)
(1)负梯度⽅向可证,往这个⽅向优化模型⼀定会收敛。
(2)如果想⽤残差为负梯度,这⾥损失函数⼀般要⽤均⽅损失,但是并不是所有的问题都可以⽤均⽅损失,如分类问题就不可以。XGBoost
1、xgboost核⼼思想
XGBoost 是集成学习的⼀种算法,在⼤多数的回归和分类问题上表现出⾊,它串⾏⽣成⼀系列回归树,每颗回归树都是拟合上⼀棵树与⽬标值的残差,这样重复进⾏, 直到达到事先设定树的个数或者收敛。
2、每颗树都是拟合上⼀次的残差,这个残差是什么?怎么算的?
cadeau我们可以这么理解,对于GBDT来说,损失函数⼀般是均⽅损失,这个残差其实是模型优化的⽅向也就是负梯度。这也就是残差和模型的⽬标函数之间的关系,往这个⽅向优化模型⼀定会收敛。可以理解为GBDT在函数空间中利⽤梯度下降法进⾏优化。
但是对于XGB来说,相对于GBDT的⼀阶泰勒展开,XGBoost采⽤⼆阶泰勒展开,可以更为精准的逼近真实的损失函数,可以理解为XGBoost在函数空间中⽤⽜顿法进⾏优化。最终的⽬标函数只依赖于每个数据点在误差函数上的⼀阶导数和⼆阶导数。
2.1 xgboost的⽬标函数和残差之间的关系是什么?
简单来说,⽬标函数中的损失函数的⼀阶倒数为残差。
xgboost的⽬标是为了让 前⾯拟合的模型+下⼀颗树之后的预测值—>真实值。因此⽬标函数即为损失函数(降低偏差)+正则项(降低⽅差,避免过拟合),并且希望值最⼩。我们所要求的其实就是每
⼀步损失函数的⼀阶导和⼆阶导的值,就可以然后最优化⽬标函数,从⽽最后根据加法模型得到⼀个整体模型。
3、每个树的叶⼦节点的权重是怎么得到的?
叶⼦节点的权重为⽬标函数最⼩的时候,对应的权重值。
xgboost的⽬标函数⽐较好理解的是下图:
其中:
XGBoost⽬标函数最终推导形式如下:
利⽤⼀元⼆次函数求最值的知识,当⽬标函数达到最⼩值Obj时,每个叶⼦结点的权重为wj。英语译汉语
具体公式如下:
xgboost是根据⼀阶导数gi 和⼆阶导数 hi
4、xgboost是如何分裂的?如何选择最佳分裂点?(选择哪个进⾏特征的分裂?以及选取好的特征如果划分左⼦树右⼦树?)
XGBoost分裂原则是有⼀套⾃⼰的增益gain的。(见上述图的最后⼀⾏)
Gj :叶⼦结点 j 所包含样本的⼀阶偏导数累加之和,是⼀个常量;
Hj :叶⼦结点 j 所包含样本的⼆阶偏导数累加之和,是⼀个常量;
流程总结如下:
同学用英语怎么说
(1)预先将特征按照特征值进⾏排序;
scc是什么(2)采⽤特征并⾏的⽅法分别计算每个特征的最佳分割点;
(3)在所有特征中找到最好的分裂点(根据每次分裂后产⽣的增益,最终选择增益最⼤的那个特征以及特征值作为最佳分裂点)
如果在计算每个特征的最佳分割点时,对每个样本都进⾏遍历,计算复杂度会很⼤,这种全局扫描的⽅法并不适⽤⼤数据的场景。
xgboost还有⼀些数据预排序、特征重要性排序、近似排序等⽅式提⾼训练速度。
5、如何停⽌树的循环⽣成
简⾔之,设置树的最⼤深度、当样本权重和⼩于设定阈值时停⽌⽣长以防⽌过拟合。新品上市英文
6、GBDT和XGB的区别总结:
(1)基分类器的选择: 传统GBDT以CART作为基分类器,XGBoost还⽀持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)。
(2)梯度信息: 传统GBDT只引⼊了⼀阶导数信息,Xgboost引⼊了⼀阶导数和⼆阶导数信息,其对⽬标函数引⼊了⼆阶近似,求得解析解, ⽤解析解作为Gain来建⽴决策树, 使得⽬标函数最优(Gain求到的是解析解)。另外,XGBoost⼯具⽀持⾃定义损失函数,只要函数可⼀阶和⼆阶求导。
(3)正则项: Xgboost引⼊了正则项部分,这是传统GBDT中没有的。加⼊正则项可以控制模型的复杂度,防⽌过拟合。
(4)特征采样: Xgboost引⼊了特征⼦采样,既可以降低过拟合,也可以减少计算。(按照我的理解,Xgboost和GBDT⼀样采样是是不放回的,⽽随机森林的采样是有放回的采样。)
(5)节点分裂⽅式:GBDT是⽤的基尼系数,XGBoost是经过优化推导后它⾃⼰⼀种计算增益的⽅式(⽹易问过)。xgboost分裂:假设某点要分裂,如何进⾏分裂?⾸先对n个特征f1…fn做排序,取所有特征中选取该特征达到最⼤增益的特征,⽤整个特征来分裂。
假设整个特征为f1,则选取这个特征f1,将所有数据按照f1排序,然后取⼀个阈值,阈值左边为分裂的左⼦树,阈值右边为分裂的右⼦树,使得整个分类的增益最⼤。
(6)并⾏化(如何进⾏分裂): 这⾥指的是xgboost在特征维度上的并⾏。传统GBDT由于树之间的强依赖关系是⽆法实现并⾏处理的,但是Xgboost⽀持并⾏处理,XGBoost的并⾏不是在模型上的并⾏,⽽是在特征上的并⾏,将特征列排序后以block的形式存储在内存中,在后⾯的迭代中重复使⽤这个结构。这个block也使得并⾏化成为了可能,其次在进⾏节点分裂时,计算每个特征的增益,最终选择增益最⼤的那个特征去做分割,那么各个特征的增益计算就可以开多线程进⾏。
(7)除此之外,Xgboost实现了分裂点寻找近似算法、缺失值处理、列抽样(降低过拟合,还能减少计算)等包括⼀些⼯程上的优化,LightGBM是Xgboost的更⾼效实现。
7、xgboost 如何评价特征重要性
我们采⽤三种⽅法来评判XGBoost模型中特征的重要程度:
weight :特征选择次数
gain :该特征在其出现过的所有树中产⽣的平均增益。
cover :该特征覆盖数据量
欢迎的英文
8、xgboost参数调优过程/训练过程:
实验过程调参过程
Step 1: 选择⼀组初始参数
Step 2: 改变 max_depth 和 min_child_weight. 改变树模型的复杂程度,分别为树的深度和节点权重和
Step 3: 调节 gamma 降低模型过拟合风险. gamma值相当于如果叶⼦节点进⾏⼀次分裂,⾄少达到什么标准,才能去分裂
Step 4: 调节 subsample 和 colsample_bytree 改变数据采样策略.
Step 5: 调节学习率 eta.相当于把新的树的百分之多少加到前⾯树模型中
9、你是⼿动调参? ⾃动调参⽤过没有?
⽹格搜索属于暴⼒搜索。不是贪⼼算法。
10、xgb如何处理缺失值的?
在逻辑实现上,为了保证完备性,会将该特征值缺失的样本分别分配到左叶⼦结点和右叶⼦结点,两种情形都计算⼀遍后,选择分裂后增益最⼤的那个⽅向(左分⽀或是右分⽀),作为预测时特征值缺失样本的默认分⽀⽅向。
如果在训练中没有缺失值⽽在预测中出现缺失,那么会⾃动将缺失值的划分⽅向放到右⼦结点。
11、xgboost防⽌过拟合的⽅法
⽬标函数加⼊正则项,叶⼦结点个数+叶⼦结点权值的l2正则化
列抽样,训练时只⽤⼀部分特征,(不考虑剩余的block块即可)
⼦采样,下采样 每轮计算可以不采⽤所有的样本,使得算法更保守
shrinkage ,可以叫做学习率或者步长,加⼊shrinkage的⽬的主要是为了避免过拟合。xgboost在进⾏完⼀次迭代后,会将叶⼦节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后⾯有更⼤的学习空间。为了给后⾯的训练留出更多的学习空间。shrinkage设置⼩⼀点也就很好理解了。设置⼩⼀点,也就是当前树的叶节点权重变⼩,削弱该颗数对最终模型的影响,然后通过多次迭代,多建树来得到最终的模型。设置过⼤会导致过拟合。过拟合表⽰模型变得复杂了。实际应⽤中,⼀般把学习率设置得⼩⼀点,然后迭代次数设置得⼤⼀点。
补充:业务题:one-hot编码的话,⽤什么⼆分类模型⽐较合适?你知道在什么情况下应该使⽤Onehot呢?”
“对于⽆序特征来说需要做onehot,实践中发现在线性模型中将连续值特征离散化成0/1型特征效果会更好(线性模型拟合连续特征能⼒弱,需要将连续特征离散化 成one hot形式提升模型的拟合能⼒)。所以对于稠密的类别型特征,可以对离散特征做⼀个OneHot变化,对于稀疏的离散特征采⽤onehot会导致维度爆炸以及变换后更加稀疏的特征,最好还是采⽤bin count或者embedding的⽅法去处理”
one-hot⽤在GBDT、XGBoost这些模型⾥⾯都挺好的,但是⽤在逻辑回归⾥不⾏。
因为逻辑回归要求变量间相互独⽴,如果你只有⼀个属性需要做one-hot编码还好,如果你有多个属性需要做one-ont编码,那么当某个样本的多个one-hot属性同时为1时,这两个属性就完全相关了。

本文发布于:2023-05-20 09:32:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/115641.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   模型   函数   分裂
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图