天天看点

GBDT与XGBoost学习体会GBDT

GBDT

GBDT = 梯度下降 + Boosting + 决策树

提升树与梯度提升树区别:提升树采用残差,而GBDT去拟合负当前模型损失函数的负梯度(当损失函数为均方误差的时候,就相当于残差,一般的损失函数优化复杂使用负梯度来近似残差)

经典的AdaBoost算法只能处理采用指数损失函数的二分类学习任务

而梯度提升方法通过设置不同的可微损失函数可以处理各类学习任务(多分类、回归、Ranking等),应用范围大大扩展。另一方面,AdaBoost算法对异常点(outlier)比较敏感,而梯度提升算法通过引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性

GBDT流程

1.初始化残差,构成弱学习器1。(预测特征所对应得特征值求平均值)2.计算残差(实际值 - 弱学习器1)。3.寻找回归树的最佳划分点(阈值)。遍历每个特征的每个特征值作为阈值,通过阈值将数据二分,分别计算方差,找到使方差最小的特征值为最佳二分阈值4.将二分后的残差值更新为实际值,计算实际值平均值 作为残差。构成弱学习器2。5.合并强学习器。(弱学习器1 + 弱学习器2)

GBDT总结:

GBDT全称是梯度提升决策树,是监督学习中,一种常见的集成树模型,可以用于处理分类和回归问题。其中,梯度提升(Grandient Boosting)是Boosting家族中的一种优化算法,决策树使用的是CART回归树作为GBDT的基学习器

梯度提升在每一轮迭代时,我们生成一个基学习器,基学习器的拟合目标是当前模型Loss的负梯度。当训练完成后,我们将该基学习器加入至模型。重复上述,继续训练基学习器,直至迭代次数达到目标。

局限性1.在高维稀疏的数据集上,表现不如支持向量机或者神经网络2.在处理文本分类特征问题上的优势不如在数值上明显3.训练需要串行训练,只能在决策树局部采用一些局部并行的手段提高训练速度

GBDT如何选择特征?遍历每个特征,然后对每个特征遍历它所有可能的切分点,找到最优特征m的最优切分点j

面试问题参考链接:https://blog.csdn.net/tinkle181129/article/details/79681702

XGBoost

目标函数=损失函数+正则项

损失函数的构建基于boosting的思想,基于前一颗树去学习后一棵树。找一棵树使目标函数值最小。

定义树的复杂度:树可以有若干个叶子节点来表达,构建一颗树也是为了找到每个节点的区域以及叶子节点的值。利用正则项(正则化项与树的叶子节点的数量T和叶子节点的值有关)对叶子节点进行惩罚,控制模型的复杂度。

分裂节点:贪心法和近似算法

GBDT和XGboost模型比较

GBDT的优势:

  • 精度高
  • 能处理非线性数据
  • 适合低维稠密数据
  • 模型可解释性好
  • 不需要做特征的归一化,可以自动选择特征
  • 能适应多种损失函数

GBDT的劣势:

  • 不太适合并发执行
  • 计算复杂度高
  • 不适用高维稀疏特征

xgboost的优势:

  • 把树模型复杂度作为正则项加到优化目标中。
  • 公式推导中用到了二阶导数,用了二阶泰勒展开。
  • 实现了分裂点寻找近似算法。
  • 可以并行执行boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

gbdt的参数:boosting框架型参数以及catr树的参数

框架型参数:弱学习器的最大个数,学习率步长,无放回的采样比率

弱分类器参数:决策树最大深度,内部节点所需最小样本数,最大叶子节点数等

xgboost的taylor二阶导展开能够加快收敛速度

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。正则项降低了模型的复杂度,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

继续阅读