一文读懂:GBDT梯度提升

news/2024/5/20 10:15:47 标签: 算法, 决策树, 聚类, python, 机器学习

先缕一缕几个关系:

  • GBDT是gradient-boost decision tree
  • GBDT的核心就是gradient boost,我们搞清楚什么是gradient boost就可以了
  • GBDT是boost中的一种方法,boost还有XGBoost,adaboost。

基本概念

【Boost】就是让多个弱分类器,通过不同的集成方式,来让多个弱分类器变成一个强分类器。

【gradient-boost】 梯度提升。简单的说,先训练一个弱分类器,然后弱分类器和目标值之间的残差,作为下一个弱分类器训练的目标值。这里有一个非常简单的例子
在这里插入图片描述

  • 第一个模型预测年龄,虽然真实值是30岁,第一个模型只给出了20岁的估计值;
  • 第二棵树要预测的就是这个10岁的残差,但是第二棵树只给出了6岁的估计值;
  • 第三棵树预测的是第二棵树的4岁的残差,但是………………(禁止套娃)

梯度 or 残差 ?

对于GBDT,网上的很多文章都没有讲清楚,学习梯度还是学习残差?从上面的那个例子来看,是学习残差的。

其实,从来GBDT都是学习梯度的,学习残差只是学习梯度的一个特例!

如果我们是在做一个回归任务(就像是上面例子中预测年龄),采用平方损失: l o s s = 1 2 ∑ i n ( y i − y i ^ ) 2 loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2} loss=21in(yiyi^)2
其中 y i y_i yi是真实数值, y i ^ \hat{y_i} yi^是模型预测的值。

然后想求取这个关于 y i ^ \hat{y_i} yi^的梯度,那就是:
∂ l o s s ∂ y i ^ = ( − 1 ) ( y i − y i ^ ) \frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i}) yi^loss=(1)(yiyi^)

所以残差在平方损失的情况下,就是等于负梯度,所以两者一回事。

残差过于敏感

对于数据不干净,没有清晰掉异常值的数据样本。使用平方损失对异常值过于敏感了

