GBDT和XGB基本上是机器学习面试里面的必考题。最近面试了五十场面试,基本三分之二的面试官都问了关于GBDT和XGB的问题。
下面把里面常用的知识点、常见的面试题整理出来
首先来说集成学习
集成学习
c. 基分类器的错误,是偏差和方差之和
d. boosting方法通过逐步聚焦分类器分错的样本,减少集成分类器的偏差
-
可以方便地将样本权重正和岛训练过程中,不需要使用过采样的方法来调整样本券种 -
决策树的表达能力和繁华能力,可以通过调节树的层数来做折中 -
数据样本扰动对决策树影响较大,因此不同子样本集生成的基分类器随机性就较大。这样的不稳定学习器更适合作为基分类器。 -
插一句,神经网络也适合做基分类器
Adaboost
boosting的思想:
-
对分类正确的样本降低权重
-
对错误分类的样本升高或者保持全中不变
-
在模型融合过程中,根据错误率对基分类器器进行加权融合,错误率低的分类器拥有更大的“话语权”
GBDT
a. GBDT也称MART。基本的树:CART
b. 拟合函数:负梯度
c. 损失函数:
-
回归:直接用连续的值计算负梯度
-
均方差
-
绝对损失
-
huber损失
-
分位数损失
-
分类:指数(此时退化成为Adaboost)、对数
-
步长,v就是步长,空驶学习速度 ( )= −1( )+ ℎ ( ) -
自采样比例(subsample)无放回的抽样 -
正则化剪枝
-
预测阶段计算速度较快,树与树之间可以并行化计算 -
在分布稠密的数据机上,泛化能力和表达能力都比较好 -
具有较好的解释性和鲁棒性 -
能够自动发现特征质检的高阶关系 -
不需要做特殊预处理(比如归一化)
Xgboost
h. 分裂方式:
1. 分裂前后损失函数的差值为:
2. XGB通过最大化这个差值作为准则来进行决策树的构建。通过遍历所有特征的取值,寻找时的损失函数前后相差最大时的分裂方式
3. 一次求解出决策树最优的所有J个子节点区域、和每个子节点区域的最优解w
i. 效率优化:
-
包含了输的叶子节点个数、每个叶子节点输出分数的L2平方和 -
正则化项γ起到了一定的预剪枝的效果 -
xgboost采用预剪枝策略,只有分裂后的增益大于0才会进行分裂。
-
booster:CART、或者线性模型、或者DART -
n_estimator: -
objective:
-
分类:MSE -
分类:二分类用logistic、多分类用softma
-
max_depth:树的深度 -
min_child_weight:最小子节点的权重。如果某个子节点权重小于这个阈值,则不会在分裂。使用的是该节点所有二阶导数的和 -
gamma:分裂所带来的损失最小阈值,大于此值,才能继续分裂 -
subsample:子采样参数,无放回抽样 -
colsample_bytree 整棵树的特征采样比例 -
colsample_bylevel 某层的特征采样比例 -
colsample_bynode 某一个树节点的特征采样比例 -
reg_alpha:L1正则化参数 -
reg_lambda:L2正则化参数
对比
a. 作为GBDT的高效实现,XGBoost是一个上限特别高的算法,因此在算法竞赛中比较受欢迎。简单来说,对比原算法GBDT,XGBoost主要从下面三个方面做了优化:
1. 一是算法本身的优化:在算法的弱学习器模型选择上,对比GBDT只支持决策树,还可以直接很多其他的弱学习器。在算法的损失函数上,除了本身的损失,还加上了正则化部分。在算法的优化方式上,GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,更加准确。算法本身的优化是我们后面讨论的重点。
2. 二是算法运行效率的优化:对每个弱学习器,比如决策树建立的过程做并行选择,找到合适的子树分裂特征和特征值。在并行选择之前,先对所有的特征的值进行排序分组,方便前面说的并行选择。对分组的特征,选择合适的分组大小,使用CPU缓存进行读取加速。将各个分组保存到多个硬盘以提高IO速度。
3. 三是算法健壮性的优化:对于缺失值的特征,通过枚举所有缺失值在当前节点是进入左子树还是右子树来决定缺失值的处理方式。算法本身加入了L1和L2正则化项,可以防止过拟合,泛化能力更强。
b. 联系&区别(百面机器学习+知乎):
1. GBDT是机器学习算法;XGB是算法的工程实现
2. XGB使用CART做基分类器的时候,显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,提高泛化能力
-
正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。
3. GBDT在模型训练的时候只使用了一阶导数信息,XGB对代价函数进行了二姐泰勒展开,同时使用一阶、二阶导数信息。并且可以自定义代价函数,只要是二阶可导数的传统GBDT使用CART作为基分类器;
4. 传统GBDT使用CART作为基分类器;XGB支持多种类型的基分类器,如线性分类器
5. 缺失值:
-
传统GBDT没有专门针对缺失值进行处理;XGB能够自动学习出缺失值的处理策略:指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
-
忽略缺失值:在寻找splitpoint的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找splitpoint的时间开销
6. Shrinkage(缩减),相当于学习速率(xgboost中的eta)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;
7. 抽样
-
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
-
行抽样:传统GBDT在每轮迭代时使用全部的数据;XGB则采用了类似RF的策略,支持对数据进行采样
8. 并行化处理:
-
在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。
-
在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
c. 与其他模型对比
-
提升树可以较好地处理不在同一个区间的特征(年龄vs星期几vs比率);
-
可以更好地应对异常点;
-
更好处理特征质检的相关性;
-
处理非线性决策边界问题
2. VS RF:RF可以并行训练,比较不容易过拟合;提升树可以学习到更复杂的决策边界,效果更好
3. VS NN:NN vc维较多,训练比较困难;提升树在小数据集上效果会很好
d. from知乎
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)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;
5. 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
6. 忽略缺失值:在寻找splitpoint的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找splitpoint的时间开销
7. 指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
—完—
<pre style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><p style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;box-sizing: border-box !important;overflow-wrap: break-word !important;"></span></strong></span></strong></span></strong></p><section style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section><p style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;max-width: 100%;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(0, 0, 0);box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;font-size: 16px;font-family: 微软雅黑;caret-color: red;box-sizing: border-box !important;overflow-wrap: break-word !important;">为您推荐</span></strong></span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">MIT校长评中美科技竞赛:胜利不是期盼对手的失利</p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="font-size: 14px;">GitHub重大更新:在线开发上线,是时候卸载IDE了</span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="font-size: 14px;">美国官宣117000名 IT 人失业,真是史无前例!</span><br /></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">数据分析入门常用的23个牛逼Pandas代码</p><section style="margin: 5px 8px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">特朗普转推呼吁制裁微软,因微软、IBM、亚马逊先后停止向警方出售面部识别技术<br /></section></section></section></section></section></section></section></section></section>
本篇文章来源于: 深度学习这件小事
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