【小白学AI】GBDT梯度提升详解
文章来自微信公众号:【机器学习炼丹术】
文章目录:
0 前言
先缕一缕几个关系:
- GBDT是gradient-boost decision tree
- GBDT的核心就是gradient boost,我们搞清楚什么是gradient boost就可以了
- GBDT是boost中的一种方法,boost还有XGBoost,adaboost。
- GBDT的基模型一般是CART
1 基本概念
【Boost】 就是让多个弱分类器,通过不同的集成方式,来让多个弱分类器变成一个强分类器。
【gradient-boost】 梯度提升。简单的说,先训练一个弱分类器,然后弱分类器和目标值之间的残差,作为下一个弱分类器训练的目标值。这里有一个非常简单的例子

- 第一个模型预测年龄,虽然真实值是30岁,第一个模型只给出了20岁的估计值;
- 第二棵树要预测的就是这个10岁的残差,但是第二棵树只给出了6岁的估计值;
- 第三棵树预测的是第二棵树的4岁的残差,但是………………(禁止套娃)
2 梯度 or 残差 ?
对于GBDT,网上的很多文章都没有讲清楚,学习梯度还是学习残差?从上面的那个例子来看,是学习残差的。
其实,从来GBDT都是学习梯度的,学习残差只是学习梯度的一个特例!
如果我们是在做一个回归任务(就像是上面例子中预测年龄),采用平方损失:\(loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}\)
其中\(y_i\)是真实数值,\(\hat{y_i}\)是模型预测的值。
然后想求取这个关于\(\hat{y_i}\)的梯度,那就是:
\(\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})\)
所以残差在平方损失的情况下,就是等于负梯度,所以两者一回事。
3 残差过于敏感
对于数据不干净,没有清晰掉异常值的数据样本。使用平方损失对异常值过于敏感了:

敏感就是因为,异常值的损失过大了,导致下一个弱分类器就会强行拟合这个5.445的样本,拟合异常值就意味着弱化了泛化能力,从而整体精度就可能会下降。
所以,这里在回归问题中,也可以考虑使用下面的两个损失函数:
Absolute loss:
\(loss=|y-\hat{y}|\)Huber loss:
这个是设置一个阈值,当\(|y-\hat{y}|\)小于这个阈值的时候,采用平方损失,当\(|y-\hat{y}|\)大于这个阈值的时候,采用类似于绝对损失的线性损失:

这里看一下huber loss的函数图像:

就是一个平方损失,一个线性损失。
然后看一下平方损失,绝对损失,huber损失对于异常值的容忍程度:

