文章目录
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