十大机器学习算法-梯度提升决策树(GBDT)

2023-11-12

简介

梯度提升决策树(GBDT)由于准确率高、训练快速等优点,被广泛应用到分类、回归合排序问题中。该算法是一种additive树模型,每棵树学习之前additive树模型的残差。许多研究者相继提出XGBoost、LightGBM等,又进一步提升了GBDT的性能。

基本思想

提升树-Boosting Tree

以决策树为基函数的提升方法称为提升树,其决策树可以是分类树或者回归树。决策树模型可以表示为决策树的加法模型。
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) fM(x)=m=1MT(x;Θm)
其中, T ( x ; θ m ) T\left(x ; \theta_{m}\right) T(x;θm) 表示决策树, θ m \theta_{m} θm表示树的参数, M M M为树的个数。

针对不同问题的提升树算法主要区别在于损失函数的不同。对于回归问题,使用的是平方损失函数;对于分类问题,使用的是指数损失函数;对二分类问题,提升树算法只需将AdaBoost的基分类器设置为二分类树即可,此时的提升树算法是AdaBoost算法的一个特例。以下主要关注回归问题的提升树算法。

对于回归问题的提升树算法,每一步拟合的是前一步的残差,具体为什么拟合的是残差看下面推导:
L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = [ y − f m − 1 ( x ) − T ( x ; θ m ) ] 2 = [ r − T ( x ; θ m ) ] 2 \begin{aligned} L\left(y, f_{m}(x)\right) &=L\left(y, f_{m-1}(x)+T\left(x ; \theta_{m}\right)\right) \\=[y&-f_{m-1}(x)-T\left(x ; \theta_{m}\right) ]^{2} \\ &=\left[r-T\left(x ; \theta_{m}\right)\right]^{2} \end{aligned} L(y,fm(x))=[y=L(y,fm1(x)+T(x;θm))fm1(x)T(x;θm)]2=[rT(x;θm)]2
其中 r r r 代表残差。

回归问题中的提升树算法如下:

输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … . , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots .,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),.,(xN,yN)} 其中$x_{i} \in X \subseteq R^{n} , , , y_{i} \in \gamma={-1,+1}$

输出:提升树 f M ( x ) f_{M}(x) fM(x)

  1. 初始化 f 0 ( x ) = 0 f_{0}(x)=0 f0(x)=0

  2. m = 1 , 2 ⋯ M m=1,2 \cdots \mathrm{M} m=1,2M

    1. 计算每个数据的残差:

    r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , … . N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), i=1,2, \ldots . N rmi=yifm1(xi),i=1,2,.N

    1. 拟合残差学习一颗回归树,得到 T ( x ; θ m ) T\left(x ; \theta_{m}\right) T(x;θm)
    2. 更新 T ( x ; θ m ) T\left(x ; \theta_{m}\right) T(x;θm)
  3. 得到回归问题提升树
    f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \theta_{m}\right) fM(x)=m=1MT(x;θm)

得到一颗提升树后,可以对输入数据进行预测。假设得到两棵树,下图给出预测过程:

梯度提升-Gradient Boosting

梯度提升的思想借鉴与梯度下降法,回顾梯度下降法,对于优化问题:
min ⁡ f ( w ) \min f(w) minf(w)
使用梯度下降法求解的基本步骤:

  1. 随机选择一个初始点 w 0 w_0 w0
  2. 重复以下过程:
    1. 求负梯度: g i = − ∂ ∂ w f ( w ) ∣ w i g_{i}=-\frac{\partial}{\partial w} f\left.(w)\right|_{w_{i}} gi=wf(w)wi
    2. 选择步长 α \alpha α
    3. 更新参数: w i + 1 = w i + α ∗ g i w_{i+1}=w_{i}+\alpha * g_{i} wi+1=wi+αgi
  3. 直到满足终止条件

由以上过程可以看出,对于最终的最优解 w ∗ w^{*} w,是由初始值 w 0 w_0 w0 经过M次迭代后得到的。设 w 0 = d 0 w_0 = d_0 w0=d0,则 w ∗ w^{*} w 为:
w ∗ = ∑ i = 0 M α i ∗ g i w^{*}=\sum_{i=0}^{M} \alpha_{i} * g_{i} w=i=0Mαigi
函数空间中,我们也可以借鉴梯度下降的思想,进行最优函数的搜索。关键是利用损失函数的负梯度在当前模型的值
− [ ∂ L ( y , F ( X ) ) ∂ F ( X ) ] F ( X ) = F m − 1 ( X ) -\left[\frac{\partial L(y, F(X))}{\partial F(X)}\right]_{F(X)=F_{m-1}(X)} [F(X)L(y,F(X))]F(X)=Fm1(X)
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

