GBDT总结

GBDT三要素

GBDT算法思路是希望把多个弱模型进行一个聚合,变成一个更强大的模型,通过多个弱模型的预测结果更好的拟合数据。

在GBDT算法主要有三个要素对应上面的思路:决策树模型BOOSTING梯度提升。分别对应上面提到的弱模型选用的就是决策树模型、Boosting就是怎么组合弱模型,梯度提升是为了具体实现Boosting的手段。

决策树

决策树最早的思路就是对多个特征的数据,不断地用if-then的思路对每个特征进行判断,最后利用数据结构的树模型表示。

决策树通常可以认为是if-then规则集合,易于理解,可解释性强,预测速度快

这里面就涉及一个如何可以找到更好的特征进行分裂,这里主要有三个思路:

  • ID3:信息增益熵方式
  • C4.5:信息熵增益比
  • CART:回归用最小二乘或者最小绝对偏差、分类用基尼系

在GBDT中,弱分类器选用的是CART回归树。因为这里要拟合的是梯度值,是连续值,所以需要用回归树。

Boosting

将弱模型聚合有两种思路:Bagging和Boosting。

Bagging的思路就是同时训练多个弱模型,基于弱模型的投票,以少数服从多数的思想决定输出。典型的代表模型就是随机森林模型。

Boosting的思路则是串行的,每一次训练一个模型都是建立在前一个模型的学习基础上,不断去通过新模型去减少之前的错误,典型的模型是GBDT和XGBOOST模型。

这里Boosting提到了每次的学习都是建立在前一个模型学习的基础上,所以这就要求我们需要把前一个模型训练的结果通过某种方式传递给下一个模型。这里就用到了梯度提升。

梯度提升

既然要把前面的训练结果进行传递,就需要先解决怎么建立损失函数。解决回归问题,很自然想到的就是用平方差损失函数。

\[L = \frac{1}{2}\sum_{i=1}^{n}(F(x_{i}) - Y_i)^2 \]

想寻找最小值,可以进行求导

\[\nabla L = \sum_{i=1}^{n}(F(x_{i}) - Y_{i}) \]

我们可以发现负梯度方向就变成了残差,这样每次新的模型都去拟合残差,就可以解决上面的问题。而这个就是为什么GBDT是传递残差,但需要注意的是,如果损失函数不是平方差的话,就不能说是传递残差了。

计算方式

GBDT算法又叫MART(Multiple Additive Regression),是一种迭代的决策树算法。

输出结果可以看成

\[F(x,w) = \sum_{m=0}^Mf_m(x, w_{m}) \]

GBDT可以做回归也可以做分类,大致思路是一致的,但是在细节上面还有存在一些差别。

回归任务

计算流程

  1. 初始化一个弱分类器\(F_0(x) = arg min_c \sum_{i=1} ^N L(y_{i}, c)\)(这里的c计算出来就是平均值)
  2. 对于建立M棵CART树m=1,2,...M:
    1. 对i=1,2,...,N, 计算第m棵树对应的响应值(损失函数的负梯度)
    2. 对于i = 1,2,...N,利用CART回归树拟合数据,得到第m棵回归树,其对应的叶子节点区域为\(R_{m,j}\),其中\(j=1,2,...,j_{m},且J_{m}为第m棵回归叶子节点的个数\)
    3. 对于\(J_m个叶子节点区域j=1,2,...,J_m,计算最佳拟合值\)

      \[c_{m,j} = arg \min_{c} = \sum_{x_i \in R_{m,j}}L(y_i, F_{m-1}(x_i)+c) \]

    4. 更新强学习器\(F_m(x)\)

      \[F_m(x) = F_{m-1}(x) + \alpha \sum_{j=1}^{J_m}c_{m,j}I(x \in R_{m,j}) \]

  3. 最后得到强学习器表达式

    \[F_M(x) = F_0(x) + \alpha\sum_{m=1}^{M}\sum_{j=1}^{J_M}c_{m,j}I(x\in R_{m,j}) \]

损失函数

  • 均方差损失
  • 绝对值损失
  • Huber损失
  • 分位损失

Huber和分位损失函数主要是为了减少异常点对模型的影响

GBDT正则化

  1. Shrinkage,其实就是学习速率,主要是用在更新强学习器时,新的预测值要乘以倍数,主要是为了防止过拟合。(这个也就跟GBDT的树有关系)
  2. subsample
  3. CART树正则化剪枝
  4. Early Stopping
  5. Dropout:每加一棵树,拟合的不再是之前的全部树的误差,而是随机选一部分

分类任务

分类任务处理思想借鉴了逻辑回归的思路,就是把GBDT之前的线性回归再加上Sigoid函数,去拟合\(ln\frac{p}{1-p}\)分类模型可以写为

\[P(y=1|x) = \frac{1}{1 + e^{-\sum_{m=0}^{M}h_{m(x)}}} \]

损失函数交叉熵:

\[loss(x_i,y_i) = -y_i log \hat{y_i} - (1-y_i)log(1-\hat{y_i}) \]

