Boosting和BDT公式推导

原理:

提升方法(Boosting)

提升方法:加法模型+前向分布算法。

加法模型

\[\begin{equation}\begin{split} f(x)=\sum_{i=1}^N \beta_mb(x;\gamma_m)\end{split}\end{equation} \]

一些个基模型加权累加,可以是任何模型。
其中,\(b(x;\gamma_m)\) 为基函数,\(\gamma_m\) 为基函数的参数,\(\beta_m\)为基函数的系数。

在给定训练数据 \(\lbrace(x_i,y_i)^N_{i=1}\rbrace\) 及损失函数\(L(y,f(x))\)的条件下,学习加法模型\(f(x)\)成为经验风险极小化问题:

\[\begin{equation}\begin{split} \min_{\beta_m\gamma_m}\sum_{i=1}^M L \begin{pmatrix}y_i,\sum_{m=1}^M\beta_mb(x_i;\gamma_m)\end{pmatrix} \end{split}\end{equation} \]

前向分布算法求解这一优化问题的思路:因为学习的是加法模型,可从前向后,每次只学习一个基函数模型和系数,逐步逼近优化目标函数(3),则可以简化优化复杂度。具体的每步只需要优化如下损失函数:

\[\begin{equation}\begin{split} \min_{\beta_m\gamma_m}\sum_{i=1}^M L \begin{pmatrix}y_i,\beta b(x_i;\gamma)\end{pmatrix} \end{split}\end{equation} \]

前向分步算法

拿这个\(f(x)=0\) 基础模型举例
输入:

  • 训练数据 \(T=\lbrace (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\rbrace\);
  • 损失函数 \(L(y,f(x))\)
  • 基函数集合 \(\lbrace b(x;y) \rbrace\)

输出:
1、 初始化 \(f_0(x)=0\) 基础模型
2、 对 $ m=1,2,...,M $

  • a. 极小化算是函数

    \[\begin{equation}\begin{split} (\beta_m,\gamma_m)=arg\min_{\beta_m\gamma_m}\sum_{i=1}^M L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) \end{split}\end{equation} \]

上一步的模型加当前要学习的模型,在损失函数极小化后得到参数 \(\beta_m,\gamma_m\) 是当前这步的基模型对应的参数集。

  • b. 更新,在m-1步的基础上构建新的精度更高的模型:

\[ \begin{equation}\begin{split} f(x)=f_{M}(x)+\beta_m b(x;\gamma_m) \end{split}\end{equation} \]

3、不断累加得到加法模型

\[\begin{equation}\begin{split} f(x) = f_M(x) = \sum_{m=1}^M \beta_mb(x;\gamma_m) \end{split}\end{equation} \]

把一个整体的函数学习问题,转化为一个循环迭代过程,每一步只学习其中一部分 \(f_{m-1}(x_i)+\beta b(x_i;\gamma)\)


提升决策树(BDT,Boosting Decision Tree):

其实就是boosting集成了树模型。
在这Boosting基础上定两个约束:

  • 基模型=决策树模型
  • \(\beta_m\)都约束为1:每一颗决策树权重都为1

提升决策树模型:

\[\begin{equation}\begin{split} f_M=\sum_{m=1}^MT(x;\Theta_m) \end{split}\end{equation} \]

其中:\(T(x;\Theta_m)\) 表示决策树;\(\Theta_m\)为决策树的参数;M为树的个数。

学习过程:
采用前向分步算法,首先确定初始提升决策树 $f_0(x)=0 $ (单根节点=0的树), 第m步的模型是

\[\begin{equation}\begin{split} f_M(x) = f_{m-1}(x)+T(x;\Theta_m) \end{split}\end{equation} \]

其中,\(f_m-1(x)\) 为当前模型,通过经验分享极小化确定下一颗决策树的参数\(\Theta_m\),

\[\begin{equation}\begin{split} \hat\Theta_m = arg\min_{\Theta_m}\sum_{j=1}^NL(y_i,f_{m-1}(x_i)+T(x_j;\Theta_m)) \end{split}\end{equation} \]

已知训练数据集 \(T=\lbrace(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\rbrace , x_i \in \chi \subseteq R^n\), \(\chi\) 为输入空间,Y为输出空间。
如果将输入控件\(\chi\) 划分为J个互不相交的区域 \(R_1,R_2,...R_j\) (树模型本质离散化) ,并且在每个区域上确定输出的常量 \(c_j\) 。那么决策树可表示为:

\[\begin{equation}\begin{split} T(x;\Theta) = \sum_{j=1}^j c_jI(x\in R_j) \end{split}\end{equation} \]

每一个区域判断x属不属于Rj,用cj进行输出,不是输出0
结构上是一颗树,但在公式表示上,我只关心x落在哪个叶子节点上。
其中,参数\(\Theta = \lbrace(R_1,c_1),(R_2,c_2),...,(R_j,c_j)\rbrace\) 表示决策树的区域划分和各区域上的常量值。J 是决策树的复杂度即叶子节点个数。

提升决策树使用以下前向分步算法:

\[\begin{equation}\begin{split} f_0(x) &= 0 \\ f_m(x)&= f_{m-1}(x) + T(x;\Theta_m) ,m=1,2,...,M \\ f_M(x)&= \sum_{m=1}^M T(x;\Theta_m) \end{split}\end{equation} \]

在前向分步算法的第m步,给定当前模型 \(f_{m-1}(x)\),需要求解

\[\begin{equation}\begin{split} \Theta_m = arg\min_{\Theta_m} \sum_{i=1}^N L(y_i,f_{m-1}(x_i)+ T(x_j;\Theta_m)) \end{split}\end{equation} \]

得到 \(\hat\Theta_m\), 即第m颗树的参数。
当采用平方误差损失函数时,

\[\begin{equation}\begin{split} L(y,f(x))=(y-f(x))^2 \end{split}\end{equation} \]

其损失变为

\[\begin{equation}\begin{split} L(y,f_m-1(x)+T(x;\Theta_m)) &= [y-f_{m-1}(x)-T(x;\Theta_m)]^2 \\ &=[r-T(x;\Theta_m)]^2 \end{split}\end{equation}\\ r=y-f_{m-1}(x) \]

其中,r是当前模型拟合数据的残差(residual)。对回归问题的提升决策树,只需要简单地拟合当前模型的残差。
对比公式(14)和(15)中的r,如果把r作为一个实际输出的话,公式(15)就是在r这个实际输出上去学习一个决策树模型。换句话说,在当前步T的学习过程中,不是奔着y去学习的,而学习的是实际输出y与上一个模型已经学号的部分的差值(没学好的那部分)。

回归问题的提升决策树的算法过程:

  • 输入:训练数据集 \(T=\lbrace(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\rbrace\)
  • 输出:
    提升决策树 \(f_M(x)\)
    (1)初始化 \(f_0(x)=0\)
    (2)对 \(m=1,2,...,M\)
    • a. 按照式(15)计算残差

    \[r_{m i}=y_i - f_m-1(x_i) , i=1,2,...,N \]

    • b.拟合残差\(r_{m i}\) 学习一个回归树,得到\(T(x;\Theta_m)\)
    • c.更新 \(f_m(x)=f_{m-1}(x)+T(x;\Theta_m)\)
      得到回归提升决策树

\[f_M(x)=\sum_{m=1}^MT(x;\Theta_m) \]

posted @ 2020-12-17 22:31  ZzUuOo666  阅读(193)  评论(0编辑  收藏  举报