经典机器学习模型(八)梯度提升树GBDT详解

news2024/10/7 14:31:46

经典机器学习模型(八)梯度提升树GBDT详解

Boosting、Bagging和Stacking是集成学习(Ensemble Learning)的三种主要方法。

Boosting是一族可将弱学习器提升为强学习器的算法,不同于Bagging、Stacking方法,Boosting训练过程为串联方式,弱学习器的训练是有顺序的,每个弱学习器都会在前一个学习器的基础上进行学习,最终综合所有学习器的预测值产生最终的预测结果。

我们之前详细介绍过提升方法中的AdaBoost算法。今天,我们继续来了解下另一种提升方法—梯度提升树GBDT。

传统机器学习(六)集成算法(2)—Adaboost算法原理

1 GBDT原理详解

1.1 初识GBDT

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。

GBDT的原理很简单

  • 所有弱分类器的结果相加等于预测值。
  • 每次都以当前预测为基准,下一个弱分类器去拟合残差(预测值与真实值之间的误差)
  • GBDT的弱分类器使用的是树模型。
  • 注意:实际上每个决策树拟合的都是负梯度,只是当损失函数是均方损失时,负梯度刚好是残差,所以其实残差只是负梯度的一种特例而已,我们后面会详细说明。

下图是一个非常简单的帮助理解的示例,我们用GBDT去预测年龄:

  • 第一个弱分类器(第一棵树)预测一个年龄(如20岁),计算发现误差有10岁;
  • 第二棵树预测拟合残差,预测值6,计算发现差距还有4岁;
  • 第三棵树继续预测拟合残差,预测值3,发现差距只有1岁了;
  • 第四课树用1岁拟合剩下的残差,完成。
  • 最终,四棵树的结论加起来,得到30岁这个标注答案。

在这里插入图片描述

1.2 梯度下降和梯度提升

1.2.1 梯度下降

梯度下降法,我们都比较熟悉。不妨思考这样一个问题,梯度下降法中,为什么在负梯度方向函数值下降最快?

我们目标就是证明负梯度方向函数值下降最快。
假设我们现在处于函数 f ( x ) f(x) f(x)的一个点上,这个点的坐标为 x ⃗ = ( x 1 , x 2 , . . . , x n ) \vec{x}=(x_1,x_2,...,x_n) x =(x1,x2,...,xn),此时函数值为 f ( x ⃗ ) f(\vec{x}) f(x )

让我们假设一个下降的方向,这个方向是随机的,我们设这个方向是 l ⃗ = ( l 1 , l 2 , . . . , l n ) \vec{l}=(l_1,l_2,...,l_n) l =(l1,l2,...,ln),那么我们沿着 l ⃗ \vec{l} l 下降的意思就是,我们下一步将来到 f ( x ⃗ + l ⃗ ) 。 f(\vec{x}+\vec{l}) 。 f(x +l )

根据多元函数的一阶泰勒展开公式,我们有:
f ( x ⃗ + l ⃗ ) = f ( x ⃗ ) + ∑ k = 1 n ∂ f ∂ x k l k + o ( ∣ ∣ x ∣ ∣ n ) f(\vec{x}+\vec{l})=f(\vec{x})+\sum_{k=1}^n \frac{\partial f}{\partial x_k}l_k + o(||x||^n) f(x +l )=f(x )+k=1nxkflk+o(∣∣xn)
f ( x ⃗ + l ⃗ ) − f ( x ⃗ ) f(\vec{x}+\vec{l})-f(\vec{x}) f(x +l )f(x )就是移动后函数值的变化量,也就是说,只要这个值小于零,我们的函数值就在变小。而只要我们可以证明当 l ⃗ \vec{l} l 取到梯度的负方向时这个值小于零且绝对值最大,那么我们就证明了我们的目标。
而 f ( x ⃗ + l ⃗ ) − f ( x ⃗ ) = ∑ k = 1 n ∂ f ∂ x k l k + o ( ∣ ∣ x ∣ ∣ n ) 自变量变化值极小的时候 ( ∣ ∣ l ⃗ ∣ ∣ 极小 ) ,我们可以忽略 o ( ∣ ∣ x ∣ ∣ n ) 而f(\vec{x}+\vec{l})-f(\vec{x})=\sum_{k=1}^n \frac{\partial f}{\partial x_k}l_k + o(||x||^n)\\ 自变量变化值极小的时候(||\vec{l}|| 极小),我们可以忽略o(||x||^n) f(x +l )f(x )=k=1nxkflk+o(∣∣xn)自变量变化值极小的时候(∣∣l ∣∣极小),我们可以忽略o(∣∣xn)
我们现在仅剩的问题就是如何找到一个方向,使得 ∑ k = 1 n ∂ f ∂ x k l k \sum_{k=1}^n \frac{\partial f}{\partial x_k}l_k k=1nxkflk小于零且绝对值最大。

  • 我们观察这个式子,它其实是两个向量的数量积,我们知道当两个向量的夹角为0或180度时,该数量积的绝对值取得最大值。
  • 而最后一个小于零的条件很容易满足,我们只需要让 l ⃗ = − g r a d f ⃗ \vec{l}=-\vec{grad_f} l =gradf 。这样的话,对于这两个向量来说,他们的每一个维度都互为对方的相反数,因此他们的数量积一定不可能大于零,在实际情况下,他们甚至一直小于零。
  • 到这里,我们就证明了当且仅当 l ⃗ \vec{l} l 的方向是负梯度方向时,函数值下降最快。
  • 因此,使用梯度下降法时为了让函数值下降最快,在参数更新时候就需要沿着负梯度方向更新。

