GBDT算法详解

2023-11-07

GBDT基本思想

GBDT的基本结构是决策树组成的森林,学习方式是梯度提升。
具体的讲,GBDT作为集成模型,预测的方式是把所有子树的结果加起来。GBDT通过逐一生成决策子树的方式生成整个森林,生成新子树的过程是利用样本标签值与当前树林预测值之间的残差,构建新的子树。
例如,当前已经生成了3课子树了,则当前的预测值为D(x)=d1(x)+d2(x)+d3(x),此时我们得到的当前的预测值为D(x)效果并不好,与真正的拟合函数f(x)还有一定的差距。GBDT希望的是构建第四棵子树,使当前树林的预测结果D(x)与第四棵树的预测结果d4(x)的之和,能在理论上逼近拟合函数f(x)。
所以,我们第四棵树的预测结果应该以拟合函数f(x)与当前树林的预测结果D(x)之差为目标,即d4(x)=f(x)-D(x)。在GBDT中,我们将r(x)=f(x)-D(x)叫做残差。理论上,如果我们能生成足够多的子树去拟合这个残差,那么我们得到的结果就可以无限接近于真实的结果。
在讲解GBDT算法之前,我们需要补充一些其他的知识,方便我们后续的理解。

补充知识

1前向分步算法

前向分布算法考虑这样一个问题:“给定一个训练数据集和损失函数,并且弱模型通过权重之和的方式组合成强模型,那么我们怎么来求这些弱模型以及最终的强模型?”
我们用数学化的语言描述一下上面的问题:
给定训练数据集T={(x1, y1),(x2, y2),…,(xN, yN)}和损失函数L(y, f(x)),f(x)是最终的强学习模型,因为弱模型通过权重之和的方式组合成强模型,所以f(x)可以如下表示:
在这里插入图片描述
其中b(x;γm)是弱学习模型,βm是弱学习模型的权重系数,γm是弱学习模型的参数。
所以前向分布算法考虑的问题是,如何求出所有的βm和γm,即优化如下目标表达式:
在这里插入图片描述
按照以往的思路,这里我们可以使用梯度下降法来对目标函数进行求解,但是对于这个式子而言,梯度下降法会变得十分困难,不易于计算。所以我们使用一种新的方法——前向分步算法来替代梯度下降法进行求解。前向分布算法给出的解决办法是:“利用贪心算法,每一步只学习一个弱模型及其系数,使得当前弱模型和之前所有的弱模型组合后目标表达式取得最优值,最终就可以使得所有弱模型组合后目标表达式取得最优值”

算法步骤

输入:训练数据集T={(x1, y1),(x2, y2),…,(xN, yN)};损失函数L(y, f(x))
输出:强学习模型f(x)
(1)初始化f0(x)=0
(2)对m=1, 2 ,…, M
(a)极小化损失函数
在这里插入图片描述
(b)更新
在这里插入图片描述
(3)最终得到强学习模型f(x)
在这里插入图片描述
总之,提升方法告诉我们如何来求一个效果更好模型,那就是将多个弱模型组合起来,这仅仅是一个思路,而前向分布算法就具体告诉我们应该如何来做。

2提升树算法

如果前向分布算法中的基函数取决策树(一般默认使用CART树,因为它即可做回归也可以做分类),那么该前向分布算法就可以称为提升树算法。针对不同的损失函数和树的类型,提升树有不同的用途,对于前向分布算法来说,当损失函数取指数损失,基函数取二叉分类树,前向分布算法就变成了用于分类的提升树算法; 当损失函数取平方损失,基函数取二叉回归树,前向分布算法就变成了用于回归的提升树算法;

用于分类的提升树算法

这里我就不再啰嗦了,就是将Adaboost算法中的基函数取二叉分类树,算法具体流程和Adaboost一样。

用于回归的提升树算法

前向分步算法中的基函数采用二叉回归树,损失函数采用平方损失,就得到了解决回归问题的提升树。
假设现在是前向分布算法的第 m 次迭代,当前模型为 fm-1(x),此时的弱模型未知,我们记为T(x;θ),第m次迭代的目标是找到使得损失函数 L(yi, fm-1(xi) + T(xi;θ))取最小值的 T*(x;θ),然后更新当前模型 fm(x) = fm-1(x) + T*(x;θ)。
因为损失函数采用的是平方损失,所以有:
L(yi, fm-1(xi) + T(xi;θ)) = (yi - fm-1(xi) -T(xi;θ))2 = ( r - T(xi;θ))2
其中 r = yi - fm-1(xi) ,这是当前模型拟合数据的残差。从上面的表达式可以看出弱模型T(xi;θ)的预测值越是接近r,损失L的值就越小,所以说每一次迭代过程的弱模型 T(xi;θ) 只需拟合当前模型的残差就可以了,但这只限于损失函数取平方损失的时候

算法步骤

