zoukankan      html  css  js  c++  java
  • 集成学习之梯度提升树(GBDT)

    $GBDT$ 也是集成学习 $Boosting$ 家族的成员,但是却和传统的 $Adaboost$ 有很大的不同。回顾下 $Adaboost$,我们是利用前一轮迭代弱学习器的误差率

    来更新训练集的权重,这样一轮轮的迭代下去。$GBDT$ 也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用 $CART$ 回归树模型,同时迭代

    思路和 $Adaboost$ 也有所不同。

    提升树

    提升树模型是以分类树或回归树为基本分类器的提升方法,这里限定了只能采用决策树模型,采用其它模型就不能称为树了。

    这个模型也是采用加法模型(即基函数的线性组合)与前向分步算法。先来通俗解释一下它的过程。假设有样本集如下:

    $$left {(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{n},y_{n}) ight }$$

    首先用决策树模型 $f_{0}(x) = T_{0}(x)$ 去拟合这些数据,使得这批样本的平方损失函数 $sum_{i = 0}^{n}left ( y_{i} - f_{0}(x_{i}) ight )^{2}$ 最小,但是发现虽然模型的拟合效果很好,但仍

    然有些差距。比如预测值 $f_{0}(x_{1}) = 0.8$,而真实值 $y_{1}=0.9$, $f_{0}(x_{2})=1.4$, $y_{2}=1.3$ 等等。现在不允许更改原来模型 $f_{0}(x)$ 的参数,有什么办法

    来提高模型的拟合能力呢?

    既然不能更改原来模型的参数,那么意味着必须在原来模型的基础之上做改善,直观的做法就是建立一个新的模型 $T_{1}(x)$ 来拟合 $f_{0}(x)$ 未完全拟合真实

    样本的残差,即 $y - f_{0}(x)$,所以对于新的模型 $T_{1}(x)$来说,拟合的样本集就变成了:

    $$left ( x_{1}, y_{1} - f_{0}(x_{1}) ight ), ; left ( x_{2}, y_{2} - f_{0}(x_{2}) ight ), cdots , left ( x_{n}, y_{n} - f_{0}(x_{n}) ight )$$

    拟合出模型 $T_{1}$ 后,我们便得到了更接近原始样本的函数:$f_{1}(x) = f_{0}(x) + T_{1}(x)$。之后可以继续训练新 $T_{2}(x)$ 模型拟合残差 $y - f_{1}(x)$......

    提升树算法步骤如下:

        1)初始化 $f_{0}(x) = 0$。

        2)对 $m = 1,2,...,M$,重复以下操作得到 $M$ 个学习器:

           a. 计算残差:

    $$r_{mi} = y_{i} - f_{m-1}(x_{i}), ; i = 1,2,cdots,n$$

           b. 拟合残差 $r_{mi}$ 学习一个回归树,得到 $T_{m}(x)$。

           c. 更新 $f_{m}(x) = f_{m-1}(x) + T_{m}(x)$

        3)得到回归问题提升树:

    $$f_{M}(x) = sum_{m = 1}^{M}T_{m}(x)$$

    为什么训练的下一个模型 $T_{m}$ 去拟合的样本是残差呢?

    其实不一定。提升树是一个加性模型,我们希望这个模型在训练集上的经验误差最小,即

    $$min sum_{i = 1}^{n}L left ( y_{i}, f(x_{i}) ight ) ; Leftrightarrow ; min sum_{i = 1}^{n}L left ( y_{i}, sum_{m = 1}^{M}T_{m}(x_{i}) ight )$$

    通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的思想就是:因为最终模型是一个加性模型,如果能从前往后,每一步只学习一个基本

    学习器 $T_{m}(x)$,不断迭代得到最终的模型,那么就可以简化问题复杂度。具体的,当我们经过 $m-1$ 轮迭代得到了最优模型 $f_{m-1}(x)$时,因为

    $$f_{m}(x) = f_{m - 1}(x) + T_{m}(x)$$

    优化目标就为

    $$min sum_{i = 1}^{n}Lleft ( y_{i}, f_{m - 1}(x_{i}) + T_{m}(x_{i}) ight )$$

    当采用平方损失函数的时候

    $$Lleft ( y_{i}, f_{m - 1}(x_{i}) + T_{m}(x_{i}) ight ) = left [; y_{i} - f_{m - 1}(x_{i}) - T_{m}(x_{i}) ; ight ]^{2} = left [; r_{mi} - T_{m}(x_{i}) ; ight ]^{2}$$

    也就是说,当误差函数采用平方损失的时候,$T_{m}$ 拟合的就是残差,当然也可能存在其它误差函数,使得模型拟合的不是残差。

    提升树模型特指拟合的是残差的情形,这一点从算法步骤中可以看出,也就是说提升树只针对那些包含残差项的损失函数。

    梯度提升树

    对于一般的回归树,采用平方误差损失函数,这时根据前向分布每次只需要达到最优化,就能保证整体上的优化。由于平方误差的特殊性,可以推导

    每次需要拟合的就是残差(真实值-预测值),而对于其他损失函数,每次拟合的就不知道是什么东西了,推导过程也可能很复杂,将提升树算法进

    行改进,提出一种适用于任意损失函数的模型。设损失函数为

    $$L(y,f(x))$$

    将 $f(x)$ 看成一个参数,为了使 $L$ 损失函数最小,采用梯度下降的方法即:

    $$f_{m}(x) = f_{m - 1}(x) - eta frac{dL}{df(x)}$$

    又因为

    $$f_{m}(x) = f_{m - 1}(x) + T_{m}(x)$$

    所以有

    $$T_{m}(x) = - eta frac{dL}{df(x)}$$

    左边为预测值,右边为真实值,所以整个过程就变成了每次拟合损失函数的负梯度的值。可以将这种方法看成一般损失函数的情况,而平方损失是特

    殊的情况(平方损失函数的导数就是残差),所以提升树其实就是梯度提升树的特例。

  • 相关阅读:
    Spring多数据源动态切换
    IntelliJ Idea使用代码格式化,Tab制表符进行缩进
    idea 快捷键
    final关键字的功能概述
    IntelliJ Idea 常用快捷键列表
    Log4j.properties配置详解
    IDEA添加try catch快捷键
    使用 JMeter 进行压力测试
    idea 复制当前行到下一行快捷键
    js父窗口opener与parent
  • 原文地址:https://www.cnblogs.com/yanghh/p/13956477.html
Copyright © 2011-2022 走看看