【Method】Boosting(二)GBDT
原理
与传统决策树不同的是,传统的决策树中每次决策是Heuristic(启发式)的(比如信息增益),而这里,每次决策都是Objective(目标性质的,与目标函数相关)。
Boosting Tree Model
提升树(Boosting tree)是以分类树或回归树为基本分类器的提升方法。提升数被认为是统计学习中性能最好的方法之一。
提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法。以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:
\[f_M(x) = \sum_{m=1}^M T(x;\theta_m)\]其中,\(T(x,\theta_m)\)表示决策树;\(\theta_m\)为决策树的参数;M为树的个数。
Boosting Tree algorithm
提升树算法采用前向分布算法。首先确定初始提升树\(f_0(x)=0\),第m步的模型是
\[f_m(x) = f_{m-1}(x)+T(x; \theta_m)\]其中,f_{m-1}(x)为当前模型,通过经验风险极小化确认下一棵决策树的参数\(\theta_m\),
\[\hat{\theta}_m =arg min_{\theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i; \theta_m))\]由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。
下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
对于二类分类问题,提升树算法只需将基本分类器限制为二分类即可,可以说这时的提升树算法是AdaBoost算法的特殊情况,这里不再细述。
下面叙述回归问题的提升树。
已知一个训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}, x_i \in X \subseteq R^n\),X为输入空间,\(y_i \in Y \subseteq R\),Y为输出空间。在决策树中已经讨论了回归树的问题。如果将输入空间X划分为J个互不相交的区域\(R_1, R_2,...,R_J\),并且在每个区域上确定输出的常量\(c_j\),那么树可以表示为
\[T(x; \theta) = \sum_{j=1}^J c_j I(x \in R_j)\]其中,参数\(\theta={(R_1,c_1),(R_2,c_2),...,(R_J,c_J)}\)表示树的区域划分和各区域上的常数,J是回归树的复杂度即叶结点个数。
回归问题提升树使用以下向前分步算法:
\[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)\]在前向分布算法的第m步,给定当前模型\(f_{m-1}(x)\),需求解
\[\hat{\theta}_m = arg min_{\theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i; \theta_m))\]得到\(\hat{\theta}_m\),即第m棵树的参数。
当采用平方误差损失函数时,
\[L(y,f(x)) = (y-f(x))^2\]其损失变为
\[\begin{align} &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{align}\]这里,
\[r=y-f_{m-1}(x)\]是当前模型拟合数据的残差(residual)。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。这样,算法是相当简单的。
回归问题的提升树算法:
输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}, x_i \in X \subseteq R^n, y_i \in Y \subseteq R\);
输出:提升树\(f_M(x)\)
(1) 初始化\(f_0(x)=0\)
(2) 对m=1,2,…,M
(a) 计算残差
\[r_{mi}=y_i-f_{m-1}(x_i), i=1,2,...,N\](b) 拟合残差\(r_{mi}\)学习一个回归树,得到\(T(x;\theta_m)\)
(c) 更新\(f_m(x)=f_{m-1}(x)+T(x;\theta_m)\)
(3) 得到回归问题提升树
\[f_M(x)=\sum_{m-1}^M T(x;\theta_m)\]Gradient Boosting Decision Tree(GBDT)
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对于一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
\[-[\frac{\partial L(y, f(x_1))}{\partial f(x_1)}]_{f(x)=f_{m-1}(x)}\]作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
梯度提升算法:
输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)},x_i \in X \subseteq R_n, y_i \in Y \subseteq R\);损失函数L(y,f(x));
输出:回归树\(\hat{f}(x)\)
(1) 初始化
\[f_0(x) = arg min_c \sum_{i=1}^N L(y_i,c)\](2) 对m=1,2,…,M
(a) 对i=1,2,…,N,计算
\[r_{mi} = -[\frac{\partial L(y, f(x_1))}{\partial f(x_1)}]_{f(x)=f_{m-1}(x)}\](b) 对\(r_{mi}\)拟合一个回归树,得到第m棵树的叶结点区域\(R_{mj},j=1,2,...,J\)
(c) 对j=1,2,…,J,计算
$$c_{mj} = arg min_c \sum_{x_i \in R_{mj} L(y_i, f_{m-1}(x_i) +c)}
(d) 更新\(f_m(x) = f_{m-1}(x) + \sum_{j-1}^J c_{mj} I(x \in R_{mj})\)
(3) 得到回归树
\[\hat{f}(x) = f_M(x) = \sum_{m-1}^M \sum_{j=1}^J c_{mj} I(x \in R_{mj}\]算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计,对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。第2(b)步估计回归树叶结点区域,以拟合残差的近似值。第2(c)步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步更新回归树。第3步得到输出的最终模型\(\hat{f}(x)\)。