在这里插入图片描述
在这里插入图片描述

关于拟合残差,举个简单的栗子

举个栗子:
A、B、C、D四个人的真实年龄分别为14、16、24、26,现在利用提升算法对这四个人的年龄做预测。

第一轮:
初始模型F0(x)取值为常数,这个常数为样本的均值时目标函数能取最小值。
所以F0(x) = 20,即A、B、C、D的预测年龄为20、20、20 、20。
所以得到每个人的年龄预测残差为 -6、-4、4、6,然后用残差数据去拟合一个基函数f1(x),我们就可以得到一个新的模型F1(x) = F0(x) + f1(x),假设这个基函数 f1(x) 对于残差数据的预测值为 -5、-4、3、6。

第二轮:
模型 F1(x) 的预测值为15(20-5)、16(20-4)、23(20+3)、26(20+6),
所以得到每个人的年龄预测残差为 -1、0、1、0,然后用残差数据去拟合一个基函数f2(x),我们就可以得到一个新的模型F2(x) = F0(x) + f1(x) + f2(x) ,其中这个基函数 f2(x) 对于残差数据的预测值为 -1、0、1、0。
此时,F2(x)已经可以完全预测准确了,它的预测结果是 14(20-5-1)、16(20-4-0)、24(20+3+1)、26(20+6+0)。

3梯度提升算法

当前向分布算法中的损失函数取平方损失或者指数损失,我们都有比好的优化方法,其中指数损失我们可以采用Adaboost算法,平方损失我们采用拟合当前模型残差的方法,那如果损失函数是其它类型的函数呢?针对这个问题,freidman提出了梯度提升,其关键是用损失函数L( yi, fm-1(xi)) 对 当前模型 fm-1(xi) 的 负梯度值作为残差的近似值,所以可以将该负梯度值称为伪残差。
可以这样来想,假设目前损失函数取平方损失函数,即
在这里插入图片描述
该平方损失函数L( yi, fm-1(xi)) 对 当前模型 fm-1(xi) 的梯度值为:
在这里插入图片描述
也就是说,损失函数取平方损失的时候,负的梯度值就是当前模型的残差,所以当损失函数取其它函数的时候,我可以用负梯度值作为当前模型残差的近似值。
在这里插入图片描述

GBDT算法流程

现在我们将梯度提升算法和回归问题的提升树算法进行一个融合,就可以得到GBDT的算法了。
GBDT既可以用来处理回归问题,也可以用来处理分类问题,当梯度提升算法的基函数取二叉回归树,该梯度提升算法就可以称之为GBDT,注意不管GBDT是做回归还是做分类,它的基函数一直都是二叉回归树(默认采用CART回归树)。
在这里插入图片描述
在这里插入图片描述
如上所述,GBDT之所以分类和回归都取二叉回归树,大概是因为二叉回归树叶子结点的权值比较好求出来吧(上述算法流程的倒数第二步),只要叶子节点的权值求出来,该二叉回归树(误差率最小)就算是求出来了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GBDT算法详解 的相关文章

  • 工厂模式与抽象工厂在实际项目中的应用

    在面向对象编程中 最通常的方法是一个new操作符产生一个对象实例 new操作符就是用来构造对象实例的 但是在一些情况下 new操作符直接生成对象会带来一些问题 举例来说 许多类型对象的创造需要一系列的步骤 你可能需要计算或取得对象的初始设置
  • 优秀程序员的6大特质

    原文来自 http www iteye com news 28575 6 traits of good programmers 自认为离优秀的程序员还有一段距离 临近下班的时候特意找了下这方面的文章看看 觉得这篇文章说的很有道理 优秀的 高
  • 异或脚本参照

    这是两个异或绕过的脚本 异或是什么 这个符号代表的是异或的意思 当我们在PHP语言中输入 echo b w 的时候 语言本身会自动计算b和w的ascll编码值的差别 然后直接 输出该差别值的ascll编码数据是谁 这样我们就能够在不输入字母