【小小的总结】
GBDT是基于boosting的思想,串行地构造多棵决策树来进行数据的预测,它是在损失函数所在的函数空间中做梯度下降,即把待求的决策树模型当作参数,每轮迭代都去拟合损失函数在当前模型下的负梯度,从而使得参数朝着最小化损失函数的方向更新。
【现在还用吗?】
学肯定是要学的,因为GBDT是非常经典的集成模型,知道了可以扩充知识面。但是其实在2010年横霸大数据竞赛的,现在10年过去了,在竞赛中已经是老古董了。
【GBDT vs Adaboost】
Adaboost是boost集成的另一个非常经典的算法。Adaboost只能采用指数损失的二分类任务,而GBDT可以使用各种可微分的损失函数来处理多分类、回归等任务。
4 两个基模型的问题
【问题:为什么GBDT模型都会使用CART(分类和回归树)来作为基模型呢?】
这与决策树算法自身的优点有很大的关系。决策树可以认为是if-then规则的集合,易于理解,可解释性强,预测速度快 。同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖 等。决策树能够自动组合多个特征,它可以毫无压力地处理特征间的交互关系并且是非参数化 的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)不过,单独使用决策树算法时,有容易过拟合缺点。所幸的是,通过各种方法(比如剪枝、最大树深度、最小叶子样本数量、正则项等),抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
【还有什么抑制单棵决策树的复杂度的方法?换言之,决策树的避免过拟合的方法?】
- 限制树的最大深度
- 限制叶子节点的最少样本数量
- 限制节点分裂时的最少样本数量
- 吸收bagging的思想对训练样本采样(subsample)在学习单颗决策树时只使用一部分训练样本(样本采样)
- 借鉴随机森林的思路在学习单颗决策树时只采样一部分特征(特征采样,同样是bagging的思想)
- 在目标函数中添加正则项惩罚复杂的树结构等。
【小白学AI】GBDT梯度提升详解的更多相关文章
- 【小白学AI】XGBoost 推导详解与牛顿法
文章转自公众号[机器学习炼丹术],关注回复"炼丹"即可获得海量免费学习资料哦! 目录 1 作者前言 2 树模型概述 3 XGB vs GBDT 3.1 区别1:自带正则项 3.2 ...
- 【小白学AI】XGBoost推导详解与牛顿法
文章来自微信公众号:[机器学习炼丹术] 目录 1 作者前言 2 树模型概述 3 XGB vs GBDT 3.1 区别1:自带正则项 3.2 区别2:有二阶导数信息 3.3 区别3:列抽样 4 XGB为 ...
- 【小白学PyTorch】11 MobileNet详解及PyTorch实现
文章来自微信公众号[机器学习炼丹术].我是炼丹兄,欢迎加我微信好友交流学习:cyx645016617. @ 目录 1 背景 2 深度可分离卷积 2.2 一般卷积计算量 2.2 深度可分离卷积计算量 2 ...
- 【小白学AI】随机森林 全解 (从bagging到variance)
文章转自公众号[机器学习炼丹术],关注回复"炼丹"即可获得海量免费学习资料哦! 目录 1 随机森林 2 bagging 3 神秘的63.2% 4 随机森林 vs bagging 5 ...
- 【小白学PyTorch】13 EfficientNet详解及PyTorch实现
参考目录: 目录 1 EfficientNet 1.1 概述 1.2 把扩展问题用数学来描述 1.3 实验内容 1.4 compound scaling method 1.5 EfficientNet ...
- 【小白学PyTorch】12 SENet详解及PyTorch实现
文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...
- 机器学习 | 详解GBDT梯度提升树原理,看完再也不怕面试了
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第30篇文章,我们今天来聊一个机器学习时代可以说是最厉害的模型--GBDT. 虽然文无第一武无第二,在机器学习领域并没有 ...
- 一文读懂:GBDT梯度提升
先缕一缕几个关系: GBDT是gradient-boost decision tree GBDT的核心就是gradient boost,我们搞清楚什么是gradient boost就可以了 GBDT是 ...
- GBDT(梯度提升树)scikit-klearn中的参数说明及简汇
1.GBDT(梯度提升树)概述: GBDT是集成学习Boosting家族的成员,区别于Adaboosting.adaboosting是利用前一次迭代弱学习器的误差率来更新训练集的权重,在对更新权重后的 ...
随机推荐
- Skill 脚本演示 ycAlignAll.il
https://www.cnblogs.com/yeungchie/ ycAlignAll.il 将版图整体对齐至 指定象限 / 原点,可以忽略 Label 干扰带来的 offGrid 的风险. 回到 ...
- 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
- luogu 1587 [NOI2016]循环之美
LINK:NOI2016循环之美 这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的. 由于数值相同的 ...
- IDEA查看项目日志Version Control、log
打开IDEA找到以下两处: 右下角git 黄色指针指向当前项目的版本 选中初始化项目,点击右键选择"Checkout Revision 1db2f3d5",如下图 ...
- MySQL(版本8.0.19)服务的启动/停止、登录/登出、修改密码
[先说明一点 ,windows系统下,英文字母不分大小写.] MySQL 服务的 启动 / 停止 方式一: (我的系统是windows10) 找到 此电脑 图标 右键点击,选择"管理&q ...
- 笨办法学python3练习代码13-14:argv参数变量的学习
ex13.py argv参数的学习 #argv:参数变量(argument variable),这是一个标准的编程术语,在其他语言中也可可以看到.argument可译为: 参数 #如果参数是用户在执 ...
- Linux发行版-Manjaro
Manjaro是什么? 一个基于Arch系列,开源的linux发行版 Mnajrao官网了解更多,这里不做更多阐述内容 为什么使用Manjaro 第一点,为了方便自己隔离腾讯网游 第二点,更方便的学习 ...
- qt中使用dll库的方法
使用dll文件时首先通过dll文件导出符号表,如下面介绍 1. 制作def 直接调用 pexports mylib.dll > mylib.def 2. 生成a 需要mylib.dll和myli ...
- Vouch-proxy 实现 Zabbix4.4 对接 SSO
Vouch-proxy 实现 Zabbix 对接 SSO Zabbix 自身不支持 SSO 对接,我使用 Nginx 代理 Zabbix,将请求转发至 Vouch-proxy,由 Vouch-prox ...
- SpringCloudAlibaba-服务容错Sentinel(入门)
一:高并发带来的问题? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就 ...