在梯度下降法中,我们经常用 θ 表示参数。 f ( x ⃗ + l ⃗ ) = f ( x ⃗ ) + ∑ k = 1 n ∂ f ∂ x k l k + o ( ∣ ∣ x ∣ ∣ n ) 可以表示为: f ( θ k + 1 ) ≈ f ( θ k ) + ∂ f ( θ k ) ∂ θ k ( θ k + 1 − θ k ) = f ( θ k ) + ∂ f ( θ k ) ∂ θ k ∇ θ 当 ∇ θ = − g r a d f ⃗ = − ∂ f ( θ k ) ∂ θ k 时,下降最快 因此,参数迭代公式 θ k + 1 = θ k + η ∇ θ = θ k − η ∂ f ( θ k ) ∂ θ k 在梯度下降法中,我们经常用\theta表示参数。\\ f(\vec{x}+\vec{l})=f(\vec{x}) + \sum_{k=1}^n \frac{\partial f}{\partial x_k}l_k + o(||x||^n)\\ 可以表示为:f(\theta_{k+1}) \approx f(\theta_{k})+\frac{\partial f(\theta_k)}{\partial \theta_k}(\theta_{k+1}-\theta_k)\\ =f(\theta_{k})+\frac{\partial f(\theta_k)}{\partial \theta_k}\nabla\theta\\ 当\nabla\theta=-\vec{grad_f}=-\frac{\partial f(\theta_k)}{\partial \theta_k}时,下降最快 \\ 因此,参数迭代公式\theta_{k+1}=\theta_k + \eta \nabla\theta =\theta_k - \eta\frac{\partial f(\theta_k)}{\partial \theta_k} 在梯度下降法中,我们经常用θ表示参数。f(x +l )=f(x )+k=1nxkflk+o(∣∣xn)可以表示为:f(θk+1)f(θk)+θkf(θk)(θk+1θk)=f(θk)+θkf(θk)θθ=gradf =θkf(θk)时,下降最快因此,参数迭代公式θk+1=θk+ηθ=θkηθkf(θk)

补充以下泰勒展开公式:

在这里插入图片描述

1.2.2 梯度提升原理推导

我们利用一阶泰勒展开公式,对损失函数进行泰勒展开:

在这里插入图片描述

在优化 L ( y , F t ( x ) ) L(y,F_t(x)) L(y,Ft(x))的时候:
函数更新公式: F t ( x ) = F t − 1 ( x ) − a t ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) 即 T t ( x ) = − a t ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) 所以需要当前的学习器来学习负梯度,这里和 G B D T 中差了一个 a 。 函数更新公式:F_t(x)=F_{t-1}(x)-a_t\frac{\partial L(y,F_{t-1}(x))}{\partial F_{t-1}(x)}\\ 即T_t(x)=-a_t\frac{\partial L(y,F_{t-1}(x))}{\partial F_{t-1}(x)}\\ 所以需要当前的学习器来学习负梯度,这里和GBDT中差了一个a。 函数更新公式:Ft(x)=Ft1(x)atFt1(x)L(y,Ft1(x))Tt(x)=atFt1(x)L(y,Ft1(x))所以需要当前的学习器来学习负梯度,这里和GBDT中差了一个a
当我们的损失函数为平方损失时候, L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^2 L(y,f(x))=(yf(x))2,此时学习器要学习的负梯度为:
G B D T 中忽略 a t , 那么 T t ( x ) = − ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) 这里为了求导方便,损失函数加上 1 2 = − ∂ 1 2 ( y − f ( x ) ) 2 ∂ f ( x ) f ( x ) = f t − 1 ( x ) = y − f t − 1 ( x ) GBDT中忽略a_t,那么T_t(x)=-\frac{\partial L(y,F_{t-1}(x))}{\partial F_{t-1}(x)}\\ 这里为了求导方便,损失函数加上\frac{1}{2} \\ =-\frac{\partial \frac{1}{2}(y-f(x))^2}{\partial f(x)}_{f(x)=f_{t-1}(x)}\\ =y-f_{t-1}(x) GBDT中忽略at,那么Tt(x)=Ft1(x)L(y,Ft1(x))这里为了求导方便,损失函数加上21=f(x)21(yf(x))2f(x)=ft1(x)=yft1(x)
y − f t − 1 ( x ) y-f_{t-1}(x) yft1(x)刚好是残差,因此每个决策树拟合的都是负梯度,只是当损失函数是均方损失时,负梯度刚好是残差,所以其实残差只是负梯度的一种特例而已。