所以,这里在回归问题中,也可以考虑使用下面的两个损失函数:

  • Absolute loss:
    l o s s = ∣ y − y ^ ∣ loss=|y-\hat{y}| loss=yy^

  • Huber loss:
    这个是设置一个阈值,当 ∣ y − y ^ ∣ |y-\hat{y}| yy^小于这个阈值的时候,采用平方损失,当 ∣ y − y ^ ∣ |y-\hat{y}| yy^大于这个阈值的时候,采用类似于绝对损失的线性损失:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PviLKEw-1592767763300)(http://helloworld2020.net/wp-content/uploads/2020/06/wp_editor_md_0a7adb4ce0211585abe60c1c177e9b28.jpg)]
    这里看一下huber loss的函数图像:

    就是一个平方损失,一个线性损失。


然后看一下平方损失,绝对损失,huber损失对于异常值的容忍程度:

CART回归树分裂思路(可不看)

其实这个问题看起来问的不明所以,其实是问你决策树如何选择特征的。从上面的例子可以看出来,GDBT应该是处理回归问题的(处理连续数据的)。当然,GDBT也有办法处理分类问题,只是这里就不说了,这里主要说GDBT怎么处理回归问题的,回归问题能处理,那么总有回归离散化的办法的

这个问题是在问:CART TREE如何选择特征的CART TREE就是回归决策树,就是之前提到的弱分类器。

一个决策树,希望读者已经有一个大概的理解了。简单说就是:样本可以根据的特征A是否超过某一个阈值划分成两部分,然后划分之后的每一个部分又可以根据某一个特征是否超过某一个阈值再分成两部分……

这样我们就要做出选择了:每一个部分是根据哪一个特征去划分?根据这个特征的哪一个数值作为阈值划分?

如果我们算力无穷,那么自然可以遍历每一个特征,然后穷举每一种可能的分割点,然后对比找到最优分割点。

那么如何判断分割的点的好坏呢?得给出一个cost函数,或者叫做loss函数这样的东西吧。

l o s s = ∑ 第 一 部 分 ( y i − m e a n ( y 第 一 部 分 ) ) 2 + ∑ 第 二 部 分 ( y i − m e a n ( y 第 二 部 分 ) ) 2 loss= \sum_{第一部分}{(y_i-me an(y_{第一部分}))^2}+\sum_{第二部分}{(y_i-mean(y_{第二部分}))^2} loss=(yimean(y))2+(yimean(y))2

看一下这个公式,我把公式写的太丑了。其实这个公式非常的好理解:现在根据某一个特征值,根据某一个阈值把样本分成了两个部分:第一部分和第二部分。然后计算每一个部分的样本的label的均值,也就是公式中的: m e a n ( y 第 一 部 分 ) mean(y_{第一部分}) mean(y), m e a n ( y 第 二 部 分 ) mean(y_{第二部分}) mean(y),然后计算第一部分中所有样本的label与第一部分label均值之间的差的平方和,同样的过程计算第二个部分的,两个相加起来就是这个loss。选择能够让这个loss最小的分割特征和分割阈值,就是我们要找的东西。

其实我在学这一块的时候,发现这个过程像是什么?像不像聚类算法,通过上面的loss的最小化的过程,把一堆样本分成两类,让两类的类内距离最小。那个均值就像是求类中心点,计算每一个label距离类中心点的距离。(这一段看不懂也没事


喜欢的话,可以微信扫码关注微信公众号【机器学习炼丹术】,成为炫酷的炼丹师吧~

公众号回复【下载】有精选的免费机器学习学习资料。 公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~

  • 机器学习的基础数学(PDF)】
  • 【竞赛中的大数据处理流程(PDF)】
  • 【如何做大数据的基础特征工程(PDF)】
  • 【自然语言处理NLP的应用实践大合集(PDF)】
  • python入门级教材(400页PDF)】

公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~

在这里插入图片描述


http://www.niftyadmin.cn/n/1358390.html

相关文章

一文入门:XGBoost与手推二阶导

作者前言 在2020年还在整理XGB的算法,其实已经有点过时了。。不过,主要是为了学习算法嘛。现在的大数据竞赛,XGB基本上已经全面被LGB模型取代了,这里主要是学习一下Boost算法。之前已经在其他博文中介绍了Adaboost算法和Gradient…

算法岗面试题:模型的bias和variance是什么?用随机森林举例

校招在即,准备准备一些面试可能会用到的东西吧。希望这次面试不会被挂。 基本概念 说到机器学习模型的误差,主要就是bias和variance。 Bias:如果一个模型的训练错误大,然后验证错误和训练错误都很大,那么这个模型就是…

AI面试题之(反)卷积输出尺寸计算

1 给我背住 【卷积计算公式】 outputinput2∗padding−kernelstride1output\frac{input2*padding-kernel}{stride}1outputstrideinput2∗padding−kernel​1 【反卷积计算公式】 outputstride∗(input−1)2∗padding−kernel2outputstride*(input-1)2*padding-kernel2outputs…

AI面试题之深入浅出卷积网络的平移不变性

卷积网络的平移不变性可能会经常在论文中看到,那这个到底是什么呢?看了一些论文的原文和网络上十几篇讲这个的博文,大概捋清了思路然后写下这个。不得不说,有的博文讲的有那么点问题。 1 什么是不变性 【不变性】就是目标发生了…

AI面试之SVM推导

SVM现在主流的有两个方法。一个是传统的推导,计算支持向量求解的方法,一个是近几年兴起的梯度下降的方法。 梯度下降方法的核心是使用了hinge loss作为损失函数,所以最近也有人提出的深度SVM其实就是使用hinge loss的神经网络。 本文的目的是…

【评价指标】详解F1-score与多分类MacroF1MicroF1

基本概念 首先,要背住的几个概念就是:accuracy,precision,recal, TP,FP,TN,FN TP:true positive。预测是正确的正样本FP:false positive。预测是错误的正样本TN:true negative。预测是正确的负样本FP:false positive。预测是错误的负样本 …

干货 | 这可能全网最好的BatchNorm详解

其实关于BN层,我在之前的文章“梯度爆炸”那一篇中已经涉及到了,但是鉴于面试经历中多次问道这个,这里再做一个更加全面的讲解。 Internal Covariate Shift(ICS) Batch Normalization的原论文作者给了Internal Covar…

项目总结 | 对【时间】构建的特征工程

写文章的目的在于之前面试的时候,提到某一个时间序列项目的特征工程处理。我说的大多数都是一些数据清洗、数据去除异常点、针对数据特性做出的特别的特征工程的操作,然后面试官给我的建议是下一次面试多说一下常规的特征工程处理,因为这样面…