提升方法(boosting)——从Adaboost到XGboost

it2025-09-09  12

文章目录

0. 写在前面1. 提升方法的源头1.1 提升方法的主要思想1.2 提升方法需要回答的两个核心问题 2. Adaboost算法2.1 回答两个核心问题2.2 Adaboost原理2.3 Adaboost其他需要注意的知识 3. 提升树3.1 模型三要素3.2 利用提升树解决分类问题3.3 利用提升树解决回归问题 4. 梯度提升树(Gradient Boosting Decision Tree,GBDT)4.1 从提升树到梯度提升树4.2 GBDT的求解思想和过程4.3 回归提升树每个CART回归树为什么没有权重 5. XGboost(eXtreme Gradient Boosting)5.1 XGboost的原理解析5.2 XGboost与GBDT的核心区别5.3 为什么XGboost如此之快 6. XGboost一些调参经验

0. 写在前面

本章不会有数学推导,只是为了理清提升方法的发展历程,从Adaboost到提升树到GBDT再到XGboost。围绕几个问题:

1.从模型的缺点或者改良的角度去思考为什么引出一个模型

2.从面试的角度思考面试官会在意一些什么

1. 提升方法的源头

1.1 提升方法的主要思想

核心思想:“三个臭皮匠顶个诸葛亮”

历史上,Kearns和Valiant首先提出了“强可学习(strongly learnable)”和“弱可学习(weakly learnable)”的概念。指出:在概率近似正确(probably approximately correct,PAC)学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的

这样一来,问题便成为,在学习中,如果已经发现了“弱学习算法”,那么能否将它提升(boost)为“强学习算法”。大家知道,发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。关于提升方法的研究很多,有很多算法被提出。最具代表性的是AdaBoost算法(AdaBoost algorithm)。

