GBDT与XGB的异同

原文链接: https://blog.csdn.net/wodemimashi125/article/details/82427198

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wodemimashi125/article/details/82427198
1、xgboost怎么给特征打分?如何解决缺失值问题?

1)在训练的过程中,通过gini指数选择分离点的特征,一个特征被选中的次数越多,评分越高。2)xgboost对缺失值有默认的处理方法,对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向,可以大大的提升算法的效率。

2、什么是OOB?随机森中OOB如何计算的?(为什么不用交叉验证?)

随机森林采用的bagging方法,其中有放回的采样过程,每次都有一定比例的数据没被选中,也就是说没有参加当前决策树的建立,把这部分数据成为袋外数据,可用来取代测试集做误差估计。所以在随机森林算法中,不需要再进行交叉验证或单独的测试集。

3、学习器结合的好处?

1)统计学角度,由于学习任务的假设空间往往很大,很多假设在训练集上表现的差不多,如果仅仅使用单个学习器,可能会导致泛化性能降低,而通过结合多个学习器,可以减小这一问题。2)计算角度看,单个学习器容易陷入局部最优,通过多次运行之后结合,可降低陷入局部最优的风险。

4、训练过程中,每轮训练一直存在分类错误的问题,整个Adaboost却能快速收敛,为何?

每轮训练结束后,AdaBoost框架会对样本的权重进行调整,该调整的结果是越到后面被错误分类的样本权重会越高。这样到后面,单个弱分类器为了达到较低的带权分类误差都会把样本权重高的样本分类正确。虽然单独来看,单个弱分类器仍会造成分类错误,但这些被错误分类的样本的权重都较低,在AdaBoost框架的最后输出时会被前面正确分类的高权重弱分类器“平衡”掉。这样造成的结果就是,虽然每个弱分类器可能都有分错的样本,然而整个AdaBoost框架却能保证对每个样本进行正确分类,从而实现快速收敛。

面试同样经常被问到,记录一下!

相同点:
(1)GBDT与XGB同属于boosting方法;

(2)XGB可以说是GBDT的高配版。

不同点:
(1).从基分类器来说,GBDT只能使用CART树,而XGB同时支持CART树和线性分类器,这个体现在python里就是

gbtree和dart是基于树的(后者引入了神经网络中的dropout),gblinear是线性分类器。

(2).gbdt在优化时只用到一阶导数,xgb则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,顺便,xgb支持自定义代价函数,只要函数一阶、二阶可导。

(3) .列抽样(column subsampling),xgb借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算。

(4).对于特征的值有缺失的样本,xgb可以自动学习出它的分裂方向。

(5).xgb支持并行(在特征粒度上并行(xgboost在训练之前,预先对数据进行排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量,这个block结构也使得在进行节点分裂时可以并行的需要计算每个特征的增益,最终选择增益最大的那个特征去做分裂)),树的生成还是串行的。

(6).可并行的近似直方图算法。树节点在进行分裂时,需要计算每个特征的每个分裂点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率会变得很低,所以xgb还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。(这个具体怎么实现搞不清楚,大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。)

(7).Shrinkage(缩减),相当于学习速率(xgb中的eta),xgb在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱各棵树的影响,让后面有更大的学习空间。(传统GBDT的实现也有学习速率),如下:

(8).显式地将树模型的复杂度(节点的个数+节点输出的平方)作为正则项加在优化目标。正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性。

你可能感兴趣的:(算法学习)