GBDT算法:
所谓的GBDT(Gradient Boost Desicison Tree)就是值在每一步迭代时我们难以真正求得一个新的模型使得其加上原有模型得到的损失最小,但是我们可以用所谓的梯度下降法使得损失减小。
输入:训练数据集$D+\lbrace(x_{1},y_{1}),...,(x_{N},y_{N})\rbrace$,$x_{i}\in\mathbb{R}^{P}$,$y_{i}\in\mathbb{R}$; 损失函数$l(f(x),y)$; 正整数$M$;
输出:某回归模型
Step1. 令$f_{0}=argmin_{c}\sum_{i=1}^{N}l(y_{i},c)$
Step2. $m=1,...,M$, 执行:
1) 计算$g_{m,i}=\partial_{1} l(f_{m-1}(x_{i}),y_{i})$;
2) 对数据$\lbrace(x_{1},-g_{m,1}),...,(x_{N}-g_{m,N})\rbrace$ 用CART算法进行拟合,得到一回归树,并且对每个叶节点得到一个叶节点区域$R_{mj},$
$j=1,...,J$;
3) 计算: \begin{equation}c_{mj}=argmin_{c}\sum_{x_{i}\in R_{mj}}l(f_{m-1}(x_{i})+c)\end{equation}
4) 令:
\begin{equation}f_{m}=f_{m-1}+c_{mj}I(\lbrace x\in R_{mj}\rbrace)\end{equation}
Step3. 输出$f_{M}$
学习率收缩shrinkage
为了防止过拟合,也为了给后续的弱学习器留下更多学习空间,我们可以选择某个常数$\nu\in(0,1)$ 甚至是一个单调递减的数列$\lbrace \nu_{m}\in(0,1)\rbrace_{m=1}^{M}$来作为学习率,具体说来就是在上述算法的Step2的4)中令:
\begin{equation}f_{m}=f_{m-1}+\nu c_{mj}I(\lbrace x\in R_{mj}\rbrace)\end{equation}
或者:
\begin{equation}f_{m}=f_{m-1}+\nu_{m} c_{mj}I(\lbrace x\in R_{mj}\rbrace)\end{equation}
一般说来,更低的学习率意味着更高的运算开销,我们应该选择更大的$M$, 在实践中我们一般选择学习率$\nu\leq 0.1$,而如果选择的学习率过大的话模型会很快过拟合。
子采样subsampling,袋外误差,特征重要性
GBDT也可以每次随机采样若干样本而不是样本总体进行训练,我们在随机森林,Baggging算法中已经看到,子采样有助于减小模型方差,同时我们也可以计算袋外误差。和随机森林一样,我们也可以得到特征的重要性。
参考文献
[1] Trevor Hastie,Robert Tibshirani,Jerome Friedman: The Elements of Statistical Learning Data Mining,Inference,and Prediction, second edition, Springer Verleg, 2009