对于模型的损失函数 L ( y , F ( X ) ) L(y, F(X)) L(y,F(X)),为了能够求解出最优的函数 F ∗ ( X ) F^{*}(X) F(X),首先设置初始值为:
F 0 ( X ) = f 0 ( x ) F_{0}(X)=f_{0}(x) F0(X)=f0(x)
以函数 F ( X ) F(X) F(X) 为一个整体,与梯度下降法的更新过程一致,假设经过M代,得到最优的函数 F ∗ ( X ) F^{*}(X) F(X)为:
F ∗ ( X ) = ∑ i = 0 M f i ( x ) F^{*}(X)=\sum_{i=0}^{M} f_{i}(x) F(X)=i=0Mfi(x)
其中 f i ( x ) f_{i}(x) fi(x) 为:
f i ( x ) = − α i g i ( X ) = − α i ∗ [ ∂ L ( y , F ( X ) ) ∂ F ( X ) ] F ( X ) = F m − 1 ( X ) f_{i}(x)=-\alpha_{i} g_{i}(X)=-\alpha_{i} *\left[\frac{\partial L(y, F(X))}{\partial F(X)}\right]_{F(X)=F_{m-1}(X)} fi(x)=αigi(X)=αi[F(X)L(y,F(X))]F(X)=Fm1(X)
可以看到这里梯度变量是一个函数,是在函数空间上求解;而以往的梯度下降是在N维的参数空间负梯度方向,变量是参数。在梯度提升中,这里变量是函数,通过当前函数的负梯度方向更新函数以修正模型,最后累加的模型近似最优函数。

GBDT的负梯度为什么近似于提升树的残差

对于损失函数 L ( y , f m − 1 + T ( x i ; Θ m ) ) L\left(y, f_{m-1}+T\left(x_{i} ; \Theta_{m}\right)\right) L(y,fm1+T(xi;Θm)) ,我们将 f ( x ) f(x) f(x) 而不是 θ \theta θ 作为自变量。根据梯度下降定义,可以得到损失函数参数的更新公式:
f m = f m − 1 − ∂ L ∂ f f_{m}=f_{m-1}-\frac{\partial L}{\partial f} fm=fm1fL
同时提升树的定义为: f m = f m − 1 + T ( x i ; Θ m ) f_{m}=f_{m-1}+T\left(x_{i} ; \Theta_{m}\right) fm=fm1+T(xi;Θm),决策树拟合的值等于负梯度,为残差。

梯度提升决策树-GBDT

了解了GBDT的两个部分(提升树和梯度提升)后,我们以回归树为例,基模型为CART回归树,得到GBDT的实现思路如下

输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … . , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots .,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),.,(xN,yN)},其中其中$x_{i} \in X \subseteq R^{n} , , , y_{i} \in \gamma={-1,+1}$