对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)容易得多。提升方法就是从弱学习算法出发反复学习,得到一系列弱分类器(又称基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数提升方法都是改变训练数据得概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。

1.2 提升方法需要回答的两个核心问题

(1)在每一轮如何改变训练数据的权值或者概率分布 ?

(2) 如何将弱分类器组合成一个强分类器 ?


2. Adaboost算法

Let me ask you a question first: 为什么要学习Adaboost算法 ?

The answer is : 为了学习XGboost及其变种

2.1 回答两个核心问题

第一个问题:在每一轮如何改变训练数据的权值或者概率分布 ?

Adaboost的做法是:提高那些被前一轮弱分类器分类错误的样本的权值,降低那些被正确分类的权值。这样一来,那些没有得到正确分类的数据,由于其权值加大二收到后一轮的弱分类器的更大关注

第二个问题: 如何将弱分类器组合成一个强分类器 ?

Adaboost的做法是:采取加权多数表决的方法。具体的,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的若分类器的权值,使其在表决中起较小的作用。

2.2 Adaboost原理

对于公式的推导,我不想在本博客花费太大功夫,请参考其他博客。 原理解析和公式推导

Adaboost算法本意是为了做分类问题,但是也可以解决回归问题。顺便说一句,该算法在目前工业界已经淘汰了,之所以学习它,是因为它是XGboost的基础。

换句话说,只有正确的看待每个时期,模型的优缺点,才能更好的掌握目前优秀模型算法本身。

2.3 Adaboost其他需要注意的知识

一、Adaboost算法的训练误差分析(模型为什么有效)

具体的数学原理可以参考:AdaBoost算法的训练误差分析

你只需要知道,通过训练误差分析,我们得到一些结论:

Adaboost最基本的性质是它能在学习过程中不断减少训练误差,即在训练数据集上的分类误差率。(该结论由两个定理支持)

Adaboost的训练误差是以指数速率下降的。(该结论由上面的两个定理的推论支持)

你可以这么去理解“为什么每增加一个基本分类器(基函数),分类误差就会变小?” 。因为损失函数是个固定形式,当你新添加进来一个基函数,你相当于利用上一轮训练剩下的误差去训练新的基函数(每个基函数去拟合误差的能力是有限的),这样,随着基函数的数目越大,模型就越精确。

二、Adaboost算法的可解释性

可以认为Adaboost算法是模型为加法模型、损失函数(策略)为指数函数、学习算法为前向分步算法时的二分类学习方法。换句话说,Adaboost算法是前向分步加法算法的特例

三、Adaboost每次迭代的计算过程

根据损失函数学习基函数G(x)➡计算分类误差率em➡计算基函数的系数αm➡计算样本权重w(注意做好归一化)


3. 提升树

“提升树被认为是统计学习中性能最好的方法之一” —— 李航《统计学习方法》,2012

值得一提的是,提升树和Adaboost的核心区别是:Adaboost并没有指明基本分类器是什么,而提升树很明显指明基本分类器为决策树。

接下来介绍的提升树其实是提升方法更具体的例子,具体在它的基本分类器使用的是决策树。对于分类问题,它使用分类分类树(ID3,C4.5,CART分类树);对于回归问题,它使用CART回归树模型。

3.1 模型三要素

模型:加法模型(基函数的线性组合)

策略:最小化经验风险损失(确定下一棵决策树的参数)

算法:贪心算法(根据决策树里边的知识 )

下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用平方损失的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。

3.2 利用提升树解决分类问题

这个问题,简单,我们只需要讲Adaboost算法中的基函数变为二类的决策树即可,可以说这时候的提升树是Adaboost算法的特殊情况。

3.3 利用提升树解决回归问题

基本分类器:CART回归树 损失函数:平方损失 记住一句话:每一个CART回归树拟合的是上一轮的残差。 你可能对红色的这句话有点费解:在Adaboost算法中,其实每一个基函数(基本分类器)拟合的是上一轮的误差,而在提升树中,我们具体化了损失函数以及基本分类器,这时误差变为了残差


4. 梯度提升树(Gradient Boosting Decision Tree,GBDT)

以下几个概念等价:

① Gradient Boosting Decision Tree,GBDT

② Gradient boosted regression tree,GBRT

③ Gradient Boosting machine ,GBM

4.1 从提升树到梯度提升树

提升树利用 加法模型 与 前向分步算法 实现学习的优化过程。

提升树存在的问题:当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对于一般损失函数而言,往往每一步优化并不那么容易。

梯度提升树的引出:针对这一问题,Freidman提出了梯度提升树(gradient boosting)算法

4.2 GBDT的求解思想和过程

GBDT的求解思想其实是利用了负梯度是函数下降最快的方向,其关键是利用损失函数的负梯度在当前模型的值。

GBDT的求解过程其实就是 梯度下降 在 函数空间 中的优化过程 如何理解残差和梯度之间的关系 无论损失函数是什么形式,每个决策树拟合的都是负梯度。准确的说,不是用负梯度代替残差,而是当损失函数是均方损失时,负梯度刚好是残差,残差只是特例。

4.3 回归提升树每个CART回归树为什么没有权重

Adaboost是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。虽然GBDT也是Boosting家族的成员,但是却和Adaboost有很大的不同。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时GBDT是基于残差学习的算,没有AdaBoost中的样本权重的概念。


5. XGboost(eXtreme Gradient Boosting)

5.1 XGboost的原理解析

说了,这篇博客不会涉及大量公式推导,具体原理请参考:XGboost原理

5.2 XGboost与GBDT的核心区别

① 求解预测值 y ^ \hat y y^的方式不一样

GBDT中预测值是由所有弱分类器上的预测结果的加权求和,其中每个样本上的预测结果就是样本所在的叶子节点的均值。而XGBT中的预测值是所有弱分类器上的叶子权重直接求和得到,计算叶子权重是一个复杂的过程。

② 正则项的存在

在普通的梯度提升树GBDT中,我们是不在目标函数中使用正则项的。但XGB借用正则项来修正树模型天生容易过拟合这个缺陷,在剪枝之前让模型能够尽量不过拟合。

③ 使用的梯度信息

在GBDT中,我们利用负的一阶梯度值作为标签,利用这些负梯度信息去拟合一个CART回归树;而在XGboost中,我们不仅使用了一阶梯度信息而且使用了二阶梯度信息,但是使用这些梯度信息是为了化简公式,而真正在求解树的时候使用了求极值的方法(求导)。

④ 基本分类器的种类

在GBDT中,基本分类器只能是CART回归树,而在XGboost中,我们的基本分类器可以是任何模型,例如线性模型等(一般我们都会优先考虑树模型)

5.3 为什么XGboost如此之快

在数据集规模很大的时候使用近似算法使用Column Block,在特征粒度上并行计算是从CSC存储数据,建立索引,在构建树的时候,对数据集只需要一次排序缓存优化,使用缓冲区提高cpu的chche命中率

具体原因可以参考原著

参考链接

6. XGboost一些调参经验

https://blog.csdn.net/weixin_44441131/article/details/109036857

最新回复(0)