摘要:
GBDT-分类
GBDT-回归
前面两篇文章已经详细介绍了在回归和分类下的GBDT算法。这一篇文章将最后介绍一个多分类任务的GBDT。其过程和二分类的GBDT类似,但是有一个地方有很大的不同,下文将详细的介绍。
正文:
下图是Friedman在论文中对GBDT多分类给出的伪代码:
从代码上看,大致和分类时候的过程一样。最大的不同点在于多了一层内部的循环For。
这里需要注意的是:
1.对于多分类任务,GDBT的做法是采用一对多的策略(详情见文章)。
也就是说,对每个类别训练M个分类器。假设有K个类别,那么训练完之后总共有M*K颗树。
2.两层循环的顺序不能改变。也就是说,K个类别都拟合完第一颗树之后才开始拟合第二颗树,不允许先把某一个类别的M颗树学习完,再学习另外一个类别。
算法6使用的是多分类常用的损失函数:
L({
yk,Fk(x)}K1)=−∑Kk=1yklogpk(x) L ( { y k , F k ( x ) } 1 K ) = − ∑ k = 1 K y k l o g p k ( x )
其中 pk(x)=eFk(x)∑Kl=1eFl(x) p k ( x ) = e F k ( x ) ∑ l = 1 K e F l ( x ) (softmax)
对损失函数求一阶导有:
ỹ ik=−[∂L({
yil,Fl(x)}Kl=1)∂Fk(xi)]{
Fl(x)=Fl,m−1(x)}K1=yik−pk,m−1(xi) y ~ i k = − [ ∂ L ( { y i l , F l ( x ) } l = 1 K ) ∂ F k ( x i ) ] { F l ( x ) = F l , m − 1 ( x ) } 1 K = y i k − p k , m − 1 ( x i ) 。
叶子节点的更新值为:
γjkm=K−1K∑xi∈Rjkmỹ