树算法系列之三:GBDT
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.GBDT(Gradient Boosting Decison Tree)梯度提升树
GBDT与提升树有非常密切的关系。为方便阅读本文,可以先参考提升树一文。
在提升树一文中,我们提到每一轮迭代,都是去拟合上一轮的"残差",如果用一个简单的公式表示就是yi−fm−1(x)y_i - f_{m-1}(x)yi−fm−1(x)
GBDT与上面普通提升树的不同在于,其拟合的不是残差,而是梯度下降的方向。也就是将残差的计算替换为损失函数梯度的计算:
rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)\large {r_{mi}} = -\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
如果损失函数为MSE, 损失函数为L(yi,f(xi))=12(yi−f(xi))2L(y_i,f(x_i)) = \frac{1}{2}(y_i - f(x_i))^2L(yi,f(xi))=21(yi−f(xi))2,此时模型的负梯度方向即为残差方向rmi=yi−f(xi)r_{mi} = y_i - f(x_i)rmi=yi−f(xi)。
如果将GBDT名字拆开比较好理解,包含了三个关键的部分
1.G(Gradient) 梯度(残差)
2.B(Boosting) 提升方法,即为加法模型与前向分布算法
3.DT(Decision Tree) CART回归树,弱学习器。
所以将GBDT算法的流程做个总结如下:
一、初始化
f0(x)=argminc∑i=1NL(yi,c)f_0(x) = argmin_c \sum_{i=1}^N L(y_i, c)f0(x)=argminci=1∑NL(yi,c)
使损失函数最小,其只是一个根节点的树。
二、对m=1, 2, …M
2.1 计算梯度(残差)
rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)\large {r_{mi}} = -\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
即将损失函数的负梯度在当前模型的值,将它作为残差的估计(如果是MSE,就是通常意义所说的残差。如果是其他损失函数,则为残差的近似)
2.2 得到一个新的回归树T(x;θm)T(x;\theta_m)T(x;θm)。
2.3 更新fm(x)=fm−1(x)+T(x;θm)f_m(x) = f_{m-1}(x) + T(x; \theta_m)fm(x)=fm−1(x)+T(x;θm)
三、得到最终的模型
fM(x)=∑m=1MT(x;θm)f_M(x) = \sum_{m=1}^M T(x; \theta_m)fM(x)=m=1∑MT(x;θm)
2.GBDT与提升树的关系
提升树每一次所谓的提升过程,都是通过上次的预测结果与真实值的差值作为新的训练数据进行训练。因为CART树默认的损失函数为MSE,所以直接使用残差进行计算。
而GBDT针对的是更为一般的损失函数,所以用负梯度近似代替残差,将上次预测结果代入梯度中来获取本轮的训练数据。
本质上是在生成新的训练数据的时候采用了不同的方式。
3.GBDT与传统Boosting方法的区别
GBDT每次的计算是为了减小上一次的残差(residual)。而为了消除残差,可以在残差减少的梯度(Gradient)方向上建立一个新的模型。因此在Gradient Boosting中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少。而传统Boosting的方法是对正确,错误样本进行不同程度加权有比较大的区别。
4.GBDT为什么精度比较高
西瓜书(周志华老师出品的机器学习)中对此有解释:Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
5.GBDT优缺点
优点
1.可以灵活处理各种类型数据,包括连续值与离散值。
2.非线性能力比较强,表达能力强,不需要做复杂的特征工程和特征变换。
3.在相对较少调参的情况下,可以达到比较高的精度。
4.可解释性强,可以自动做特征重要性排序。因此在深度学习火热以前,常作为`发现特征组合‘的有效思路。
5.使用一些健壮的损失函数,对异常值的鲁棒性较高。比如Huber loss。
缺点
1.boost训练是串行过程,不好并行化。
2.计算复杂度高,不太适合高维稀疏特征,如果feature个数太多,每一棵回归树都要耗费大量时间
树算法系列之三:GBDT相关推荐
- SCCM2012系列之三,SCCM2012部署前的IIS准备
SCCM2012系列之三,SCCM2012部署前的IIS准备 IIS是SCCM2012中非常重要的部署条件.SQL Server,WSUS等产品都需要IIS的支持.因此,完成Active Direct ...
- 活动目录系列之三---域控制器常规卸域
活动目录系列之三---域控制器常规卸域 在介绍正题之前,先补充很多人提出的一个疑问,就是什么情况下计算机名系统不让更改,其实很简单,当在域情况下,用非管理员登陆域,即计算机名就不让更改,运行---CM ...
- Microsoft Hyper-V Server 2008 R2和SCVMM2012部署XenDesktop 5.6桌面虚拟化系列之三准备XenDesktop服务器...
Microsoft Hyper-V Server 2008 R2和SCVMM2012 部署XenDesktop 5.6桌面虚拟化系列 之三准备XenDesktop服务器 接着上一篇文章内容<Mi ...
- [基础知识]Linux新手系列之三
2019独角兽企业重金招聘Python工程师标准>>> [基础知识]Linux新手系列之三 给Linux新手 [系列之三] Linux相关资料由兄弟连分享 OK,从哪里得到Linux ...
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- 内核对象——Windows核心编程学习手札系列之三
内核对象 --Windows核心编程学习手札系列之三 内核对象可供系统和应用程序使用来管理各种各样的资源,如进程.线程.文件等,是内核分配的一个内存块,只能又内核访问,该内存块是一种数据结构,它的成员 ...
- nginx系列之三:日志配置
** 前言 ** nginx系列之一:nginx入门 nginx系列之二:配置文件解读 nginx系列之三:日志配置 nginx系列之四:web服务器 nginx系列之五: 负载均衡 nginx系列之 ...
- 《视频直播技术详解》系列之三:处理
七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣. 结合七牛实时流网络 LiveNet 和直播云解 ...
- 《解剖PetShop》系列之三
<解剖PetShop>系列之三 三.PetShop数据访问层之消息处理 在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件 ...
- 数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务
数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务 人工智能技术与咨询 一.数字化转型应围绕价值效益系统性推进 新一轮科技革命和产业变革迅猛发展,世界正处在一个从工业时代向信息时 ...
最新文章
- 过滤器(Filter)
- 图普科技招聘有关深度学习的解题?
- 计算机架构及开机过程
- python 中的 for-else 和 while-else 语句
- python 正则表达式 re findall 返回能匹配的字符串
- mysql sillyr x.so_mysql2.so:libmysqlclient_r.so.15:无法打开共享对象文件:没有这样的文件或目录...
- date、clock、hwclock时间命令解释
- android自定义textview销毁,Android自定义View去除TextView的Padding值
- iOS WKWebView与JS交互传值
- 用jquery在一个页面加载另一个页面
- android多线程网络通信
- java 局域网广播_java UDP实现局域网广播 | 学步园
- 菜鸟也疯狂,易语言自绘控件__进度条、滑块条
- mysql5.6.24的安装与简单使用
- pytthon问题 pytcharm Automatic upload failed: could not resolve file “sftp://10.xx.xx.xx 【已解决】
- SW练习_POJ2007_CCW
- 郑州互联网公司和生活成本
- 有一种痛,叫 “今年没有年终奖”!!!
- 常见的HTTP状态码及HTTP状态码大全
- 智能驾驶定位三大发展趋势是什么?