[白话解析] 通俗解析集成学习之GBDT
[白话解析] 通俗解析集成学习之GBDT
文章目录
- [白话解析] 通俗解析集成学习之GBDT
- 0x00 摘要
- 0x01 定义 & 简述
- 1. GBDT(Gradient Boosting Decision Tree)= GB + DT
- 2. 白话简述
- 3. 概括要点
- 损失函数和负梯度
- 残差和负梯度
- Boosting和负梯度
- 两个层面的随机梯度下降
- 基学习器和负梯度
- 加法模型
- 提升树
- 回归树
- 4. 总结
- 0x02 相关概念
- 1. 损失函数
- 2. 残差
- 3. 梯度
- 4. 梯度下降
- 5. 在参数空间最优参数估计
- 6. 在函数空间最优函数估计
- 7. 为什么前向分步时不直接拟合残差?
- 学习负梯度才能保证符合Boosting的基本要求
- 负梯度可以扩展到更复杂的损失函数
- 8. 决策树
- 9. 回归树拟合
- 10. 单棵回归树
- 11. 加法模型
- 12. 前向分步算法
- 13. 梯度下降
- 14. GBDT的优势
- 15. 算法步骤概要
- 0x03 代码示例
- 1. 训练
- 2. 损失函数
- 0x04 参考
0x00 摘要
本文将为大家讲解GBDT这个机器学习中非常重要的算法。因为这个算法属于若干算法或者若干思想的结合,所以很难找到一个现实世界的通俗例子来讲解,所以只能少用数学公式来尽量减少理解难度。
0x01 定义 & 简述
我们首先给出定义和概述,让大家有个直观的概念,然后再针对每一个概念和环节做详述。
1. GBDT(Gradient Boosting Decision Tree)= GB + DT
首先,我们给出一个定义。
GB:Gradient Boosting,一种算法框架,用梯度计算拟合损失函数的提升过程。
G:Gradient 梯度,确切地说是Gradient Descent(梯度下降),实现层面上是用损失函数的负梯度来拟合本轮损失函数的近似值,进而拟合得到一个弱学习器。
B:Boosting 一种集成学习算法,通过迭代训练一系列弱学习器(每一次训练都是在前面已有模型的预测基础上进行),组合成一个强学习器,来提升回归或分类算法的精确度。"Boosting"的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本。提升方法 Boosting 采用的是加法模型和前向分布算法来解决分类和回归问题。
DT:Decision Tree,决策树,一种常用的用来做回归或分类的算法,可以理解成树状结构的if-else规则的集合。在这里就是上述的弱学习器了。
总结起来,所谓GBDT,就是通过迭代训练一系列决策树,其中每棵决策树拟合的是基于当前已训练好的决策树们(当前模型)所得到损失函数的负梯度值,然后用这些决策树来共同决策,得到最终的结果。
2. 白话简述
我们需要得到一棵决策树,这个树是用残差拟合出来的。为了提高精度,当使用一棵树训练完以后,我们还在它的基础上再去把它的残差拿来做二次加工、三次加工…这样就有了后面的树。
3. 概括要点
损失函数和负梯度
损失函数:机器学习的训练目标是让损失函数最小,损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。
梯度向量:从几何意义上讲,梯度向量就是函数变化增加最快的地方。沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,梯度减少最快,也就是更加容易找到函数的最小值。
可以把 GBDT 的求解过程想象成线性模型优化的过程。在线性模型优化的过程中。利用梯度下降我们总是让参数向负梯度的方向移动,一步步的迭代求解,得到最小化的损失函数。即通过梯度下降可以最小化损失函数。
残差和负梯度
残差 在数理统计中是指实际观察值与估计值(拟合值)之间的差。残差r=y−f(x)越大,表明前一轮学习器f(x)的结果与真实值y相差较大,那么下一轮学习器通过拟合残差或负梯度,就能纠正之前的学习器犯错较大的地方。
GBDT 是使用负梯度进行boost,残差是一种特例。再准确的说,GBDT的正则化操作中有“学习步长”,即每一步拟合的不是负梯度,而是负梯度的α倍(负梯度与学习率的乘积),这时候拟合目标和残差就更不相同了。
Boosting和负梯度
“Boosting” 的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本。
“Gradient Boosting” 是用梯度计算拟合损失函数的提升过程。用损失函数的负梯度(截止到当前的梯度)来拟合本轮损失函数的近似值,进而拟合得到一个弱学习器,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。最后将所有的弱学习器结合起来,得到一个强学习器。这样通过累加各个学习器使得损失函数减小。
每新建一个树会做如下操作:
根据之前的fm和损失函数的负梯度来计算残差 ---> 构建新树来拟合残差 (特征划分 / 更新叶子节点预测值) ---> 更新模型 (计算出f{m+1})
两个层面的随机梯度下降
参数梯度下降是根据负梯度调整原来的参数,在参数层面调整;而同样根据负梯度,可以获得一个新的函数/基学习器(通过获得新的参数实现,但是参数的意义是通过函数体现),这就是在函数层面调整。
在参数空间中优化,每次迭代得到参数的增量,这个增量就是负梯度乘上学习率;
在函数空间中优化,每次得到增量函数,这个函数会去拟合负梯度,在GBDT中就是一个个决策树。要得到最终结果,只需要把初始值或者初始的函数加上每次的增量。处理粒度更新参数w,从而更新函数F(X),使得损失函数L(y,F(X))最小。
可以认为 “GB” 是每一轮基学习器在负梯度上逐步趋近最小损失函数。
基学习器和负梯度
GBDT 中的这个基学习器是一棵分类回归树(CART),我们可以使用决策树直接拟合梯度。假入我们现在有 t 棵树,我们需要去学习是第 t+1 棵树,那么如何学习第 t+1 棵树才是最优的树呢?这个时候我们参考梯度优化的思想。现在的 t 课树就是我们现在的状态,使用这个状态我们可以计算出现在的损失。如何让损失更小呢?我们只需要让 t+1 棵树去拟合损失的负梯度。正是借用了梯度优化的思想。所以叫梯度提升树。
GBDT解决分类问题时,拟合的都是类别的概率,是一个值,跟逻辑回归的思想差不多;二分类问题中,类别的个数与树的个数肯定是无关的,但多分类问题中,树的个数就等于k*m,k为类别个数,m为对每个类别训练的树的个数;GBDT的多分类问题使用的就是一对多的方法,只要关注训练该类别所使用的m课树的拟合值的汇总结果是否大于阈值即可。
加法模型
提升方法 Boosting 采用的是加法模型和前向分布算法来解决分类和回归问题,实现学习的优化过程。
GBDT是在用forward stage-wise的方式来fit一个additive model。假设我们最终得到一个high performance的模型为F(x),F(x)其实是由多个f(x)累加的。
从additive model 的角度上来看 ,Fm(x) = Fm-1(x) + h(x)=y,则h(x) = y - Fm-1(x)即残差,所以每次iteration,一个新的cart 树似乎都是在拟合残差,但只是一个相近值,也是一个比较朴素的想法。
如果损失函数为square error,其导数即是残差的导数。 我们都知道,梯度下降是沿着负梯度方向下降的(一阶泰勒公式展开推导,即我们能通过一阶泰勒展开证明负梯度方向是下降最快的方向)。所以,h(x)去拟合残差即可。 但是如果用absolute error 、huber error等,那么残差就不等于负梯度了。此时即用h(x)来拟合负梯度(一般是负梯度与学习率的乘积)。
boosting 的可加性(additive)。可加性指的是 h 的可加,而不是 x 的可加。比如 x 是决策树,那两棵决策树本身怎么加在一起呢? 你顶多把他们并排放在一起。可加的只是样本根据决策树模型得到的预测值 h(x,D)罢了。
提升树
注意GBDT不论是用于回归还是分类,其基学习器 (即单棵决策树) 都是回归树,即使是分类问题也是将最后的预测值映射为概率,因为回归树的预测值累加才是有意义的,而GBDT是把所有树的结论累加起来做最终结论的。
GBDT在回归问题中,每轮迭代产生一棵CART(分类和回归树),迭代结束时将得到多棵CART回归树,然后把所有的树加总起来就得到了最终的提升树。
GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
回归树
每新建一个树 ,先计算残差,再根据残差构建回归树 (也就是拟合残差)。构建树时候特征划分,更新叶子节点预测值,求出使损失函数最小 (也就是拟合最好) 的预测值:
for m = 1 to M 循环生成决策树,每新建一个树 :(A) 计算更新残差 res_m = label - f_m(B) 使用回归树来拟合残差 res_m,叶子结点value就是残差数值。(C) 计算更新 “叶子节点预测值“ f_m = f_prev + lr * res_m每做一次特征划分,计算SE = (残差res_m - 残差均值),即每棵树对应叶子节点的残差之和。针对每个叶子节点样本,计算更新 ”叶子节点预测值“,求出使损失函数最小,也就是拟合叶子节点最好的的输出值(D) 更新模型 F_m
假如我们已经进行了五次迭代,那么这个算法流程中,第五颗树的数据打印如下:
第5棵树: mse_loss:0.0285id age weight label f_0 res_1 f_1 res_2 f_2 res_3 \
0 1 5 20 1.1 1.475 -0.375 1.4375 -0.3375 1.40375 -0.30375
1 2 7 30 1.3 1.475 -0.175 1.4575 -0.1575 1.44175 -0.14175
2 3 21 70 1.7 1.475 0.225 1.4975 0.2025 1.51775 0.18225
3 4 30 60 1.8 1.475 0.325 1.5075 0.2925 1.53675 0.26325 f_3 res_4 f_4 res_5 f_5
0 1.373375 -0.273375 1.346037 -0.246037 1.321434
1 1.427575 -0.127575 1.414818 -0.114818 1.403336
2 1.535975 0.164025 1.552377 0.147622 1.567140
3 1.563075 0.236925 1.586768 0.213232 1.608091
这里有两个特征: age, weight。而label数值是1.1,1.3 ,1.7,1.8。
可以看出res是在梯度下降。f_0都初始化为 1.475。假设学习率是0.1。第五颗回归树的叶子结点是res_5,而f_5 = f_4 + 0.1 * res_4。
本例对应算法在后文中会给出详细代码。
4. 总结
最后总结下 :
- DT 就是决策树。
- B 就是连续生成一系列的决策树,后一个决策树在前一个决策树基础上做优化 。
- G 就是这些决策树拟合的是残差(回归树的叶子结点value是残差数值),这个残差是按照损失函数的负梯度方向步进,一步一步递进之后,使得最后损失函数最小。
0x02 相关概念
下面会逐一详述相关概念,以及其在GBDT如何应用。
1. 损失函数
损失函数(loss function):机器学习中,为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。比如在线性回归中,损失函数通常为样本输出和假设函数的差取平方。
损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。不同的损失函数代表不同优化目标,像MAE,RMSE,指数损失,交叉熵及其他损失。
2. 残差
残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。即残差(residual)是因变量的观测值 yi 与根据估计的回归方程求出的预测 y^i 之差。
3. 梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。
梯度向量从几何意义上讲,就是函数变化增加最快的地方。沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,梯度减少最快,也就是更加容易找到函数的最小值。
负梯度也被称为“响应 (response)” 或 “伪残差 (pseudo residual)”,从名字可以看出是一个与残差接近的概念。
直觉上来看,残差 r = y − f(
[白话解析] 通俗解析集成学习之GBDT相关推荐
- [白话解析] 通俗解析集成学习之bagging,boosting 随机森林
[白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...
- 集成学习-Boosting集成学习算法GBDT
GBDT算法的核心为:先构造一个(决策)树,然后不断在已有模型和实际样本输出的残差上再构造一颗树,依次迭代. 目录 Decistion Tree(决策树) Gradient Boosting(梯度提升 ...
- 通俗讲解集成学习算法!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄星源,Datawhale优秀学习者 本文以图文的形式对模型算法中 ...
- 机器学习 | 基础通俗讲解集成学习算法!
来源:Datawhale 本文约6000字,建议阅读10+分钟 本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读. 标签:机器学习 数据及背景 阿里天池-零基础入 ...
- 基础通俗讲解集成学习算法
来源:Datawhale 本文约6000字,建议阅读10+分钟 本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读. 标签:机器学习 数据及背景 阿里天池-零基础入 ...
- 【机器学习基础】通俗讲解集成学习算法!
作者:黄星源,Datawhale优秀学习者 本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读. 数据及背景 https://tianchi.aliyun.com/ ...
- 【机器学习 深度学习】通俗讲解集成学习算法
目录:集成学习 一.机器学习中的集成学习 1.1 定义 1.2 分类器(Classifier) 1.2.1 决策树分类器 1.2.2 朴素贝叶斯分类器 1.2.3 AdaBoost算法 1.2.4 支 ...
- (七)集成学习中-投票法Voting
集成学习第一法宝:投票! 参考:DataWhale教程链接 集成学习(上)所有Task: (一)集成学习上--机器学习三大任务 (二)集成学习上--回归模型 (三)集成学习上--偏差与方差 (四)集成 ...
- (三)集成学习上——偏差与方差
参考:DataWhale教程链接 集成学习(上)所有Task: (一)集成学习上--机器学习三大任务 (二)集成学习上--回归模型 (三)集成学习上--偏差与方差 (四)集成学习上--回归模型评估与超 ...
- # 联邦学习-安全树模型 SecureBoost之集成学习
文章目录 1 联邦学习背景 2 联邦学习树模型方案 3 Ensemble Learning 3.1 集成学习 3.2 Bagging & Boosting 3.2.1 Bagging (boo ...
最新文章
- fsolve函数求解非线性方程
- python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
- 字符流中第一个不重复的字符
- Maven的pom文件那些事
- 【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型
- 微电网日前优化调度 。算例有代码(0)
- 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
- 西门子数控面板图解_学好四要点让你迅速成为数控机床“操作高手”
- python创建变量并赋值_python怎么给变量赋值
- 流放之路材质过滤怎么设置_松下除湿机怎么样 松下除湿机款式有哪些型号【详解】...
- [ZT]图像处理库的比较:OpenCV,FreeImage,CImg,CxImage
- Qt 5.9.1 连 MYSQL 5.7数据库
- table标签中thead、tbody、tfoot的作用
- tomcat的url-pattern的源码分析
- 一行代码即可删除C盘几十G垃圾,清理c盘垃圾的cmd命令
- An improved genetic algorithm for the flexible job shop scheduling problem with multiple time constr
- flask 蓝本(blueprint)
- 多重背包的二进制拆分法
- 软件测评概要总结-中科软测认证中心
- php正则表达式懒惰匹配,正则表达式-贪婪与懒惰