机器学习 | 详解GBDT在分类场景中的应用原理与公式推导

本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型。

在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理。GBDT最大的特点就是对于损失函数的降低不是通过调整模型当中已有的参数实现的,若是通过训练新的CART决策树来逼近的。也就是说是通过增加参数而不是调整参数来逼近损失函数最低点。

如果对于这部分不是很理解的话,可以通过下方的链接回顾一下之前的内容:

机器学习 | 详解GBDT梯度提升树原理,看完再也不怕面试了

逻辑回归损失函数

在我们开始GBDT模型原理的讲解和推导之前,我们先来回顾一下逻辑回归当中的相关公式和概念。

首先,我们先来写出逻辑回归的预测函数:

\[h_{\theta}(x) = \frac{1}{1 + e^{-\theta^Tx}}
\]

图像画出来是这样的,其中的\(h_{\theta}(x)\)表示表示了模型预测x这个样本属于类别1的概率。

在二分类问题当中,只有0和1两个类别, 两个类别的概率只和为1。所以我们可以得到\(P(y=0|x;\theta)=1 – h_{\theta}(x)\)

我们希望模型在y=0的时候,使得\(1 – h_{\theta}(x)\)尽量大,否则则使得\(h_{\theta}(x)\)尽量大,我们用指数的形式把两者综合写出了它的损失函数L。

\[l(\theta) = -h_{\theta}(x)^y(1 – h_{\theta}(x))^{1-y}
\]

这个值涉及到指数,计算起来不太方便,所以我们会对它求对数进行简化。等式两边都取对数之后,可以得到:

\[L(\theta)=log(l(\theta))=-\sum_{i=1}^N[y_i\log h_{\theta}(x_i)+(1 – y_i)\log (1 – h_{\theta}(x_i))]
\]

这个就是逻辑回归损失函数的由来。

GBDT二分类

我们将GBDT模型应用在二分类的场景当中的原理其实和逻辑回归一样,只不过在逻辑回归当中\(h_{\theta}(x)\)是一个线性函数,而在GBDT当中,\(h_{\theta} = \sum_{m=1}^M f_m(x)\),是一个加法模型

在GBDT的回归问题当中,\(h_{\theta}\)就是GBDT产出的最后结果,而在二分类问题当中,我们还需要对这个结果加上一个sigmoid函数。我们令上面的\(h_{\theta}\)\(F_M(x)\),所以模型可以表达为:

\[P(y=1|x) = \frac{1}{1 + e^{-F_M(x)}}
\]

我们把这个式子带入逻辑回归的损失函数当中,可以得到:

\[\begin{aligned}
L(x_i, y_i | F_M(x)) &= -y_i\log (\frac{1}{1 + e^{-F_M(x_i)}}) – (1 – y_i)\log (1 – \frac{1}{1 + e^{-F_M(x_i)}} )\\
&= y_i \log(1 + e^{-F_M(x_i)}) + (1 – y_i)[F_M(x_i) + \log (1 + e^{-F_M(x_i)})]
\end{aligned}
\]

我们对损失函数计算负梯度,也即计算\(L(x, y |F_M(X))\)\(F_M(x)\)的偏导:

\[-\frac{\partial L}{\partial F_M} = y_i – \frac{1}{1 + e^{-F_M(x)}} = y_i – \hat{y_i}
\]

这个负梯度也就是我们常说的残差,这个残差的结果和我们之前在回归问题当中的推导结果非常近似。它表示预测概率和真实概率的概率差,这个残差就是下一棵CART树的训练目标。

训练过程

我们再把模型训练的整个过程给整理一下,把所有的细节串联起来。

首先我们先明确几个参数,M表示决策树的数量。\(F_m(x_i)\)表示第m轮训练之后的整体,\(F_m(x_i)\)即为最终输出的GBDT模型。

  1. 初始化

    首先,我们创建第一棵回归树即\(f_1(x)\),在二分类问题当中,它是先验信息,所以:

    \[f_1(x) = \log \frac{p1}{1-p1}$$,p1表示**样本中类别1的比例**

    \]

    i. 对于第2到第m棵回归树,我们要计算出每一棵树的训练目标, 也就是前面结果的残差:

    \[r_{mi}=-[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)}=y_i – \hat{y_i}
    \]

    ii. 对于当前第m棵子树而言,我们需要遍历它的可行的切分点以及阈值,找到最优的预测值c对应的参数,使得尽可能逼近残差,我们来写出这段公式:

    \[c_{mj}=\mathop{\arg\min}_{c} \ \ \ \sum_{x_i\in R_{mj}}L(y_i, f_{m-1}(x_i) + c)
    \]

    这里的\(R_{mj}\)指的是第m棵子树所有的划分方法中叶子节点预测值的集合,也就是第m棵回归树可能达到的预测值。其中j的范围是1,2,3…J。

    接着,我们更新\(f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})\),这里的I是一个函数,如果样本落在了\(R_{mj}\)节点上,那么I=1,否则I=0。

  2. 我们得到

    \[F_M(x) = f_M(x) = \sum_{m=1}^Mf_m(x)=\sum_{m=1}^M\sum_{j=1}^J c_{mj}I(x \in R_{mj})
    \]

  3. 某条样本类别为1的概率为:

    \[P(x_i) = \frac{1}{1 + e^{-F_M(x_i)}}
    \]

多分类问题

二分类的问题解决了,多分类也并不困难,其实也只是二分类的一个简单拓展。

我们假设样本的类别数量是k,那么我们需要k个不同的树集合来拟合每个类别的概率。我们写出类别q的概率的公式:

\[P(y=q|x) = \frac{e^{F_q(x)}}{\sum_{i=1}^k e^{F_i(x)}}
\]

softmax函数的损失函数为:\(L = -\sum y_i \log(P(y_i | x))\),虽然从公式里看这是一个求和值,但是对于多分类问题来说,只会有一个类别为1,其余均为0,所以只会有一项不为0,我们假设这一项为q。我们代入求出它的负梯度:

\[-\frac{\partial L}{\partial F_q} = y_q – \frac{e^{F_q(x)}}{\sum_{i=1}^k e^{F_i(x)}}= y_q – \hat{y_q}
\]

可见在多分类问题当中,这k个树集合同样是拟合真实的样本标签与预测的概率的差值,本质上和二分类问题是一样的。

总结

到这里,关于GBDT在分类场景当中的原理我们也介绍完了。其实整篇推倒下来,无论是过程和结果都和回归问题大同小异。只不过由于分类问题用到了sigmoid函数,使得计算偏导以及残差的过程稍稍复杂了一些,其他并没有什么本质差别。

从今天的文章当中我们也可以看出来,GBDT模型适用的范围很广,回归、二分类以及多分类问题都可以适用,是一个非常强大的模型。也正因此,它在深度学习兴起之前一度非常流行,基于它也衍生出了许多的改进的版本和应用。比如XGboost,GBDT + LR等等。也因此在面试的时候经常会问到其中的问题,如果有准备面试的同学,建议一定要将原理吃透哦。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。