分类问题主要分为二分类、多分类。我们先推导一下 XGB 是如何解决二分类问题,再去理解 XGB 如何解决多分类问题。
二分类问题时,我们一般会使用 Simoid 函数,将模型的输出值映射到 0-1 范围内,得到模型预测 1 类别概率。Simoid 函数的公式及其函数图像如下:
我们训练模型的目标:让模型把预测出的正样本的概率越高越好,负样本的概率越低越好。假设:模型预测某个样本为 1 的概率为 P,则预测为 0 的概率为 1-P。那么,某个样本的预测正确的概率表示如下:
如果该样本的真实类别是 1 的话,那么 \(y_{i}\) 的值就是 1,否则就是 0. 模型希望每个样本对应上面公式的输出的值越大越好。注意,这里的 P 就是上面的 Sigmoid 公式,Simoid 中 x 就表示模型的输出值。我们接下来,将其带入到上面的公式中:
我们将上面公式的每一项取负对数,变成如下:
问题就变成了,我们希望上面公式的值越小越好,上面就是用于二分类问题的负对数损失函数。将上面的公式展开,化简如下:
我们从 XGB 推导过程中,发现 XGB 计算分类增益时,需要用到的样本的一阶导数、二阶导数。所以,我们还需要推导出损失函数的一阶导、二阶导计算公式:
再次强调:XGB 使用的是加法模型,所以损失函数中的 x 指的是前 N-1 棵树的输出值累加。损失函数的一阶导表示公式如下:
损失函数的二阶导如下:
最后得到损失函数的一阶导、二阶导公式如下:
上面公式中,我们发现一阶导、二阶导的公式都是关于预测概率,\(y_{i}\) 表示的样本的真实目标值,在分类问题中,该目标值表示的是概率值。对 1 类别样本,该值为 1,对 0 类别样本,该值为 0。P 则是前 N-1 棵树对某个样本的输出概率。从一阶导、二阶导也可以知道,XGB 在构建每一棵弱学习器(决策树)时,都是在逼近样本目标的概率值。
我们知道 XGB 中的每一棵弱决策树,在考虑分裂时,使用的是考虑到结构化损失(真实值和目标值的差距,树的复杂度)的增益计算方法,增益计算公式在 XGB 公式推导时得到的,我直接从我另一篇文章截图过来,如下:
该分裂增益表示的是,分裂前的损失减去分裂后的损失,如果值大于0,并且该值越大,说明分裂之后,模型对训练样本的拟合效果越好。所以,分裂增益是越大越好,那我们就依次计算每个候选的分裂点,选择分类增益最大的点作为最终的分裂点。
分裂过程直到触发了停止分裂条件,例如:每个叶子结点的样本数量低于某个阈值,或者树的深度达到某个阈值。
另外,我们还需要理解到的是,XGB 最终输出的对每个样本属于某个类别的概率,是通过将每一棵弱决策树的输出值累加之后,送入到 Sigmoid 函数得到的。注意:每一棵弱决策树输出的不是概率值。
那么,每一个弱决策树的每一个叶子结点输出的值到底是什么呢?这个值是由落在该叶子结点上的样本,通过下面公式计算得到的(该公式也是通过 XGB 公式推导得到的):
公式中, w 表示叶子结点的输出值,该输出值是由 \(G_{i}、H_{i}\) 计算得到,G 表示落在该叶子结点上所有样本的一阶导值之和,H 表示落在该叶子结点上的所有样本的二阶导之和。λ 是用来调节叶子结点输出值的超参数。当多个叶子结点输出值越不稳定,则带来的损失就越大。λ 是该损失的系数,该系数越大说明不稳定带来的损失就越大,模型就要越重视模型的输出稳定性。
前面是 XGB 用来解决二分类问题。假设:我们有更多的分类,XGB 怎么解决呢?
我们在构建二分类的 XGB 时,每一次迭代都会构建一个弱决策树。如果是多分类,比如有 5 个类别,则 XGB 每一个弱决策树在每一次迭代时,会构建 5 个弱决策树,分别对应 5 个不同的类别。
假设,此时来了一个未知的样本,我们要通过 XGB 去预测其类别 。首先,扔到不同类别的一系列弱决策树中得到输出值(弱决策树的加法结果),最后送到 softmax 得到该样本属于不同类别的概率,将该样本归类于概率最大的类别。
最后,补充一下,关于 XGB 的问题及优化。我们思考下,当数据集中特征数量很多,并且样本数量也很大的话,每次对不同的特征排序、计算大量切分点的分裂增益,这将会很耗时。所以,实际上,XGB 采用了预排序,并分桶的思想,将每一个特征划根据桶的数量,划分出 N 个粗略的切分点,再进行分裂增益计算。简单来说,就是 XGB 在训练时,并不会真的去计算每个可能的切分点的分类增益,而是近似去计算更少量的粗略划分出的分裂点的信息增益。
当然,我们也可以让每次构建弱决策树时,使用特征子集,而不是使用全部特征,这也能减少模型训练的计算量。