一文读懂:GBDT梯度提升
先缕一缕几个关系:
- 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都是学习梯度的,学习残差只是学习梯度的一个特例!
如果我们是在做一个回归任务(就像是上面例子中预测年龄),采用平方损失:\(loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}\)
其中\(y_i\)是真实数值,\(\hat{y_i}\)是模型预测的值。
然后想求取这个关于\(\hat{y_i}\)的梯度,那就是:
\(\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})\)
所以残差在平方损失的情况下,就是等于负梯度,所以两者一回事。
残差过于敏感
对于数据不干净,没有清晰掉异常值的数据样本。使用平方损失对异常值过于敏感了:

所以,这里在回归问题中,也可以考虑使用下面的两个损失函数:
Absolute loss:
\(loss=|y-\hat{y}|\)Huber loss:
这个是设置一个阈值,当\(|y-\hat{y}|\)小于这个阈值的时候,采用平方损失,当\(|y-\hat{y}|\)大于这个阈值的时候,采用类似于绝对损失的线性损失:

这里看一下huber loss的函数图像:

就是一个平方损失,一个线性损失。
然后看一下平方损失,绝对损失,huber损失对于异常值的容忍程度:

CART回归树分裂思路(可不看)
其实这个问题看起来问的不明所以,其实是问你决策树如何选择特征的。从上面的例子可以看出来,GDBT应该是处理回归问题的(处理连续数据的)。当然,GDBT也有办法处理分类问题,只是这里就不说了,这里主要说GDBT怎么处理回归问题的,回归问题能处理,那么总有回归离散化的办法的
这个问题是在问:CART TREE如何选择特征的CART TREE就是回归决策树,就是之前提到的弱分类器。
一个决策树,希望读者已经有一个大概的理解了。简单说就是:样本可以根据的特征A是否超过某一个阈值划分成两部分,然后划分之后的每一个部分又可以根据某一个特征是否超过某一个阈值再分成两部分……
这样我们就要做出选择了:每一个部分是根据哪一个特征去划分?根据这个特征的哪一个数值作为阈值划分?
如果我们算力无穷,那么自然可以遍历每一个特征,然后穷举每一种可能的分割点,然后对比找到最优分割点。
那么如何判断分割的点的好坏呢?得给出一个cost函数,或者叫做loss函数这样的东西吧。
\(loss= \sum_{第一部分}{(y_i-me
an(y_{第一部分}))^2}+\sum_{第二部分}{(y_i-mean(y_{第二部分}))^2}\)
看一下这个公式,我把公式写的太丑了。其实这个公式非常的好理解:现在根据某一个特征值,根据某一个阈值把样本分成了两个部分:第一部分和第二部分。然后计算每一个部分的样本的label的均值,也就是公式中的:\(mean(y_{第一部分})\),\(mean(y_{第二部分})\),然后计算第一部分中所有样本的label与第一部分label均值之间的差的平方和,同样的过程计算第二个部分的,两个相加起来就是这个loss。选择能够让这个loss最小的分割特征和分割阈值,就是我们要找的东西。
其实我在学这一块的时候,发现这个过程像是什么?像不像聚类算法,通过上面的loss的最小化的过程,把一堆样本分成两类,让两类的类内距离最小。那个均值就像是求类中心点,计算每一个label距离类中心点的距离。(这一段看不懂也没事)
喜欢的话请关注我们的微信公众号~【你好世界炼丹师】。
- 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。
- 公众号内容建议作为课后的一些相关知识的补充,饭后甜点。
- 此外,为了不过多打扰,公众号每周推送一次,每次4~6篇精选文章。
微信搜索公众号:你好世界炼丹师。期待您的关注。

一文读懂:GBDT梯度提升的更多相关文章
- 一文读懂HTTP/2及HTTP/3特性
摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何 ...
- 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现
一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现 导读:近日,马云.马化腾.李彦宏等互联网大佬纷纷亮相2018世界人工智能大会,并登台演讲.关于人工智能的现状与未来,他们提出了各自的观点,也引 ...
- 一文读懂 深度强化学习算法 A3C (Actor-Critic Algorithm)
一文读懂 深度强化学习算法 A3C (Actor-Critic Algorithm) 2017-12-25 16:29:19 对于 A3C 算法感觉自己总是一知半解,现将其梳理一下,记录在此,也 ...
- [转帖]一文读懂 HTTP/2
一文读懂 HTTP/2 http://support.upyun.com/hc/kb/article/1048799/ 又小拍 • 发表于:2017年05月18日 15:34:45 • 更新于:201 ...
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- 一文读懂高性能网络编程中的I/O模型
1.前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力.本文(和下篇<高性能网络编程(六):一文读懂高性能网络编程中的线程模型>)旨在为大家提供有用的 ...
- 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...
- [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图
MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...
- [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路
从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路 http://www.52im.net/thread-1709-1-2.html 本文原作者阮一峰,作者博客:r ...
- 一文读懂HDMI和VGA接口针脚定义
一文读懂HDMI和VGA接口针脚定义 摘自:http://www.elecfans.com/yuanqijian/jiekou/20180423666604.html HDMI概述 HDMI是高清 ...
随机推荐
- 八皇后问题求解java(回溯算法)
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- 机器学习pdf资源
<深度学习>(Deep Learning)中文版pdf, 百度网盘: https://pan.baidu.com/s/1jHDiQTg <机器学习导论>(Introductio ...
- centos系统与ubuntu系统的区别
centos和ubuntu简述 CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Lin ...
- TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
前言 网上许多博客针对增大 TCP 半连接队列和全连接队列的方式如下: 增大 TCP 半连接队列的方式是增大 /proc/sys/net/ipv4/tcp_max_syn_backlog: 增大 TC ...
- vc程序设计--图形绘制2
// 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...
- Java实现 LeetCode 837 新21点(DP)
837. 新21点 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...
- Java实现 LeetCode 738 单调递增的数字(暴力)
738. 单调递增的数字 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= ...
- Java实现 LeetCode 409 最长回文串
409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意 ...
- Java实现 N的阶乘
import java.util.Scanner; public class n的阶乘 { public static void main(String[] args) { Scanner sc =n ...
- 震惊!当Python遇到Excel后,将开启你的认知虫洞
本文主要内容: 1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...