随机推荐

  • 华为OD机试真题-数字加减游戏【2023.Q1】

    题目内容 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 每个回合 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用多少次a 才能将数
  • Android dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent详解

    之前遇到事件分发 去网上找相关文章 感觉都没把这几个的关系说明白 研究了几篇不错的文章 今天在这整理一下 希望对大家有所帮助 首先你要知道一点 当你触摸一个控件的时候 你就会调用该控件 或它的父类 的dispatchTouchEvent方法
  • Windows 控制台注册表工具 Reg

    C Documents and Settings Administrator gt reg Windows 控制台注册表工具 版本 3 0 版权所有 C Microsoft Corp 1981 2001 保留所有权利 REG Operati
  • 每天一道Python面试题(系列)

    本系列计划把Python面试中出现频率比较高知识点整理出来 以便各位童鞋复习和练习 第1题 Python垃圾回收机制 第2题 链表的逆置 第3题 两个队列创建一个栈 持续更新中 转载于 https www cnblogs com wupei
  • Vue中本地图片src路径对但是图片不出来的问题

    静态src 没有问题 可以正常显示 img class jiaobiao img src assets img xiangmuzhongxin png alt 这样子写 img class inner img alt 换为动态src 图片展
  • 协同过滤推荐算法实例代码

    什么是协同过滤 协同过滤是利用集体智慧的一个典型方法 要理解什么是协同过滤 Collaborative Filtering 简称 CF 首先想一个简单的问题 如果你现在想看个电影 但你不知道具体看哪部 你会怎么做 大部分的人会问问周围的朋友
  • 【自然语言处理】条件随机场【Ⅳ】条件随机场学习问题

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 部分推导和定义相关的佐证资料比较少 供参考 讨论的过程中我会加入自己的理解 难免存在错误 欢迎大家讨论 在阅读本篇之前建议先学习 隐马尔可夫模型系列 最大熵马尔可夫模型 由于字数限制
  • LR 录制Web(HTTP/HTML)脚本的模式选择

    LR 录制Web HTTP HTML 脚本的模式选择 Loadrunner进行Web HTTP HTML 协议录制时有两种录制模式 HTML basescript和URL base script 两种模式在录制的脚本和统计数据上具有较大的差
  • Linux QtCreator 编译报错:No rule to make target '.../***' needed by '***.o'.stop

    Linux QtCreator 编译报错 No rule to make target mainwindow cpp needed by mainwindow o stop 1 解决方案 1 打开工程项目的pro文件 2 搜索找到mainw
  • for循环执行次数_VB学习笔记 之循环控制结构部分

    VB编程控制结构 在VB编程中提供了3种控制结构 分别是 顺序结构 选择结构 循环结构 其中顺序结构非常容易理解 即按照代码的先后顺序依次执行 重点和难点内容在于选择结构和循环结构 其中循环结构又有3种不同风格 分别是For 计数 循环 W
  • 栈实现综合计算器(中缀表达式)

    栈实现综合计算器 中缀表达式 来自专栏 LeetCode基础算法题 欢迎订阅 文章目录 栈实现综合计算器 中缀表达式 1 题目 2 思路 3 代码 4 总结 1 题目 使用栈来实现综合计算器 2 思路 看到计算器我们首先想到的数据结构是栈
  • pycharm-使用wsl

    pycharm使用wsl 更换terminal 在设置里面搜索terminal 将cmd exe改为bash exe
  • Excel VBA判断最后一行/列

    判断到哪里结束应该是Excel VBA最常见的操作之一 下面代码能实现这个功能 Function LastColumn As Long Dim ix As Long ix ActiveSheet UsedRange Column 1 Act
  • 记一次pptp实践经历

    由于公司业务需求 需要搭建vpn服务器以供外部用户传送数据 所以需要采用客户端到网关的方式的VPN VPN服务器的类型很多 如IPSec L2TP PPTP SSLVPN OPENVPN等 考虑到安全稳定性的因素 专业的vpn设备肯定是首要
  • casual discovery Toolbox使用(R语言做因果分析)

    casual discovery Toolbox使用 cdt casual discovery Toolbox 是一个用于因果关系发现的开源工具包 里面包括10多个算法 其中一些是用R语言开发的所以需要安装R的一些东西 1 安装R和RStu
  • 黑客工具Armitage

    Armitage介绍 Armitage是一款Java写的Metasploit图形界面化的攻击软件 可以用它结合 Metasploit中已知的exploit来针对主机存在的漏洞自动化攻击 通过命令行的方式使用Metasploit难度较高 需要
  • Git——Day2(使用git管理远程仓库)

    1 使用远程仓库目的 作用 备份 实现代码共享集中化处理 2 如何将本地仓库同步到git远程仓库 命令 git push 将本地提交到远程 步骤1 工作区 Work Directory 暂存区 步骤2 暂存区 提交到git仓库 Git Re
  • Unity InputField 拉起手机系统键盘

    inputField ActivateInputField ActivateInputField将自动拉起键盘 隐藏移动设备上屏幕键盘附带的文本输入显示区 白色区域 仅适用于iOS设备生效 inputField shouldHideMobi
  • 多线程总结

    一 多线程 1 什么是进程 什么是线程 进程是一个应用程序 1个进程是一个软件 线程是一个进程中的执行场景 执行单元 一个进程可以启动多个线程 对于java程序来说 当在DOS命令窗口中输入 java HelloWorld 回车之后 会先启
  • GBDT算法详解

    GBDT基本思想 GBDT的基本结构是决策树组成的森林 学习方式是梯度提升 具体的讲 GBDT作为集成模型 预测的方式是把所有子树的结果加起来 GBDT通过逐一生成决策子树的方式生成整个森林 生成新子树的过程是利用样本标签值与当前树林预测值