撰写文档动机
网上有很多解析xgboost算法的文章, 对算法的解析有一些问题: 一是没有独立简介,成文这篇抄那篇; 二是逻辑混乱,一些算法大佬写文章出于记笔记的心态就没打算把算法讲清楚, 小白盲人摸象讲了很多细节,却没有整体视角; 三是深度的把控, 撰写社区文字不是撰写论文, 如何根据社区平均水平写出一篇带来价值的文章也很有讲究。 这里撰写一篇基于理解官网文档的前提下,自上而下逻辑梳理后的Xboost解析文章。
Abstract
Xgboost是基于gradient boosting tree,由Chen Tianqi 为主要作者的Distributed (Deep) Machine Learning Community (DMLC)开发。把握几个点可自上而下快速理解Xgboost,boosting算法的关键是迭代,每次tree迭代后提升了什么? 损失函数可以给出答案。设计损失函数决定每次迭代tree的的生成方法, xgboost每个节点split gain score公式(类比cart tree的GINI Index), 每次生成的tree会成为下次迭代的参数,优化下次迭代。
关键词: 节点分割,损失函数,迭代
损失函数
Xgboost的损失函数分为两部分,等式右边前半部分为非常用户友好的MSE, 后半部分为历次迭代tree的regulization term惩罚模型复杂度。
通过一系列推导后, 损失函数被优化为描述所有leaf节点score得分的函数,这里w是第t次迭代的变量,j为leaf 节点序号, T={t次迭代所有叶节点},
G
j
,
H
j
{G}_{j},{H}_{j}
Gj,Hj在本次迭代中为常数。
这样复杂的损失函数可以被理解为以
w
j
{w}_{j}
wj为参数的二次函数。依此得出最优的
w
j
∗
{w}^{*}_{j}
wj∗,
o
b
j
∗
{obj}^{*}
obj∗既是第t次迭代的损失函数也是描述tree结构好坏的标准。
所以在第t次迭代, 第j个leaf 节点判断是否继续分割节点时T变为T+1,为obj增加
γ
\gamma
γ, 所以收益Gain 大于0时,才会收益,
o
b
j
∗
{obj}^{*}
obj∗可以继续变小tree结构持续优化,反之停止split,进入下次迭代。
迭代
boosting 是集成算法(Ensemble_learning)中三大算法之一, 另两种为bagging, stacking 这里不一一赘述。 这里简单解析下为什么xgboost每次迭代会优化回归树的结构。
这里从tree function
f
(
x
)
f(x)
f(x) 作为切入点:
q是把每个d-dimension的实例点x assign到 {1,2,…T} leaf节点中某个节点的fuction。但为什么
q
t
{q}_{t}
qt 会优于
q
t
−
1
{q}_{t-1}
qt−1。更高屋建瓴的观点还没总结出来, 微观的看是每次node split时的参数优化了。
注明:
y
^
i
t
−
1
=
y
^
i
t
−
2
+
f
t
−
1
(
x
i
)
{\hat{y}}^{t-1}_{i}={\hat{y}}^{t-2}_{i}+{f}_{t-1}({x}_{i})
y^it−1=y^it−2+ft−1(xi)
Leaf Node Split Details
引用一下 Tianqi Chen 大神的paper XGBoost: A Scalable Tree Boosting System
大神的论文提出的算法的prototype,算法2 input X (n*m) 矩阵, 算1 to m个 连续feature 中根据算法1 得到最佳的分割点, 算1 to m 个特征的G,H进入下一步迭代。
Basic Exact Greedy Algorithm 会枚举所有可行split点 sort feature,然后计算。
Approximate Algorithm 根据percentile 建议一些candidate splitting points。
Weighted Quantile Sketch方法。
Sparsity-aware Split Finding 适用于当X为稀疏矩阵, null values的情况,
结语
回国之后会产生这样的认知, 学习网上的资料不如看官方文档,源代码,原论文, 在不同的论坛上进进出出获取的知识十分有限。 希望这篇文章能讲xgboost原理讲到入门得深度,自上而下得逻辑组织也便于大家理解。 如果大家没有看懂这篇文章,或认为此文没有讲透算法,欢迎大家查阅原始资料,这也是作者得初衷。 欢迎大家提出宝贵的改进意见。