GBM 与 GBDT 与 XgBoost
来源:互联网 发布:阿里云计算与大数据 编辑:程序博客网 时间:2024/04/29 10:01
GBM 与 GBDT 与 XgBoost
Gradient Boost Decision Tree 是当前非常流行的机器学习算法(监督学习),本文将从渊源起逐层讲解 GBDT,并介绍目前流行的 XgBoost。另有“Adaboost 详解”、“GLM(广义线性模型) 与 LR(逻辑回归) 详解”为本文之基础。
0. Hello World
这里列举一个最简单常见的 GBDT 算法。
对于回归问题,GBDT 通过一组 decision tree 直接组成的 ensemble
每一轮迭代
residual 即上一轮结束后,整体模型的残差;所以 GBDT 会关注到之前迭代中没有处理好的样本,一步步优化细节,以达到越来越好的拟合(当然也会有 overfitting 的问题)。
实际上,GBDT 中其实包含了非常广泛的思想和应用,本文将详细阐述。
1. Some Foundations
GBDT 包含了多种机器学习常见的概念方法,这里将分别介绍几个重要的基础概念。
1.1 Gradient Descent
梯度下降是机器学习的 wellknown fashion,对于一个优化目标(loss function),我们要从当前位置(模型状态)走一小步,让 loss 最快的下降(减少)。下面是对 loss function 的一阶泰勒展开:
wt 表示第 t 轮迭代时,当前的 weight vectorv 表示走的方向(向量,有 length 约束)η 表示走的步长(标量,一般是一个较小的正数)
目标其实是找到一个让 loss function 下降最快的方向
1.2 Newton Method
牛顿法实际上就是在 Gradient Descent 方法上更进一步,通过 loss function 的二阶导数信息来获取最优的增量
首先对 loss function 做二阶泰勒展开:
接下来是一个 trick,这里对
牛顿法通常收敛速度比梯度下降方法快,但是需要计算二阶导数,且要求海森矩阵正定,所以后续衍生出了一系列近似的拟牛顿法。
1.3 Boosting
提升方法属于 ensemble 集成方法的一类。其在迭代的每一轮中,选择最合适的 weak learner 集成到整体模型中,让整体模型越来越强,提升为 strong learner。注意,它只能串行地训练,因为每一轮迭代都要根据当时模型状况选择最好的子模型。与 Boosting 不同的 Bagging(例如 Random Forest)则可以并发训练。
每一个 weak learner 其实就是一个函数,相对抽象地说,boosting 通过 optimization in function space,找到一组合适的函数集成起来。这个套路类似统计学习中的 Additive Model。
1.4 Generalized Linear Model
线性模型 LM 通过 least square
但是 GLM 把高斯分布推广到了任意 Exponential Family Distribution,例如 Bernoulli Distribution, Laplace Distribution, Gamma Distribution 等等;这极大拓展了 LM,能够处理例如 Classification 的问题。 本质上,这里使用了连接函数把 linear predictor 和 expected response 关联到了一起,所以模型能够学习一个合适的 linear predictor 来预测服从某个分布的 expected response。
GBDT 使用了类似的方式。常规 GBDT 的子模型是 Regression Tree,所以所有子模型的结果加和
这一套路类似统计学习中 Additive Model to Generalized Additive Model。
1.5 Decision Tree
GBDT 基于 GLM,一般使用 Regression Tree;不展开。
2. Gradient Boosting Machine
From AdaBoost to GBDT
2.1 AdaBoost
Gradient Boosting 这一思想来源自 AdaBoost,对于 AdaBoost 来说,Gradient Descent 如下:
∑t−1τ=1ατhτ(xi) 表示已经模型已经集成的部分ht(xi) 表示需要寻找的 loss 最速下降方向,这里是 Classifierη 表示需要寻找的,在最速下降方向上最合适的步长
其每次迭代都要选择一个最好的方向,以及方向上最合适的步长(Steepest Descent),最后把一系列的方向(
2.2 Gradient Boosting
Gradient Boosting 是通过 GLM 思路对 AdaBoost 推广,Gradient Descent 如下:
这里结合了 GLM,和之前 AdaBoost 有俩个区别:
ht(xi) 使用 Regressor,这里∑Tt=1αtht(x) 类似 GLM 中的 linear predictor- loss function 没有限制,这里表达为
Loss(∑Tt=1αtht(xi),yi) ;通常基于 GLM 的套路根据 response variabley 的分布,结合对应的 link function 来确认 loss
GBM 的应用场景被大幅拓展了,不局限与 exponential error 或者 least square;正如 GLM 一样拓展到了各种
2.3 Subtle Different of Gradient Descent
AdaBoost 和 GBDT 在梯度下降的细节上有不一致。本质原因在于函数方向 scale,注意,我们寻找的
AdaBoost 使用 Classifier 做子模型
GBDT 使用 Regressor 做子模型,这必须加以约束才能在函数空间表示一个方向,正如梯度下降标准套路
2.4 Standard Gradient Boosting for GBM
GBDT 原文论文 Gradient Boost 套路如下:
先对模型进行一个初始化,这相当于确认一个先验,例如普通回归问题的话就使用样本的
之后有
- 计算当前模型的负梯度方向
y ~ - 寻找一个尽量平行于此方向的子模型
h(x) ,是要找一个方向,scale 不重要;h(x) 我们通常假设是某种模型,例如回归树,所以这里寻找的是h(x,am) 的模型参数am - 确定了模型(方向)后,在原始 loss 上求解出最合适的步长,即 Steepest Descent 的 greedy 套路;是为了尽快下降,减少我们需要集成的子模型数量
4. Gradient Boosting Decision Tree
there is an interesting trick with tree
GBDT 可以说是对 GBM 的一种实现,其子模型使用 Regression Tree。但是,基于 Decision Tree 的特点,Friedman 原论文对其最优化过程做出了非常有意思的调整(
4.1 Boosting Tree
之前也有提到,寻找函数方向
- 树模型把样本划分到 J 个 region 中(即 J terminal nodes)
- 每个 region 使用
Rj 表示(实际上暗含了一组规则来切分出这个 region) - 每个 region 对应一个输出
bj
分割出的
4.2 More of η
标准 GBM 套路中,求解最适步长
但是,对于 GBDT,每一个
其中
并且,这
4.3 Example of Binary Classification
这里以二分类问题常用的 loss(negative binomial log-likelihood)实例分析 GBDT 优化过程(又被称为 LogitBoost)。
Loss 函数即
GBDT 原文论文 二分类训练套路如下:
其中负梯度求解过程如下:
yi~ =−[∂L(yi,F(xi))∂F(xi)]F(x)=Ft−1(x)=−−2yiexp{−2yiFt−1(xi)}1+exp{−2yiFt−1(xi)}=2yi1+exp{2yiFt−1(xi)} 其中 terminal node 最优值的计算公式:
是对步长的优化目标γjt=∑xi∈Rjtyi~∑xi∈Rjm|yi|~(2−|yi|~) 利用 Newton-Raphson step 近似推导出的结果。γjt=argminγ∑xi∈Rjtlog(1+exp{−2yi(Ft−1(xi)+γ)})
另外,这里额外提一下 K 分类的问题。K 分类需要训练 K 组不同的树(即每轮迭代需要训练 K 颗不相关的树);每一组树结果叠加成 linear predictor 后输出一个判别概率,这和广义线性模型中处理 K 分类的思路是一模一样的。
5. XgBoost
5.1 全新的 loss function(被称为 objective function)
XgBoost 是对陈天奇对 GBDT 的一个非常高效的实现;不仅如此,其最重要的一个新特性是对 Regularization 的强化:heuristic to objective。传统的树模型生成结构时,往往只考虑 impurity,把 complexity 的控制完全交给 heuristic 策略;但是 XgBoost 将部分控制吸收到了优化目标 objective(即 loss function)。
具体实现上涉及两个细节:
- 使用了牛顿法,通过一阶、二阶导数优化 loss function
- 向 loss function 中加入了 regularizaiton term
在传统 GBM 的优化思路中,我们是每次迭代中依次找到合适的函数方向
XgBoost 也是 GBM,但是使用牛顿法(后续详解),直接寻找一个函数
XgBoost 和之前 GBM 的一个区别是这里要求上述的 Loss 函数二阶可导。接下来就是对这个 objective function 的各种变化,确定最优化求解的步骤。
5.2 Newton Boosting Tree
5.2.1 Taylor Expansion Approximaiton of Loss
1.2 中有详细解释 Newton Method。首先,Recall 函数的二阶泰勒展开公式为:
所以对 objective function 近似如下:
上式中的
去除末尾的 constant,并去除对于第 t 轮迭代已经是常数的
5.2.2 Tree Loss
类似于 4.1 中将目标函数按照 terminal node 切为一系列函数
即函数
为了方便目标函数改写,这里定义集合
现在,对原 objective function 做如下改写:
这里基于 Tree Structure,把优化目标从
5.2.3 Tree Regularization
基于树模型,定义
整合上 regularisation term 后,objective function 为:
5.2.4 Newton Method
按照牛顿法标准套路,我们可以进一步化简上述 objective function。固定住 tree structure 和超参数,对于某一 terminal node
所以,对于任一确定的 tree structure,我们可以得到各个 terminal node 的最优
接下来,一个有点 tricky 的方法:我们直接把
最终的 XgBoost 训练流程,正是通过这一评估函数生成合适的 Tree Structure,然后再求出其各个叶子节点对应值
5.3 XgBoost Algorithm
理论基础见 5.2,具体应用中,每轮迭代生成一个另当前 objective 尽量最小的 Regression Tree。GBDT 的原论文感觉更强调各类 loss function 上的应用,展现类似 GLM 的通用性;而 XgBoost 非常关注具体的 Decision Tree 的生成细节。
单个 Tree 也是一个 greedy(都是这么玩的~)的生成过程,对于所有当前叶子节点,会扫描所有 feature 维度所有可能的 split,来找到一个最优 split 使得 Gain 最大(即 loss 减少最多):
上式即 5.2 中推导的评估函数,使用 split 后俩个节点的 loss 和减去之前节点的 loss,并附加上增加一个节点的 regularizer
和各类树模型一致,这里也是一个纯 search 的过程,细节上会涉及连续值、离散值、缺失值的不同应对策略,以及各式 heuristic 策略控制树的复杂度,这里不做展开。
另外,XgBoost 在集成每一轮迭代时建议使用 shrinkage
5.4 Some regularization of GBDT
这里进一步列举几个常见 regularization 思路,在 XgBoost 以及后续的 LightGBM 上都有体现:
Objective Function 控制复杂度
可以说是 XgBoost 的主推特性;传统的 decision tree 只通过 heuristic 策略控制split 策略控制复杂度,很通用,例如:
- Maximum of Tree Depth
- Maximum of Terminal Nodes,
- Minimum of Gain of Split,
- Minimum of Node Size
Pruning
又分为前剪枝 Pre-Pruning 和后剪枝 Post-Pruning:- 前剪枝的话使用一些 split 策略,直接停止一些节点的生长,但是有可能会遇到 greedy 的问题,有些路径可能一开始 gain 很小但是后续逆袭;
- 后剪枝的话先完全生成(限制 depth)树结构,再逐渐递归地从叶子节点剪枝(也会有一系列策略、算法),这个结构太大,较容易 overfitting。
行采样,row-subsampling
正如 Random Forest 这类 bootstrap 套路;抗 overfitting列采样,column-subsampling
这也是很多 ensemble 方法的通用套路,包括 Isolation Forest;抗 overfitting~Shrinkage
每次学习到的子模型都以一定比例衰减权值,刻意降低拟合的效率来避免过拟合;GBDT 通用套路Early Stop
机器学习通用套路,对于 GBDT 这种 emsemble 模型更方便;由于模型可加性,训练完成后,最终模型到底集成多少棵树,是可以随时调整的~
Reference
XgBoost introduction: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
Origin of GBDT: Greedy function approximation a gradient boosting machine. J.H. Friedman
- GBM 与 GBDT 与 XgBoost
- 机器学习---GBDT、xgboost与Light GBM优缺点比较(1)
- xgboost 与 GBDT算法
- xgboost与gbdt
- GBDT&GBRT与XGBoost
- xgboost与GBDT区别、优势
- RF GBDT XGBOOST的区别与联系
- xgboost的优点与GBDT对比
- RF GBDT XGBOOST的区别与联系
- XGBOOST与GBDT的最大区别
- XGBoost 与 Boosted Tree(GBDT)(转)
- GBDT的正则化及与XGBOOST区别
- Gradient Tree Boosting (GBM, GBRT, GBDT, MART)算法解析和基于XGBoost/Scikit-learn的实现
- Xgboost gbdt
- XGBOOST GBDT
- xGBoost GBDT
- 4.3、adaboost/GBM/xgboost实例
- 机器学习高频面试题之---简述GBDT与XGBoost的区别
- 自用的Javaweb中Get和Post请求方法
- 矩形嵌套
- arguments和arguments.callee
- 多视角学习 (Multi-View Learning)
- 原型模式
- GBM 与 GBDT 与 XgBoost
- 个人博客github Pages重构(github Pages jekyll Liquid google站内搜索 pc和手机端自动布局)
- R:1.8 示例实践——判断关节炎患者接受治疗与接受安慰剂结果区别
- 团队各成员如何使用GitHub共同编辑文档?
- Handler原理分析
- JavaEE中servlet局部参数
- C语言接口与实现【第二章】
- 2017ccpc网赛-1005-CaoHaha's staff
- JavaSE IO