XGBoost
XGBoost和梯度提升机都遵循梯度提升决策树的原理,但是XGBoost使用更加正则化的模型公式来控制拟合,这使它具有更好的性能,这就是为什么它也被称为“正则提升”技术。
牛顿法
那么什么是牛顿法呢?在随机梯度下降中,我们用更少的数据点来计算梯度更新的方向,耗时也相对更少,但如果我们想要加速更新,就需要更多的数据点。而在牛顿法中,我们用来计算梯度更新的方向的耗时更多,但是需要的计算点也更少。
需要注意的重要一点是,即使梯度提升机在解决回归问题时使用梯度下降法进行优化,在解决分类问题仍然使用牛顿方法来解决优化问题。而XGBoost在分类和回归的情况下都使用此方法。
牛顿法试图通过构造一个序列{xₖ}解决最小化问题,该序列从随机起点x₀∈ R开始,通过f的二阶泰勒展开序列收敛到f的最小值x*。在{xₖ}附近的二阶泰勒展开式是
二阶导数对于加快梯度下降非常重要,因为在一个损失函数的山谷里,如果算法的修正方向是锯齿状的下降,那么您在沿着山谷的实际梯度上的进展就非常缓慢, 通过二阶导数调整方向将使您的下降方向朝山谷的实际梯度方向倾斜,从而将缓慢的下降转换为更快的下降。
损失函数
我们已经看到了平方损失函数在梯度提升机中的行为,让我们快速看一下XGBoost中平方损失函数的作用:
均方误差损失函数的形式是非常友好的,有一个一次项(通常称为剩余项)和一个二次项。对于其他值得注意的损失函数(例如logistic损失),要得到这样一个好的形式并不容易。所以在一般情况下,我们把损失函数的泰勒展开式推广到二阶
这就成了我们对新树的优化目标。该定义的一个重要优点是,目标函数的值仅依赖于和。这就是XGBoost支持自定义损失的方式。我们可以使用完全相同的以和作为输入的求解器来优化每个损失函数,包括逻辑回归和成对排序
正则化
接下来,我们将处理正则化项,但在此之前,我们需要了解如何以数学方式定义决策树。直观来说,决策树主要是叶节点、数据点和将数据点分配给这些叶节点的函数的组合。数学上它写为:
其中JT是叶数。此定义将树上的预测过程描述为:
- 将数据点赋给一片叶子m
- 将相应分数wₘ₍ₓ₎分配给第m(x)个数据点
在XGBoost中,复杂度定义为:
XGBoost中的超参数描述如下:
当然,定义复杂度的方法不止一种,但这一种方法在实践中效果很好。正则化是大多数基于树的方法处理得不太仔细或忽略掉的一部分。这是因为传统的树学习方法只强调提升纯度,而复杂度的控制则只能基于试探。通过正式定义它,我们可以更好地了解我们的模型正在学习的内容,并获得泛化能力良好的模型
最后一个方程衡量的是树的结构的优劣。
如果听起来有些复杂,让我们看一下图片,看看如何计算分数。
基本上,对于给定的树结构,我们将统计信息和推入它们所属的叶节点,将统计信息求和,然后使用这一公式计算树的质量。该分数类似于决策树中的纯度度量,不同之处在于它还考虑了模型的复杂性
学习树的结构
现在,我们有了一种方法来衡量一棵树的质量。理想情况下,我们将枚举所有可能的树并选择最佳的树,但实际上这是非常棘手的,因此我们将尝试一次优化一个树的部分。具体来说,我们尝试将一片叶子分成两片叶子,其得分为
该公式可分解为: 1)新左叶上的分数;2)新右叶上的分数;3)原始叶上的分数;4)附加叶上的正则化。我们在这里可以看到一个重要的事实:如果增益小于,我们最好不要添加该分支,这正是基于树的模型中的修剪技术!通过使用监督学习的原理,我们自然可以得出这些技术起作用的原因
很好,现在希望我们对XGBoost有一个初步的了解,以及为什么它会这样工作。下次见!
参考文献
https://xgboost.readthedocs.io/en/latest/tutorials/model.html
https://drive.google.com/file/d/1CmNhi-7pZFnCEOJ9g7LQXwuIwom0ZND/view
https://arxiv.org/pdf/1603.02754.pdf
http://www.ccs.neu.edu/home/vip/teach/MLcourse/4boosting/slides/gradientboosting.pdf