1.2.3 梯度下降VS梯度提升

  • 我们已经通过一阶泰勒展开证明了负梯度方向是下降最快的方向。

  • 我们熟悉的梯度下降法是在参数空间中优化。对于最终的最优解 θ ∗ \theta^* θ,是由初始值 θ 0 \theta_0 θ0经过T次迭代之后得到的。

设 θ 0 = − ∂ L ( θ ) ∂ θ 0 ,那么 θ ∗ 表示为 θ ∗ = ∑ t = 0 T a t ∗ [ − ∂ L ( θ ) ∂ θ ] θ = θ t − 1 [ − ∂ L ( θ ) ∂ θ ] θ = θ t − 1 表示 θ 在 θ t − 1 处泰勒展开式的一阶导数 设\theta_0= -\frac{\partial L(\theta)}{\partial \theta_0},那么\theta^*表示为 \\ \theta^*=\sum_{t=0}^T a_t * [-\frac{\partial L(\theta)}{\partial \theta}]_{\theta=\theta_{t-1}} \\ [-\frac{\partial L(\theta)}{\partial \theta}]_{\theta=\theta_{t-1}}表示\theta在\theta_{t-1}处泰勒展开式的一阶导数 θ0=θ0L(θ),那么θ表示为θ=t=0Tat[θL(θ)]θ=θt1[θL(θ)]θ=θt1表示θθt1处泰勒展开式的一阶导数

  • 函数空间中,我们也可以借鉴梯度下降的思想,进行最优函数的搜索。对于模型的损失函数 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)为一个整体,与梯度下降法的更新过程一致,假设经过T次迭代得到最优函数 F ∗ ( x ) F^*(x) F(x)
    F ∗ ( x ) = ∑ t = 0 T f t ( x ) 其中 , f t ( x ) = a t [ − ∂ L ( y , F ( x ) ) ∂ F ( x ) ] F ( x ) = F t − 1 ( x ) F^*(x)=\sum_{t=0}^Tf_t(x) \\ 其中,f_t(x)=a_t[-\frac{\partial L(y,F(x))}{\partial F(x)}]_{F(x)=F_{t-1}(x)} F(x)=t=0Tft(x)其中,ft(x)=at[F(x)L(y,F(x))]F(x)=Ft1(x)

  • 可以看到,这里的梯度变量是一个函数,是在函数空间上求解,而我们以前梯度下降算法是在多维参数空间中的负梯度方向,变量是参数

    • 为什么是多维参数,因为一个机器学习模型中可以存在多个参数。
    • 而这里的变量是函数,更新函数通过当前函数的负梯度方向来修正模型,使模型更优,最后累加的模型为近似最优函数

在这里插入图片描述

  • Gradient Boosting算法在每一轮迭代中,首先计算出当前模型在所有样本上的负梯度,然后以该值为目标训练一个新的弱分类器进行拟合并计算出该弱分类器的权重,最终实现对模型的更新。

梯度提升和梯度下降的区别和联系:

  • 两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新

  • 只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。

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

  • 梯度提升Gradient Boosting是Boosting中的一大类算法,它的思想借鉴于梯度下降法,其基本原理是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。采用决策树(通常为CART树)作为弱分类器的Gradient Boosting算法被称为GBDT。

在这里插入图片描述

1.3 几个容易混淆的概念

1.3.1 梯度提升和提升树算法

  • 提升树利用加法模型与前向分歩算法实现学习的优化过程。
  • 当损失函数是平方误差损失函数指数损失函数时,每一步优化是很简单的。
  • 但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用损失函数的负梯度在当前模型的值 [ − ∂ L ( y , F ( x ) ) ∂ F ( x ) ] F ( x ) = F t − 1 ( x ) [-\frac{\partial L(y,F(x))}{\partial F(x)}]_{F(x)=F_{t-1}(x)} [F(x)L(y,F(x))]F(x)=Ft1(x)作为提升树算法中残差的近似值,拟合一个梯度提升模型。

