概念索引:
BDT—提升树BDT也是Boosting思想,因此它也的遵守加法模型和前向算法:
先从BDT这个简单的做个引入讲解,它是使用的cart决策树作为基学习器的基层学习方法,又名提升树。
在这里插入图片描述
上图就是BDT的流程图,代表的就是说,有一份训练数据training samples,经过一个弱学习器1weak learning1,是不是会得到一个预测结果,然后这个预测结果是不是对比真实值是有误差的,然后和真实值作差,就会得到样本的残差sample residuals,然后训练第二个弱学习器的时候就可以使用这个残差作为弱学习器的训练数据,去训练第二个弱学习器,以此类推。
GBDT—利用损失函数的负梯度来拟合基学习器:
特点:可处理各种类型的数据;有着较高的准确率;对异常值的鲁棒性强;不能并行训练数据
XGBOOST—使用了二阶泰勒展开表示梯度,相当于GBDT的一种优化算法加入了正则项
GBDT算法的优缺点?
优点:
预测阶段的计算速度快,树与树之间可并行化计算(注意预测时可并行);
在分布稠密的数据集上,泛化能力和表达能力都很好;
采用决策树作为弱分类器使得GBDT模型具有:
(1)较好的解释性和鲁棒性;
(2)能够自动发现特征间的高阶关系;
(3)不需要对数据进行特殊的预处理,如归一化等。
缺点:
GBDT在高维稀疏的数据集上表现不佳;
训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。
XGBOOST算法的优缺点?
优点(区别):
精度更高: GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
灵活性更强: GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带 和 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
正则化: XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
缺失值处理: 对于特征的值有缺失的样本,XGBoost 采用的稀疏感知算法可以自动学习出它的分裂方向;
XGBoost工具支持并行: boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第 次迭代的代价函数里包含了前面 次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似算法: 树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost还提出了一种可并行的近似算法,用于高效地生成候选的分割点。
缺点:
1.预排序和近似算法在寻找最佳节点分裂时需要大量的计算
2.预排序过程的空间复杂度过高,占用过多内存
GBDT相关面试题型:
1.gbdt的残差为什么用负梯度代替?
· 负梯度永远是函数下降最快的方向,自然也是gbdt目标函数下降最快的方向,所以用梯度去拟合首先是没什么问题的(并不是拟合梯度,只是用梯度去拟合,发现好多人搞错);gbdt本来中的g代表gradient,本来就是用梯度拟合;
· 用残差去拟合,只是目标函数是均方误差的一种特殊情况,这个特殊情况跟CART拟合残差一模一样,使得看起来就拟合残差合情合理。
· 为啥要去用梯度拟合不用残差?代价函数除了loss还有正则项,正则中有参数和变量,很多情况下只拟合残差loss变小但是正则变大,代价函数不一定就小,这时候就要用梯度啦,梯度的本质也是一种方向导数,综合了各个方向(参数)的变化,选择了一个总是最优(下降最快)的方向;
· 最后目标函数可表达为由梯度构成,所以说成是拟合梯度,也好像不是不行
2.梯度提升和梯度下降的区别和联系是什么?
下表是梯度提升算法和梯度下降算法的对比情况。可以发现,两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。