输出:提升树 f M ( x ) f_{M}(x) fM(x)

  1. 初始化 f 0 ( x ) = argmin ⁡ ∑ i = 1 N L ( y i , c ) f_{0}(x)=\operatorname{argmin} \sum_{i=1}^{N} L\left(y_{i}, c\right) f0(x)=argmini=1NL(yi,c)

  2. m = 1 , 2 ⋯ M \mathrm{m}=1,2 \cdots \mathrm{M} m=1,2M

    1. 计算每个数据: r m i = [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{m i}=\left[\frac{\partial L\left(y, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} rmi=[f(xi)L(y,f(xi))]f(x)=fm1(x)

    2. 拟合 r m i r_{m i} rmi学习一棵回归树,得到 T ( x ; θ m ) T\left(x ; \theta_{m}\right) T(x;θm)。更详细一点,得到第 m m m棵树的叶节点区域 R m j , j = 1 , 2 … J R_{m j}, j=1,2 \dots J Rmj,j=1,2J,即一颗由 J J J 个叶子结点组成的树

    3. 计算每个区域的最优输出:
      c m j = argmin ⁡ ( ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{m j}=\operatorname{argmin}(\sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj=argmin(xiRmjL(yi,fm1(xi)+c)

    4. 更新
      f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x i ϵ R m ) f_{m}(x)=f_{m-1}(x)+\sum_{j=1}^{J} c_{m j} I\left(x_{i} \epsilon R_{m}\right) fm(x)=fm1(x)+j=1JcmjI(xiϵRm)

    5. 得到回归问题梯度提升树
      f M ( x ) = ∑ m = 1 M f m ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x i ϵ R m j ) f_{M}(x)=\sum_{m=1}^{M} f_{m}(x)=\sum_{m=1}^{M} \sum_{j=1}^{J} c_{m j} I\left(x_{i} \epsilon R_{m j}\right) fM(x)=m=1Mfm(x)=m=1Mj=1JcmjI(xiϵRmj)

算法步骤1得到使损失函数最小的常数估计值,是一个只有根节点的树。在步骤2a计算损失函数的负梯度在当前模型的值,作为残差估计。在步骤2b估计回归树的叶节点区域,来拟合残差的近似值。第2c步利用线性搜索估计叶节点区域的值,使损失函数极小化。第2d步更新回归树。第3步得到输出的最终模型。

优点

  1. 预测阶段的计算速度快,树与树之间可并行化计算
  2. 在分布稠密的数据集上,泛化能力和表达能力都很好
  3. 采用决策树作为弱分类器使GBDT具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的处理如归一化等

缺点

  1. GBDT在高维稀疏的数据集上,表现不如SVM或者神经网络
  2. GBDT在处理文本分类特征问题上,不如处理数值特征
  3. 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度

实现

GBDT的python源码实现

常见问题

两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化的形式表示,从而模型的更新等价于参数的更新。

而在梯度提升中,模型并不需要参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。

Bagging通过模型集成降低方差,提高弱分类器的性能。

Boosting通过模型集成降低偏差,提高弱分类器的性能。

Bagging Boosting
降低 方差 偏差
训练 各个弱分类器可独立训练 弱分类器需要依次生成

用每个样本的残差训练下一棵树,直到残差收敛到某个阈值以下,或者树的总数达到某个上限为止。

A. 计算每个样本的负梯度
B. 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
C. 更新每个样本的负梯度时
D. 最后预测过程中,每个样本将之前的所有树的结果累加的时候

优点

(1)预测阶段计算速度块,树与树之间可并行化计算

(2)在分布稠密的数据集上,泛化能力和表达能力都很好

(3)采用决策树作为弱分类器使得GBDT模型具有较好的可解释性和鲁棒性,能够自动发现特征间的高阶关系,并且不需要对数据进行特殊的预处理如归一化等

缺点

(1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络

(2)GBDT在处理文本分类特征问题上,优势不如在处理数值特征时明显

(3)训练过程需要串行训练,只能在决策树内容采用一些局部并行手段提高训练速度

基于残差的GDBT对异常值敏感。对于回归类的问题,如果采用平方损失函数。当出现异常值时,后续模型会对异常值关注过多。我们来看一个例子:

很明显后续的模型会对第4个值关注过多,这不是一种好的现象,所以一般回归类的损失函数会用绝对损失或者huber损失函数来代替平方损失函数:

参考资料

  1. 李航《统计学习方法》
  2. GBDT算法原理深入解析
  3. 机器学习-一文理解GBDT的原理-20171001
  4. http://www.ccs.neu.edu/home/vip/teach/MLcourse/4_boosting/slides/gradient_boosting.pdf
  5. GBDT的python源码实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十大机器学习算法-梯度提升决策树(GBDT) 的相关文章

  • Nginx篇04-map模块

    nginx的map模块配置语法 map模块是由ngx http map module模块提供的 只能在http模块下使用 nginx默认自带安装 map 的主要作用简单来说就和编程语言中的赋值语句有点像 只不过这里称为映射 map 具体来说

随机推荐

  • 使用python进行文件夹重命名

    import os file name JPEGImages 文件存放地址 count 0 for file in os listdir file name os rename os path join file name file os
  • 串的模式匹配(KMP算法)

    问题描述 串的模式匹配算法实现 KMP算法 输入形式 第一行输入主串s 第二行输入模式串t 第三行输入起始位置pos 输出形式 输出模式串t的next值 以空格分隔 输出模式匹配结果 样例输入1 ababcabcacbab abcac 1
  • 为什么输入法显示中文打不出中文_输入法为什么打不出汉字_电脑输入法打不出汉字如何解决-win7之家...

    我们要在电脑中使用输入法打字的时候 不急可以打出汉字也可以打出英文 不过有不少用户却遇到了输入法打不出汉字的情况 这让用户们很苦恼 那么输入法为什么打不出汉字呢 一般出现这样的问题是输入法出现了问题 我们只要修复一下即可 赶快随小编一起来看
  • # 后端开发技巧、常用规范

    后端开发技巧 常用规范 文章目录 后端开发技巧 常用规范 开发技巧 equals 方法的使用 创建 HashMap 指定初始化大小 Optional ofNullable orElse 避免空指针 Stream 求和 List 切割工具 单
  • vue引用js文件的多种方式

    1 vue cli webpack全局引入jquery 1 首先 npm install jquery save save 的意思是将模块安装到项目目录下 并在package文件的dependencies节点写入依赖 2 在webpack
  • radius的认证过程

    转载自 http blog donews com zyqin archive 2008 09 01 1341486 aspx RADIUS 远程用户拨号认证系统 是Remote Authentication Dial In User Ser
  • UE4加载使用自定义dll动态链接库

    本人在写这篇文章时候 网上已经有很多相关的文章 但是网上的文章缺少逐步指引 本人看的云里雾里 估计刚接触相关工作的人看的也不是很清楚 本着自己记录和让他人少踩一些坑的宗旨 这篇文章诞生了 好了 不多BB 直接进入主题 创建自定义dll动态链
  • JVM垃圾回收机制简介

    JVM垃圾回收机制 深入理解Java虚拟机 阅读笔记 需要先了解一定的JVM内存模型知识 下面是笔者学习的笔记 仅供参考 JVM内存模型的简单介绍和对象的初始化过程 Java语言在设计之初就考虑到C 复杂的指针管理和内存泄漏等问题 因此实现
  • 数据分析系列之电力窃漏电用户自动识别

    在线监测用户用电负荷数据 经过数据预处理 得到模型输入数据 利用构建好的识别模型计算用户窃漏电诊断结果 实现窃漏电用户的实时诊断 并与实际稽查结果对比 背景与挖掘目标 传统的防窃漏电方法主要是通过定期巡检 定期校验电表 用户举报窃电等方法来
  • 达梦数据库如何查看和修改系统参数

    查看初始化级别的系统参数 通过视图option查查 初始化后不能修改 修改配置文件dmconfig ini后只能重新初始化实例 select from v option where PARA NAME like CASE SENSITIVE
  • 函数(二)

    紧接上文 我们把函数的基础语法结束了 本章将讲解到较为难一点的内容 譬如递归调用 一 函数的嵌套调用和链式访问 函数与函数之间并不是独立存在的 函数和函数之间可以根据实际的需求进行组合的 也就是互相调用的 嵌套调用 举例 include
  • 关于pytorch和tensorflow的GPU版本安装过程中的问题(MX450)

    最近在学习深度学习 想在一台MX450显卡的小米笔记本电脑装pytorch和tensorflow 以下内容为方便自己以后查看 若有问题 请在评论指出 谢谢 环境 WIN10 MX450 Anaconda Pycharm 最新补充 pytor
  • bash: jps: 未找到命令...,常见错误,快速解决

    出现以上错误 我的解决方法是 下载插件 sudo yum install java 1 8 0 openjdk devel x86 64 输入两个y后 出现以下即成功了 再jps一下就可以显示出进程了
  • 带你玩转以太坊智能合约的”Hello World“

    学习目标 使用solidity语言撰写智能合约 开发前的准备 Ubuntu环境下Atom编辑器安装及使用 安装所需工具 安装nvm 安装node 安装npm 启动testrpc 建立项目 目录结构 新建HelloWorld合约 代码说明 编
  • 超全总结:神经网络加速之量化模型

    作者丨郝泽宇 学校丨西安交通大学人机所硕士生 研究方向丨深度神经网络压缩 鸣谢 XJTU 魏亚东 I C 董豪 量化模型 Quantized Model 是一种模型加速 Model Acceleration 方法的总称 包括二值化网络 Bi
  • Socket错误连接超时的解决方法

    flashfxp 选项 gt 参数选择 gt 链接 gt FTP gt 数据连接模式里面将被动模式改为主动模式
  • Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境

    欢迎加入讨论群 64770604 1 开发环境 1 下载开发环境 Arduino的开发环境从http arduino cc en Main Software官网下载即可 分为windows版本 Mac版本 linux 32 64位 目前已更
  • 怎样更改linux的用户名

    Linux将用户名修改后 还需要修改 组名 家目录 UID 这只会更改用户名 而其他的东西 比如用户组 家目录 UID 等都保持不变 1 修改用户名 usermod l 新用户 旧用户 这只会更改用户名 而其他的东西 比如用户组 家目录 I
  • UML图学习

    前言 UML是一种建模语言 是系统建模的标准 我们之所以建模是因为大规模的系统设计时相当复杂的 当系统比较复杂时就会涉及到以下这几个问题 开发人员如何与用户进行沟通来了解系统的需求 开发人员之间如何沟通以确保各个部门能够无缝地协作 而UML
  • 十大机器学习算法-梯度提升决策树(GBDT)

    简介 梯度提升决策树 GBDT 由于准确率高 训练快速等优点 被广泛应用到分类 回归合排序问题中 该算法是一种additive树模型 每棵树学习之前additive树模型的残差 许多研究者相继提出XGBoost LightGBM等 又进一步