GBDT与XGBoost

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GBDT与XGBoost相关的知识,希望对你有一定的参考价值。

参考技术A

之前介绍过 梯度下降法与牛顿法 ,GBDT与XGBoost就与这两种方法有关。

GBDT泛指所有梯度提升树算法,包括XGBoost,它也是GBDT的一种变种,为了区分它们,GBDT一般特指“Greedy Function Approximation:A Gradient Boosting Machine”里提出的算法,只用了一阶导数信息。

算法流程如下:

算法流程图也可以如下图:

GBDT常用损失函数
分类算法:
分类算法中CART树也是采用回归树
(1) 指数损失函数:

负梯度计算和叶子节点的最佳负梯度拟合与Adaboost相似。
(2) 对数损失函数:
二元分类:

多元分类:

回归算法:
(1)均方差:

(2)绝对损失:

负梯度误差为:

(3)Huber损失:
均方差和绝对损失的折中,对远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。界限一般用分位数点度量。损失函数如下:

负梯度误差:

(4) 分位数损失:分位数回归的损失函数,表达式为

θ为分位数,需要我们在回归前指定。对应的负梯度误差为:

Huber损失和分位数损失,减少异常点对损失函数的影响。

问题:GBDT如何减少异常点的影响?

GBDT优点:

GBDT缺点:

Adaboost与GBDT:

RF与GBDT:

RF优点:

RF缺点:

XGBoost目标函数及归一化公式

归一化解释

XGBoost参数定义

XGBoost第t次迭代: 训练第t棵子树,损失函数最小求参数,计算过程如下

假设分到j这个叶子节点上的样本只有一个。那么,w* j 如下:

回归树的学习策略

XGBoost的打分函数

树节点分裂方法

寻找分为点可以使用Weighted Quantile Sketch—分布式加权直方图算法

稀疏值处理

关键的改进是只访问非缺失的条目I k 。 所提出的算法将不存在的值视为缺失值并且学习处理缺失值的最佳方向。稀疏感知算法运行速度比初始版本快50倍

XGBoost的其它特性

Shrinkage and Column Subsampling
Shrinkage and Column Subsampling均是为了防止过拟合

XGBoost的系统设计

Column Block
xgboost的并行不是tree粒度的并行,而是特征粒度上。

缓存感知访问(Cache-aware Access)

XGBoost的优点

XGBoost与GBDT对比

问题:XGBoost为什么使用CART树而不是用普通的决策树呢?

XGBoost参数说明

回归树 生成算法如下,使用最小二乘偏差(LSD)。

分类树 算法流程如下,使用GINI指数

GINI 指数:

分类中,假设 K 个类,样本属于第 k 类的概率为 p k ,概率分布的基尼指数为:

样本集合 D 的基尼指数为:

C k 为数据集D中属于第k类的样本子集,| * |表示样本集中样本的个数。
数据集 D 根据特征 A 在某一取值 a 上进行分割,得到 D 1 、D 2 两部分,则在特征 A 下集合 D 的基尼指数为:

停止条件:

剪枝
决策树防止过拟合方法:

代价复杂度剪枝 Cost-Complexity Pruning(CCP) 方法对CART剪枝,算法流程如下:

其中 C(T)为误差(例如基尼指数),|T| 为 T 的叶节点个数,alpha 为非负参数,用来权衡训练数据的拟合程度和模型的复杂度。

剪枝例子如下:

例如 t 1 节点,R(t)即剪枝后误差,数据所占比例16/16,节点误差率 = 该节点较少类别的数/该节点类别总数 = 8/16
R(Tt)为剪枝前误差,即叶子节点误差之和,以该节点为根节点的4叶子节点均只有一个类别的样本,该节点较少类别的数/该节点类别总数 = 0,所以R(Tt) = 0

参考

GBDT与XGBoost速度对比

同样的数据量,在同样的环境下的速度对比

正负样本数量:142287,711435

参数设置:

model_xgb=XGBClassifier(learning_rate=0.1,max_depth=5,n_estimators=300,subsample=0.6,objective='binary:logistic',n_jobs=10,enable_categorical=True)
#model_GBDT = GradientBoostingClassifier(max_depth=5, n_estimators=300, subsample=0.6, max_features=0.5)

用时对比:

GBDT:

predict used time: 2145.752547979355
train and predict used time all: 10983.663108110428

XGBoost:

predict used time: 1919.792335987091
train and predict used time all: 9046.629899263382
 

以上是关于GBDT与XGBoost的主要内容,如果未能解决你的问题,请参考以下文章

GBDT与XGBoost

Python机器学习实战决策树与集成学习——集成学习GBDT

机器学习——GBDT算法与stacking算法

Spark2.0机器学习系列之6:GBDT(梯度提升决策树)GBDT与随机森林差异参数调试及Scikit代码分析

随机森林RF与GBDT之间的区别

CTR预估-GBDT与LR实现