1.3.2 梯度提升和GBDT

  • 采用决策树作为弱分类器的Gradient Boosting算法被称为GBDT,GBDT中使用的决策树通常为CART。
  • GBDT使用梯度提升(Gradient Boosting)作为训练方法。
  • Gradient Boosting是Boosting中的一大类算法,其中包括:GBDT(Gradient Boosting Decision Tree)、XGBoost(eXtreme Gradient Boosting)、LightGBM (Light Gradient Boosting Machine)和CatBoost(Categorical Boosting)等。

  • 回归树可以利用集成学习中的Boosting框架改良升级得到提升树,提升树再经过梯度提升算法改造就可以得到GBDT算法,GBDT再进一步可以升级为XGBoost、LightGBM或者CatBoost。

1.4 GBDT回归算法

1.4.1 相关算法

  • 当我们采用的基学习器是决策树时,那么梯度提升算法就具体到了梯度提升决策树。

  • GBDT算法又叫MART(Multiple Additive Regression),是一种迭代的决策树算法。

  • GBDT算法可以看成是 M M M棵树组成的加法模型:

在这里插入图片描述

回归问题的提升树算法

我们在初识GBDT中就是使用下面的算法,所用损失函数为均方差损失。

在这里插入图片描述

GBDT梯度提升算法

  • 当损失函数是平方误差损失函数指数损失函数时,每一步优化是很简单的。
  • 但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。

《统计学习方法》中的所写梯度提升算法如下图:

在这里插入图片描述

上图中一棵树T(x)换成了公式表达,书中解释如下:

在这里插入图片描述

1.4.2 GBDT的回归任务常见的损失函数

对于GBDT回归模型,sklearn中实现了四种损失函数

  • 均方差’ls’。默认是均方差’ls’。一般来说,如果数据的噪音点不多,用默认的均方差’ls’比较好。
  • 绝对损失’lad’
  • Huber损失’huber’,如果是噪音点较多,则推荐用抗噪音的损失函数’huber’。
  • 分位数损失’quantile’。而如果我们需要对训练集进行分段预测的时候,则采用’quantile’。

在这里插入图片描述

在这里插入图片描述

2 GBDT算法案例

《统计学习方法》中例8.2给出一个求解回归问题的提升树模型案例。

一个更加复杂的回归问题的案例:GBDT算法原理以及实例理解

GBDT做二分类案例详解:【完善版】深入理解GBDT二分类算法

GBDT做多分类案例详解:深入理解GBDT多分类算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024中国航空航天暨无人机展览会8月在重庆举办

2024中国航空航天暨无人机展览会8月在重庆举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 为更好的培养航空航天产业人才,汇聚航空教育产业创新科技,…

IO流的基础详解

文件【1】File类: 封装文件/目录的各种信息,对目录/文件进行操作,但是我们不可以获取到文件/目录中的内容。 【2】引入:IO流: I/O : Input/Output的缩写,用于处理设备之间的数据的传输。 【3】…

Terraform 扩展

Terraform 扩展 Terraform Meta-Arguments 元参数 count 创建相似的资源for_each 创建相似的资源depends_on 定义资源或者模块的依赖provider 定义provider选项lifecycle 资源的生命周期行为 参数使用范围备注countresource module适用于创建多个相似的资源,使用…

Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

缓存穿透 什么是缓存穿透? 缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力&#xf…

读书笔记之人生算法(7)

孤独、爆仓与迷信 跨越出身和运气,实现富足与自由,用概率思维做好决策 13 孤独 孤独:获得好姻缘的算法 姻缘是奇妙的东西,体现了世界的随机性:即使是最理性的人,也可能需要靠运气寻找另一半。 中国有句古话…

Hot100【十一】:最大子数组和

// 定义dp:以i结尾的最大子数组和 dp[i] max(dp[i-1] nums[i],nums[i]) class Solution {public int maxSubArray(int[] nums) {// 1. 不需要特殊处理// 2. 定义dpint[] dp new int[nums.length];dp[0] nums[0];int maxResult nums[0];// 3. dp递推for (int i …

onSaveInstanceState()与onRestoreInstanceState()

目录 1.二者作用 2.onSaveInstanceState调用时机 2.1 五种情况 前4种情况Activity生命周期: 2.2 注意事项:确定会被系统回收并销毁,不会调用此方法 两个例子 3.onRestoreInstanceState调用时机 3.1实例——屏幕切换生命周期 3.2 极端…

