GBDT分类算法
GBDT无论用于分类还是回归, 使用的都是CART回归树. 原因是GBDT每轮的训练是在上一轮训练模型的负梯度值基础之上训练的, 这就要求每轮迭代的时候, 弱分类器叶子节点的输出是要拟合负梯度的, 从而达到梯度下降的模拟. 如果直接输出类别, 类别的值没有意义.
而分类任务的真实值就是真实标签, 对于二分类任务, 就是{0,1}, 而叶子节点的输出是没有限制的, 如果将这两个值通过损失函数联系在一起呢?
对数损失函数
似然函数
假设模型的输出为F(x), 我们从概率的角度, 计算损失. 假设hθ(x)表示二分类结果为1的概率, 因此分类结果为0的概率为1−hθ(x):
hθ(x)=1+e−F(x)1 P(Y=1∣x;θ)=hθ(x)P(Y=0∣x;θ)=1−hθ(x) 似然函数为P(Y=y∣x;θ), 即模型预测样本对应标签的概率, 对于二分类任务, 可以记为:
P(Y=y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
y的取值为{0,1}, 因此右侧的前面一项对应的是标签为1时的概率, 后面一项是标签为0是对应的概率.
对于多分类任务, 假设有k=1,2,⋯,K类, 使用yk表示当前样本的是不是属于第k类, 假设真是样本是第j类, 则似然函数为:
P(Y=y∣x;θ)=∑iKpθ;k(x)yk
pθ;k(x)是模型给出的样本属于第k类的概率. 在所有yk中, 只有yj=1, 其余全部为0.
对于二分类, 单个样本的二分类似然函数如上, 将所有样本的概率相乘, 就得到了整个训练集的似然函数:
J(θ)=i=1∏NP(Y=yi∣xi;θ)=i=1∏N(hθ(xi))yi(1−hθ(xi))1−yi 并处理成对数似然函数:
J(θ)=i=1∑N[yiloghθ(xi)+(1−yi)log(1−hθ(xi))] 使用最大似然估计方法优化参数, 想要最大化J(θ), 取J(θ)的相反数, 记为L(θ), 最大化J(θ)等价于最小化L(θ), 最大似然估计转为使用梯度下降法求解.
L(θ)=−N1L(θ)=−N1i=1∑N[yiloghθ(xi)+(1−yi)log(1−hθ(xi))] 对于多分类, 仍然是所有样本相乘, 得到整个训练集的似然函数:
P(Y=yi∣x;θ)=i=1∏KP(yi∣x)yi=i=1∏Khθ;k(x)yi 并求对数, 再去相反数, 得到多分类情况下的对数损失函数:
L(θ)=−logP(Y=yi∣x;θ)=−logi=1∏KP(yi∣x)yi=−i=1∑Kyilog(hθ;k(x)) GBDT二分类原理
假设GBDT第M步迭代之后, 生成M棵树, 组成的学习器为F(x), 将其带入单个样本的二分类对数损失函数的公式, 有:
y^=hθ(x)=P(Y=1∣x)=1+e−F(x)1 L(yi,F(xi))=yilog(1+e−F(xi))+(1−yi)[F(xi)+log(1+e−F(xi))] 依旧对损失函数求负梯度, 得到:
rm,i=−∂F(xi)∂L(yi,F(xi))F(x)=Fm−1(x)=yi−1+e−F(xi)1=yi−y^i 求得每个样本的负梯度后, 决策树拟合的叶子结点的输出值应为:
cm,j=cargminxi∈Rm,j∑L(yi,Fm−1(xi)+c) 在使用对数损失函数的情况下, 解使用近似值:
cm,j=∑xi∈Rm,j(yi−rm,i)(1−yi+rm,i)∑xi⊂Rm,jrm,i 因此完整的二分类GBDT算法过程如下:
初始化第一个弱学习器F0(x)=log1−P(Y=1∣x)P(Y=1∣x)
依次建立M棵回归树m=1,2,⋯,M
对于每个样本i, 计算当前的负梯度rm,i=−[∂F(x)∂L(yi,F(xi))]F(x)=Fm−1(x)=yi−1+e−F(xi)1
使用负梯度拟合出一棵回归树, 共Jm个叶子结点, 第j个叶子节点记为Rm,j, 每个叶子节点的输出为cm,j=∑xi∈Rm,j(yi−rm,i)(1−yi+rm,i)∑xi⊂Rm,jrm,i
更新强学习器Fm(x)=Fm−1(x)+∑j=1Jmcm,jI(x∈Rm,j)
得到最终的学习器FM(x)=F0(x)+∑m=1M∑j=1Jmcm,jI(x∈Rm,j)
GBDT多分类原理
GBDT中的多分类, 要对每个类别都单独地建模一个回归树, 给某一个分类输出具体值. 因此, 如果是K分类任务, 最后迭代M轮, 那么生成的树的总数量为KM. 同时, 每个分类的子树独立进行提升, 分类之间相互不影响, 最终得到K个GBDT, 用来判断样本属于该类的概率, 即第k类GBDT的输出为Fk(x)
对于输出, 使用softmax的逻辑, 每个类别的概率为:
P(y=1∣x)=∑i=1keFi(x)eF1(x)P(y=2∣x)=∑i=1keFi(x)eF2(x)……P(y=K∣x)=∑k=1KeFK(x)eFK(x) 多分类依然使用对数损失函数, 将所有类别的输出进行综合, 单个样本的损失函数为:
L=−k=1∑KyklogP(yk∣x)=−k=1∑Kyklog∑j=1KeFj(x)eFk(x) 对应的负梯度为:
−∂Fk∂L=yk−∑j=1KeFj(x)eFk(x)=yk−p(yk∣x) 这里样本x的真实标签为第k类, 只有这棵树上有负梯度. 考虑整个训练集, 第k类对应的GBDT, 只使用标签为k的样本进行更新.
每类个GBDT对应一个二分类, 迭代生成的方法见上.
参考资料