梯度树提升算法(GTBA, gradient tree boosting algorithm)
继续boosting类算法哎。小小预告一下,下节课会直接跳到随机森林,老师貌似是想把各种分类器都一下子讲到,然后有点前后照应的比较~真有意思,若是以前扔给我这种问题我肯定run一个logit regression就不管了,现在倒是有各种线性的、广义线性的、非线性的模型可以试着玩了,爽哎~
------------------
1. 自适应基函数模型
小小的复习一下上节课那个框架。
1. 数据。 D={(xi,yi),1≤i≤N}
2. 模型。 f(x)=∑Mm=1βmb(x,γm)
为基函数模型,其中 {b(x,γ),γ∈Γ} 成为基函数集合。 {(βm,γm)}M1为参数。
3. 损失函数(准则)。 L(y,f(x))
为损失函数,然后就转为一个优化问题:
{(β∗m,γ∗m)}M1=argmin∑Ni=1L(y,f(x))=argmin∑Ni=1L(yi,∑Mm=1βmb(x,γm))
4. 算法。 前向分步算法。
- 初始化: f0(x)=0
- 迭代:For m=1 to M, (βm,γm)=argmin∑Ni=1L(yi,fm−1(xi)+βb(xi,γ))
- 令 fm(x)=fm−1(x)+βmb(xi,γ)
- 。
- 输出
fm(x)
- 。
在此框架之下,除了上节课的Adaboost之外,还可以套用多种其他的基函数,然后1)定义损失函数 2)给出迭代那一步的优化算法,就可以实现一种boost提升算法了。
2. 应用回归问题
先采用均方误差的损失函数,定义 L(y,f(x))=(y−f(x))2
,这样就可以得到
(β,γ)=argmin∑Ni=1(yi−fm−1(xi)−βb(xi,γ))2
然后定义:
rim=yi−fm−1(xi),1≤i≤N
, ⇒argminβ,γ∑Ni=1(rim−βb(xi,γ))2 。这里 (xi,rim)之后用回归树来求的话,就是梯度回归树算法。
梯度回归树提升算法
- 初始化: f0(x)=0
- 迭代:For m=1 to M,计算 rim=yi−fm−1(xi) 。由 (xi,rim) 用回归树求得 Tm(x)
- .
- 令 fm(x)=fm−1(x)+Tm(x)
- 。
- 输出
fm(x)
- 。
3. GTBA,梯度树提升算法
先吹捧一下:这个算法就是此书作者本人开发的,然后已经搞出来了软件包,可以做回归也可以做分类,貌似效果还胜过随机森林(当然是作者自己给出的那些例子...)。
损失函数 L(y,f(x))
为可微的。
我们的优化目标是 ∑Ni=1L(yi,f(xi))
,也就是说实际上我们不是直接对 L(y,f(x)) 进行优化,而是仅仅在所有观测的数据点上优化,所以仅跟 f(⋅)在这些观测点上的值有关。感觉这里就是说,我们使用有限的观测到的信息来推断一个连续的函数,然后类推并用于其他未观测到的点。
定义:
f¯=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f(x1)f(x2)⋮⋮f(xN)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
,这样这个问题就从一个直接优化 f(⋅)的泛函问题转化为一个优化多元函数的问题...而对于一个多元函数,我们可以直接用梯度下降法。定义梯度为:
f¯0,∂L∂f¯|f¯0=g¯0
,这样 f¯1=f¯0−g¯0 。类似的,我们可以定义 f¯m=f¯m−1−τg¯m−1 ,其中 g¯m−1=∂L∂f¯|f¯m−1。累加起来,就是
f¯m=f¯0−τg¯m−1−⋯−τg¯0
,这里 τ 可以是常量也可以随着 m改变。
定义完梯度下降之后,就是GTBA算法了。
- 初始化。
- 迭代:For m=1 to M,计算 rim=∂L(yi,f(xi))∂f(xi)|fm−1
- 。
- 令 fm(x)=fm−1(x)+Tm(x)
- 。
- 输出
fm(x)
- 。
一些梳理
1. 参数。这里显然有如下参数需要设定:
- M:迭代次数。这是这个算法最主要的参数,需要用Cross-validation来算。
- J:树的大小。建议4-8,默认为6。
- μ
- 这个参数,决定收缩的速度,0-1之间。
-
η
- :次采样率,0-1直接,默认0.5。用于做subsampling。
2. 特征变量评价
这个算法的一大优势就是可以给出各个自变量的评价。比如 P>N
的时候我们可能面临特征变量选择问题。
用t表示树中的节点, v(t)
表示t节点所用的变量, τ2(t)表示t节点产生的均方误差的减小值。之后定义:
xτ=∑tI(v(t)=xτ)τ2(t)
,可用这个值来刻画变量的重要性,从而进行特征评价。
3. 通用工具
该算法对于数据无特殊要求,有一批 D={(xi,yi),1≤i≤N}
都可以扔进去试试,故可以作为其他算法的benchmark。
此外,从贝叶斯分类器的角度,我们要找的是 f(x)=argmaxP(G|x)
,这样除了原有可以观测到的 (xi,Gi) 之上,还可以衍生出一个 Gi 向量,即 Gi=(0,0,..,1,..,0) ,第k个位置为1如果观测到的 (xi) 对应第k类。一下子就可以扩展整个数据集,也可以进一步对每类都赋一个概率,不单单是0-1这样。