https访问http的minio 图片展示不出来

问题描述:请求到的图片地址单独访问能显示,但是在网页中展示不出来 原因:https中直接访问http是不行的,需要用nginx再转发一下 nginx配置如下(注意:9000是minio默认端口,已经占用,…

RobotFramework教程2——第一个例子(hello world)

前言:安装好RF框架后,我们现在开始创建并执行我们的第一个测试用例,第一个例子当然是用入门经典“hello world”啦!运行也会有坑,注意避开,最新的东西不一定是现阶段最好的,稳定可运行才关键&am…

halcon缺陷检测-印刷品检测(差异化模型),键盘字符缺陷检测

前言 在实际项目中,印刷品缺陷检测是缺陷检测中的难点项目。通常印刷品检测往往具备缺陷小,缺陷所在位置不固定,出现少印或者多印的情况。并且由于产线原因,大量的印刷品在视野中的大小并不是完全一致的,可能出现细微…

《高通量测序技术》分享,生物信息学生信流程的性能验证,以肿瘤NGS基因检测为例。

这是这本书,第四章第五节的内容,这一部分是以NGS检测肿瘤基因突变为例,描述了其原理和大概流程,这和以前我分享的病原宏基因组高通量测序性能确认方案可以互相补充,大家可以都看一下,但是想要真正的弄懂&am…

AI应用实战2:使用scikit-learn进行回归任务实战

代码仓库在gitlab,本博客对应于02文件夹。 1.问题分析 在此篇博客中我们来对回归任务进行实战演练,背景是直播带货平台的业绩预测。第一步,就是分析问题。 问题痛点: 在直播带货平台上,由于市场环境多变、用户行为复…

SHOPFA:APP定制开发的哪种二开项目容易交付,哪些不可以接?

在商城系统开发领域,定制开发与二次开发(二开)是两种截然不同的项目类型。它们之间的主要差异体现在项目起点、灵活性、成本、时间以及风险等多个方面。 一、项目起点 商城定制开发通常是从零开始,根据客户的实际需求&#xff0c…

OpenOCD中flash编程算法的实现

OpenOCD中flash编程算法的实现 如何自己设计一个基于openocd调试架构的芯片下载算法,作为一个嵌入式er, 如果做MCU的开发是必须要了解的,因为各个芯片公司都有自己的芯片,而flash驱动各家有不同,所以往往需要自家的工程师去支持&…

【设计模式】笔记篇

目录标题 OO设计原则策略模式 - Strategy定义案例分析需求思路分析核心代码展示进一步优化UML 图 观察者模式 - Observe定义案例分析需求UML图内置的Java观察者模式核心代码 总结 装饰者模式 - Decorator定义案例分析需求UML图分析核心代码 总结 工厂模式 - Abstract Method/Fa…

【C++基础】变量和数据类型

变量和数据类型 引言:为什么需要变量?一、变量1. 变量的声明2. 变量的赋值3. 标识符4. 作用域5. 常量6. 注意 二、基本数据类型1. 整型1.1 常用整型1.2 无符号整型1.3 char类型1.4 bool类型 2. 浮点型3. 字面值常量3.1 整型字面值3.2 浮点型字面值3.3 字…

蓝桥杯第十二届c++大学B组详解

目录 1.空间 2.直线 3.路径 4.卡片 5.货物摆放 6.时间显示 7.砝码称重 8.杨辉三角 9.双向排序 10.括号序列 1.空间 题目解析:1Byte 8bit 1kb 1024B 1MB 1024kb; 先将256MB变成Byte 256 * 1024 * 1024; 再将32位 变成Byte就是 32 / 8 4;…

人工智能前沿成科技竞争新高地

以下文章来源:经济参考报 近日,首届中国具身智能大会(CEAI 2024)在上海举行。作为人工智能领域的前沿热点,具身智能正逐步走进现实,成为当前全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎。 “…

在Linux终端查找指定类型的文件并统计数量

下面举例说明: find /path/to/directory -type f -exec file {} \; | grep "MIDI"它的作用是在指定的目录(/path/to/directory)中搜索所有的文件(-type f),然后使用file命令检查每个文件的类型&a…

《QT实用小工具·二十四》各种数学和数据的坐标演示图

1、概述 源码放在文章末尾 该项目实现了各种数学和数据的坐标演示图&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef FRMMAIN_H #define FRMMAIN_H#include <QWidget> class QAbstractButton;namespace Ui { class frmMain; }class fr…