提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法。以决策树为基函数的提升方法称为提升树。提升树模型可以表示为决策树的加法模型:
fm(x)=m=1∑MT(x;Θm)
其中, T(x;Θm) 表示决策树; Θm 为决策树的参数; M 为树的个数。
提升树算法采用前向分步算法。首先确定初始提升树 f0(x)=0 ,第 m 步的模型是
fm(x)=fm−1(x)+T(x;Θm)
其中, fm−1(x) 为当前模型,通过经验风险极小化确定下一棵决策树的参数 Θm ,
Θ^m=argΘmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))
下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数函数的分类问题,以及用一般损失函数的一般决策问题。
分类问题
将GBDT应用于回归问题,相对来说比较容易理解。因为回归问题的损失函数一般为平方差损失函数,这时的残差,恰好等于预测值与实际值之间的差值。每次拿一棵决策树去拟合这个差值,使得残差越来越小,这个过程还是比较intuitive的。而将GBDT用于分类问题,则显得不那么显而易见。
在说明分类之前,我们先介绍一种损失函数。与常见的直接求预测与真实值的偏差不同,这种损失函数的目的是最大化预测值为真实值的概率。这种损失函数叫做对数损失函数(Log-Likehood Loss),定义如下
L(Y,P(Y∣X))=−logP(Y∣X)
对于二项分布, y∗∈{0,1} ,我们定义预测概率为 p(x)=P(y∗=1) ,即二项分布的概率,可得
L(y∗,p(x))={−log(p(x)), if y∗=1−log(1−p(x)), if y∗=0
即,可以合并写成
L(y∗,p(x))=−yilog(p(x))−(1−yi)log(1−p(x))
即
L(y∗,p(x))=−yilogyi^−(1−yi)log(1−yi^)
对于 p(x) 与 F(x) 的关系,我们定义为
p(x)=eF(x)+e−F(x)eF(x)
二分类
类似于逻辑回归、FM模型用于分类问题,其实是在用一个线性模型或者包含交叉项的非线性模型,去拟合所谓的对数几率 ln1−pp 。而GBDT也是一样,只是用一系列的梯度提升树去拟合这个对数几率,实际上最终得到的是一系列CART回归树。其分类模型可以表达为:
P(y=1∣x)=1+e−∑m=0Mhm(x)1
其中, hm(x) 就是学习到的决策树。
清楚了这一点之后,我们便可以参考逻辑回归,单样本 (xi,yi) 的损失函数可以表达为交叉熵:
loss(xi,yi)=−yilogyi^−(1−yi)log(1−yi^)
假设第 k 步迭代之后当前学习器为 F(x)=m=0∑khm(x) ,将 yi^ 的表达式带入之后, 损失函数写为:
loss(xi,yi∣F(x))=yilog(1+e−F(xi))+(1−yi)[F(xi)+log(1+e−F(xi))]
可以求得损失函数相对于当前学习器的负梯度为:
−∂F(x)∂loss∣xi,yi=yi−1+e−F(xi)1=yi−yi^
可以看到,同回归问题很类似,下一棵决策树的训练样本为: {xi,yi−yi^}i=1n ,其所需要拟合的残差为真实标签与预测概率之差。于是便有下面GBDT应用于二分类的算法:
For m=1,2…,M :
计算 gi=yi^−yi ,并使用训练集 {(xi,−gi)}i=1n 训练一棵回归树 tm(x),其中 yi^=1+e−Fm−1(x)1
通过最小化损失函数找树的最优权重: ρm=pargmini∑loss(xi,yi∣Fm−1(x)+ρtm(x))
考虑shrinkage,可得这一轮迭代之后的学习器 Fm(x)=Fm−1(x)+αρmtm(x) , α 为学习率
得到最终学习器: Fm(x)
多分类
模仿上面两类分类的损失函数,我们能够将 K 类分类的损失函数定义为
−k=1∑Kyklogpk(x)
其中, pk(x)=P(yk=1∣xk) ,且将 pk(x) 与 Fk(x) 关系定义为
Fk(x)=logpk(x)−K1l=1∑Klogpl(x)
或者,换一种表达方式
pk(x)=∑i=1KeFi(x)eFk(x)
即,对于多分类问题,则需要考虑以下softmax模型:
P(y=1∣x)=∑i=1keFi(x)eF1(x) P(y=2∣x)=∑i=2keFi(x)eF1(x) ... ...
其中 F1…Fk 是 k 个不同的tree ensemble。每一轮的训练实际上是训练了 k 棵树去拟合softmax的每一个分支模型的负梯度。可见,这k棵树同样是拟合了样本的真实标签与预测概率之差,与二分类的过程非常类似。
回归问题
已知一个训练数据集 T={(x1,y1),(x2,y2),…,(xN,yN)}, xi∈X⊆Rn , X 为输入空间, yi∈Y⊆R , Y 为输出空间。如果将输入空间 X 划分为 J 个互不相交的区域 R1,R2,…,RJ ,并且在每个区域上确定输出的常量 cj ,那么树可表示为
T(x;Θ)=j=1∑JcjI(x∈Rj)
其中,参数 Θ={(R1,c1),(R2,c2),…,(RJ,cJ)} 表示树的区域划分和各区域上的常数。 J 是回归树的复杂度即叶结点个数。
回归问题提升树使用以下前向分布算法:
fm(x)=fm−1(x)+T(x;Θm), m=1,2,…,M
fM(x)=m=1∑MT(x;Θm)
在前向分步算法的第 m 步,给定当前模型 fm−1(x) ,需求解
Θ^m=argΘmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))
得到 Θ^m ,即第 m 颗树的参数。当采用平方误差损失函数时,
L(y,f(x))=(y−f(x))2
其损失变为
L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]
这里, r=y−fm−1(x) 即当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。
回归问题的提升树算法
输入:训练数据集 T={(x1,y1),(x2,y2),…,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R
输出:提升树 fM(x)
(1)初始化 f0(x)=0
(2)对 m=1,2,…,M
(a)按 rmi=yi−fm−1(xi)计算残差
(b)拟合残差 rmi 学习一个回归树,得到 T(x;Θm)
(c)更新 fm(x)=fm−1(x)+T(x;Θm)
(3)得到回归提升树: fM(x)=m=1∑MT(x;Θm)
举例如下
对于 m=1 :
求 f1(x) 即回归树 T1(x) ,首先通过以下优化问题:
smin[c1minxi∈R1∑(yi−c1)2+c2minxi∈R2∑(yi−c2)2]
求解训练数据的切分点 s :
R1={x∣x≤s} R2={x∣x>s}
容易求得在 R1,R2 内部使平方损失误差达到最小值的 c1,c2 为
c1=N11xi∈R1∑yi c2=N21xi∈R2∑yi
这里 N1,N2 是 R1,R2 的样本点数
求训练数据的切分点。根据所给数据,考虑如下切分点:1.5, 2.5, 3.5, 4.5, 6.5, 7.5, 8.5, 9.5
对各切分点,求出相应的 R1,R2,c1,c2 及 m(s)=c1minxi∈R1∑(yi−c1)2+c2minxi∈R2∑(yi−c2)2
例如,当 s=1.5 时, R1={1} , R2={2,3,…,10} , c1=5.56 , c2=7.50 ,
m(s)=c1minxi∈R1∑(yi−c1)2+c2minxi∈R2∑(yi−c2)2=0+15.72=15.72
现将 s 及 m(s) 的计算结果列表如下
由上表可知,当 s=6.5 时 m(s) 达到最小值,此时 R1={1,2,…,6} , R2={7,8,9,10} , c1=6.24 , c2=8.91 ,所以回归树 T1(x) 为
T1(x)={6.24, x<6.58.91, x≥6.5
f1(x)=T1(x)
用 f1(x) 拟合训练数据的残差 r2i=yi−f1(x), i=1,2,…,10
用 f1(x) 拟合训练数据的平均损失误差: L(y,f1(x))=i=1∑10(yi−f1(xi))2=1.93
对于 m=2 :
求 T2(x) ,方法与求 T1(x) 一样,只是拟合的数据为上一步的残差。可以得到
T1(x)={−0.52, x<3.50.22, x≥3.5
f2(x)=f1(x)+T2(x)=⎩⎨⎧−0.52+6.24=5.72, x<3.56.24+0.22=6.46, 3.5≤x<6.58.91+0.22=9.13, x≥6.5
用 f2(x) 拟合训练数据的平方损失误差是: L(y,f2(x))=i=1∑10(yi−f2(xi))2=0.79
对于 m=3,4,…,M:
继续按上述方法计算,直至求得拟合训练数据的平方误差到可接受范围。
梯度提升
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,梯度提升算法利用最速下降法的近似方法,其核心是利用损失函数的负梯度在当前模型的值
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
梯度提升算法
输入:训练数据集 T={(x1,y1),(x2,y2),…,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R
损失函数 L(y,f(x))
输出:回归树 f^(x)
(1)初始化: f0(x)=argcmini=1∑NL(yi,c)
(2)对 m=1,2,…,M
(a)对 i=1,2,…,N ,计算
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(b)对 rmi 拟合一个回归树,得到第 m 棵树的叶结点区域 Rmj,j=1,2,…,J
(c)对 j=1,2,…,J ,计算
cmj=argcminxi∈Rmi∑L(yi,fm−1(xi)+c)
(d)更新 fm(x)=fm−1(x)+j=1∑JcmiI(x∈Rmi)
(3)得到回归树: f^(x)=fM(x)=m=1∑Mj=1∑JcmiI(x∈Rmi)
算法第(1)步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的数。
第(2a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。
第(2b)步估计回归树叶结点区域,以拟合残差的近似值。
第(2c)步利用线性搜索估计叶结点区域的值,是损失函数极小化。
第(2d)步更新回归树
第(3)步得到输出的最终模型。
Source