\(F(x)=\sum_{m=0}^{k}h_m(x)\)带入上式

\[loss(x_i, y_i|F(x)) = y_ilog(1+e^{-F(x_i)}) + (1-y_i)[F(x_i) + log(1+e^{-F(x_i)})] \]

负梯度方向:

\[y_i - \hat{y_i} \]

最后可以看出其实是拟合概率之差。

计算流程

  1. 初始化一个弱分类器\(F_0(X)=ln\frac{p}{1-p}\)
  2. 对于建立M棵CART树m=1,2,...M:
    1. 对i=1,2,...,N, 计算第m棵树对应的响应值(损失函数的负梯度)\(r_{m,i}=y_i-\frac{1}{1+e^{-F(x_i)}}\)
    2. 对于i = 1,2,...N,利用CART回归树拟合数据,得到第m棵回归树,其对应的叶子节点区域为\(R_{m,j}\),其中\(j=1,2,...,j_{m},且J_{m}为第m棵回归叶子节点的个数\)
    3. 对于\(J_m个叶子节点区域j=1,2,...,J_m,计算最佳拟合值\)

      \[c_{m,j} = arg \min_{c} = \frac{\sum_{x_i \in R_{m,j}}r_{m,i}}{\sum_{x_i \in R_{m,j}}(y_i-r_{m,i})(1-y_i+r_{m,i})} \]

    4. 更新强学习器\(F_m(x)\)

      \[F_m(x) = F_{m-1}(x) + \alpha \sum_{j=1}^{J_m}c_{m,j}I(x \in R_{m,j}) \]

  3. 最后得到强学习器表达式

    \[F_M(x) = F_0(x) + \alpha\sum_{m=1}^{M}\sum_{j=1}^{J_M}c_{m,j}I(x\in R_{m,j}) \]

GBDT优缺点

优点

  1. 预测阶段的计算速度快,树与树之间可并行化计算。
  2. 在分布稠密的数据集上,泛化能力和表达能力都很好,这使得GBDT在Kaggle的众多竞赛中,经常名列榜首。
  3. 采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。

缺点

  1. GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
  2. GBDT对异常值比较敏感。
  3. 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。

GBDT与其他模型比较

逻辑回归

相同点

  1. 模型:都是判别模型

不同点

  1. 模型:GBDT是非线性,LR是线性
  2. 损失函数:LR是交叉熵,而GBDT是回归损失函数
  3. 正则:逻辑回归斯正则可带L1、L2约束参数稀疏正则来对整体参数限定,但是GBDT是采用对本轮参数的增加。
  4. 特征组合:GBDT 特征选择方法采用最小化均方损失来寻找分裂特征及对应分裂点,所以自动会在当前根据特征 A 分裂的子树下寻求其他能使负梯度最小的其他特征 B,这样就自动具备寻求好的特征组合的性能,因此也能给出哪些特征比较重要。而 LR 只是一次性地寻求最大化熵的过程,对每一维的特征都假设独立,因此只具备对已有特征空间进行分割的能力,更不会对特征空间进行升维(特征组合)
  5. 特征稀疏性:Logistic Regression不具有特征组合的能力,并假设特征各个维度独立,因此只具有线性分界面,实际应用中,多数特征之间有相关性,只有维度特别大的稀疏数据中特征才会近似独立,所以适合应用在特征稀疏的数据上。而对于 GBDT,其更适合处理稠密特征,如 GBDT+LR 的Facebook论文中,对于连续型特征导入 GBDT 做特征组合来代替一部分手工特征工程,而对于 ID 类特征的做法往往是 one-hot 之后直接传入 LR,或者先 hash,再 one-hot 传入树中进行特征工程,而目前的主流做法是直接 one-hot + embedding 来将高维稀疏特征压缩为低纬稠密特征,也进一步引入了语意信息,有利于特征的表达。
  6. 数据假设:LR假设噪声是高斯分布,数据是伯努利分布,特征独立,而GBDT没有。

随机森林

相同点:

都是由多棵树组成,最终的结果都是由多棵树一起决定。

不同点:

  1. 集成的方式:随机森林属于Bagging思想,而GBDT是Boosting思想。
  2. 偏差-方差权衡:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差。
  3. 训练样本方式:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本。
  4. 并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)。
  5. 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合。
  6. 数据敏感性:RF对异常值不敏感,而GBDT对异常值比较敏感。
  7. 泛化能力:RF不易过拟合,而GBDT容易过拟合。

XGBOOST

相同点:

由多棵树组成,基于boosting思想。

不同点:

  1. 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  2. 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  3. xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  4. 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  5. 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  6. 特征并行化训练(直方图算法)

参考

Boosting方法-GBDT,XGBOOST,LightGBM
深入理解GBDT回归算法
GBDT分类算法
DART: Dropouts meet Multiple Additive Regression Trees
GBDT与LR区别

posted on 2020-09-28 11:37  复古猴子  阅读(268)  评论(0编辑  收藏  举报

导航