收入即学习

理解XGBoost原理

2018-06-02  本文已影响429人  冰源

本文参考文章:

  1. 《XGBoost中文文档》 http://xgboost.apachecn.org/cn/latest/model.html
  2. 《xgboost的原理没你想像的那么难》https://www.jianshu.com/p/7467e616f227
XGBoost

1. CART

CART:叶子节点处预测的是一个人是否喜欢电脑游戏的评分,而非是否喜欢

2. Boosting Decision Tree

Tree Ensemble 分类器权重更新公式:ε是上一时刻的错误率 数据权重更新公式:y^是实际标签,f(x)是求出的标签

3. Gradient Boosting Decision Tree

为了求得最好的模型(求得模型参数),我们构造:损失函数与模型参数之间的函数 loss = f(θ),并通过“梯度下降”的方式求得θ

θ = θ + Δθ —— 这是我们更新θ 的方式

梯度下降

在提升树(Boosting Decision Tree)的大前提下,我们要寻找的θ是所有树的参数(树的结构、叶子节点的分数),但是这样的话参数太多,因此为了便于计算,我们先将一棵树当作为一个θ,在损失函数与某一棵树之间构建关联,loss = f(tree),之后再将深入考虑树的参数

loss & tree

以前是loss对θ求导,现在变成了loss对tree求导,这个寻求树的过程就是Gradient Boosting Decision Tree求解的过程。

4. XGBoost

我们尝试使用数学公式表示XGBoost模型:用f(x)来表示一棵决策树,F表示所有决策树的一个集合,K棵决策树累加起来就是最终的预测结果。我们要做的就是:带入 x 求得 y^,计算 y 与 y^ 的差距(loss),沿着loss梯度下降的路径求解参数。

K棵决策树f(x)的累加,F表示所有可能的CART树

定义XGBoost的目标函数(它将衡量我们求出的值与实际值之间的差距):

XGBoost目标函数

除了loss之外,这里还加了一个正则化。正则化的作用就是控制模型的复杂度,Ω(f)就表示了一棵树的复杂度。树的复杂度过高会导致过拟合。这里正则化也算是起到了预剪枝的作用。

至于loss函数怎么定义?
如果是回归问题,我们常用的损失函数是MSE,即:

回归问题

如果是分类问题,我们常用的损失函数是对数损失函数:

分类问题

正则化又怎么定义?
xgboost是这样定义的:

xgboost的正则化项

T代表的是叶子节点的个数,而ω则是每个叶子上的分数。γ和λ是需要手动调整的超参,它们值越大那么树的模型就越简单。至于树结构中的其他参数,正则化中就没有更多体现了,主要是T和ω足够了。

加法训练

下面通过大量公式来说明加法训练(如上图)中是如何每次优化一棵树的:

如何优化某一棵树(这个一定要看,重点)

学习树结构,由loss=f(tree)进入tree的结构细节
在我们将一片叶子分成两片时,采用如下分数衡量:

二分划分

这个公式可以分解为 1) 新左叶上的得分 2) 新右叶上的得分 3) 原始叶子上的得分 4) additional leaf(附加叶子)上的正则化。 我们可以在这里看到一个重要的事实:如果增益小于 γ,我们最好不要添加那个分支。这正是基于树模型的 pruning(剪枝) 技术!

再看那个公式,如果Gain值是大于0的,说明下面这个值变大了,那么obj*就变小了,那就值得划分。

obj*相关公式

对于真实有价值的数据,我们通常要寻找一个最佳的分割。为了有效地做到这一点,我们把所有的实例按照排序顺序排列,如下图所示。

然后从左到右的扫描就足以计算所有可能的拆分解决方案的结构得分,我们可以有效地找到最佳的拆分。

上一篇 下一篇

猜你喜欢

热点阅读