理解GBDT算法(三)——基于梯度的版本

上一篇中我们讲到了GBDT算法的第一个版本,是基于残差的学习思路。今天来说第二个版本,可以说这个版本的比较复杂,涉及到一些推导和矩阵论知识。但是,我们今天可以看到,两个版本之间的联系,这个是学习算法的一个重要步骤。

这篇博文主要从下面这几个方面来说基于梯度的GBDT算法:

(1)算法的基本步骤;

(2)其中的学数学推导;

(3)基于梯度的版本和基于残差的版本之间的联系;

在讲解算法的详细步骤之前,我们可以先明确一个思路,就是梯度版本的GBDT是用多类分类Multi-class classification 的思想来实现的,或者可以说GBDT的这个版本融入到多类分类中可以更好的掌握。

1. 算法的基本步骤

首先网上很多讲解博客都会出现下面这个图:

那么也就是说梯度版的GBDT的算法主要有8个步骤。

(0)初始化所有样本在K个类别上的估计值。

F_k(x)是一个矩阵,我们可以初始化为全0,也可以随机设定。如下:

上面的矩阵中,我们假设有N=8个样本,每个样本可能会属于K=5个类别中的一个,其中估计值矩阵F初始化为0.

除此之外,这8个训练样本都是带着类别标签的,例如:

说明第i=1个样本是属于第3类的。

(1)循环下面的学习更新过程M次;

(2)对没有样本的函数估计值做logistic变换。

我们在前面介绍Logistic回归的时候提到,Logistic函数一个重要的特性就是可以转换为0~1之间的概率值,我们通过下面的变换公式就可以把样本的估计值转换为该样本属于某一类的概率是多少:

可以看到样本初始的时候每个类别的估计值都是0,属于类别的概率也是相等的,不过,随着后面的不断更新,其估计值不一样了,概率自然也就差别开来。

比如下面:

(3)遍历所有样本的每个类别的概率

这一步需要注意,遍历的是每个类别,而不是所有样本。如下:

为什么这里是按照类别逐个学习呢?因为后面需要给每个类别k学习出一个回归树。

(4)求每个样本在第k类上概率梯度

上面一步中,我们有了许多个样本属于某个类别k的概率,以及它们是否真正属于类别k的概率(这些样本都是训练样本,所以它们是否属于某个类别都是已知的,概率为0/1)。那么这个就是一个典型的回归问题。我们当然可以用回归树的算法来求解(注,这里就是多类分类问题和GBDT联系的关键)。

我们通过常见的建立代价函数,并求导的梯度下降法来学习。代价函数是对数似然函数的形式为:

对这个代价函数的求导,我们可以得到:

(详细的推导过程下一节给出)

有没有发现这里的求导得到的梯度形式居然是残差的形式:第i个样本属于第k个类别的残差 = 真实的概率 - 估计的概率。

这一步也是残差版本和梯度版本的联系。

这些的梯度也是下面我们构建回归树的学习方向。

(5)沿着梯度方法学习到J个叶子结点的回归树

学习的伪代码:

我们输入所有样本xi, i = 1~N, 以及每个样本在第k个类别上概率的残差作为更新方向,我们学习到有J个叶子的回归树。学习的基本过程和回归树类似:遍历样本的特征维数,选择一个特征作为分割点,需要满足最小均方差的原则,或者满足【左子树样本目标值(残差)和的平方均值+右子树样本目标值(残差)和的平方均值-父结点所有样本目标值(残差)和的平方均值】最大的准则,一旦学习到J个叶子结点,我们就停止学习。结果是该回归树中每个叶子上都会有许多个样本分布在上面。

记住:每个叶子上的样本,既有自己属于类别k的估计概率,也有真实概率,因为后面求增益需要用到它们。

(6)求每个叶子结点的增益

每个结点的增益计算公式为:

注意后标,每个叶子结点j都有一个增益值(不是向量,是值)。计算的时候需要用到该叶子结点上的所有样本的梯度。

换句话说,每个叶子结点都可以计算出一个增益值,记住是值啊!

(7)更新所有样本在第k类下的估计值

上一步中求得的增益是基于梯度计算得到的,而且前面说到的梯度和残差有一定的关联,我们可以利用这个增益更新样本的估计值。

第m次迭代中的第k类下,所有样本的估计值F可以通过上次迭代m-1中,这些样本的估计值+增益向量求得。注意,这个增益向量需要把所有的J个叶子结点的增益值求和,然后和向量1相乘,而得。

也就是我们上面讲的,第k类的所有样本的估计值是一列:

也就是按列更新,前面有对类别数k的循环,所以每一类(每一列)的估计值都可以更新。一定记住是按列更新,每一类(每一列)都建立一个回归树来更新下去,最后原始的K类的N个样本的估计值矩阵都更新了一遍,带着这个新的估计值矩阵,我们进入下次m+1次的迭代学习。

如此,迭代学习M次之后,我们可以得到最终的所有样本在所有类别下的估计值矩阵,基于这个估计值矩阵,我们可以实现多类分类。

这样,基于梯度版本的GBDT算法的所有详细步骤我们都说完了。

2. 公式推导

上面建立的代价函数是对数似然函数的形式:

对这个代价函数的求导,我们可以得到:

那么其中的详细推导过程是什么呢?

其中涉及到对数函数的求导,主要是最后一步,yi是样本属于第k类的真实概率,故yi就是0/1数,而且K个类别中只可能属于一个类别,也就是说只有一个yi是1,其余全是0,所以有最后一步推导结果。

3. 两个版本之间的联系

前面我们提到的一些联系,这儿再总结一下:

  • 基于残差的版本四把残差作为全局方向,偏向于回归的应用。而基于梯度的版本是把代价函数的梯度方向作为更新的方向,适用范围更广。
  • 如果使用Logistic函数作为代价函数,那么其梯度形式和残差的形式类似,这个就说明两个版本之间是紧密联系的,虽然实现的思路不同,但是总体的目的是一样的。或者说残差版本是梯度版本的一个特例,当代价函数换成其余的函数,梯度的版本仍是适用的。

参考:

http://blog.csdn.net/w28971023/article/details/43704775

http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/1976562.html

http://blog.csdn.net/kunlong0909/article/details/17587101

http://blog.csdn.net/puqutogether/article/details/44752611

时间: 2024-08-29 19:52:02

理解GBDT算法(三)——基于梯度的版本的相关文章

理解GBDT算法(二)——基于残差的版本

GBDT算法有两种描述思路,一个是基于残差的版本,一个是基于梯度gradient的版本.这篇我们先说说基于残差的版本. 前面一篇博文已经说了该版本的大致原理,请参考. http://blog.csdn.net/puqutogether/article/details/41957089 这篇我们再总结一个几个注意点: 这个版本的核心思路:每个回归树学习前面树的残差,并且用shrinkage把学习到的结果大步变小步,不断迭代学习.其中的代价函数是常见的均方差. 其基本做法就是:先学习一个回归树,然后

集成学习之梯度提升树(GBDT)算法

梯度提升树(GBDT)的全称是Gradient Boosting Decision Tree.GBDT还有很多的简称,例如GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ),GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree)等,其实都是指的同一种算法,本文统一简称GBDT. GBDT 也是 Boosting 算法的一种,但是

GBDT算法简述

提升决策树GBDT 梯度提升决策树算法是近年来被提及较多的一个算法,这主要得益于其算法的性能,以及该算法在各类数据挖掘以及机器学习比赛中的卓越表现,有很多人对GBDT算法进行了开源代码的开发,比较火的是陈天奇的XGBoost和微软的LightGBM 一.监督学习 1.  监督学习的主要任务 监督学习是机器学习算法中重要的一种,对于监督学习,假设有m个训练样本: 其中, ,如分类问题:也可以为连续值,如回归问题.在监督学习中利用训练样本训练出模型,该模型能够细线从样本特征 . 为了能够对映射F进行

GBDT算法梳理

1.GBDT(Gradient Boosting Decision Tree)思想 Boosting : 给定初始训练数据,由此训练出第一个基学习器: 根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注: 用调整后的样本,训练下一个基学习器: 重复上述过程 T 次,将 T 个学习器加权结合. Gradient boosting Gradient boosting是 boosting 的其中一种方法,它主要的思想是,每一次建立单个学习器时,是在之前建立的模型的损失函数的梯度下降

GBDT 算法:原理篇

本文由云+社区发表 GBDT 是常用的机器学习算法之一,因其出色的特征自动组合能力和高效的运算大受欢迎. 这里简单介绍一下 GBDT 算法的原理,后续再写一个实战篇. 1.决策树的分类 决策树分为两大类,分类树和回归树. 分类树用于分类标签值,如晴天/阴天/雾/雨.用户性别.网页是否是垃圾页面: 回归树用于预测实数值,如明天的温度.用户的年龄.网页的相关程度: 两者的区别: 分类树的结果不能进行加减运算,晴天 晴天没有实际意义: 回归树的结果是预测一个数值,可以进行加减运算,例如 20 岁 3

基于梯度场和Hessian特征值分别获得图像的方向场

一.?我们想要求的方向场的定义为: 对于任意一点(x,y),该点的方向可以定义为其所在脊线(或谷线)位置的切线方向与水平轴之间的夹角: 将一条直线顺时针或逆时针旋转 180°,直线的方向保持不变. 因此,指纹方向场的取值范围一般定义为[0,π)或[-π/2, π/2),前闭后开区间的意义在于保证方向场取值的唯一性. 二.基于梯度场计算方向场 论文 <Analyzing Oriented Patterns> 网址:https://wenku.baidu.com/view/f741d931cc17

一步一步理解Paxos算法

一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS上.即便如此paxos算法还是没有得到重视,2001年Lamport用可读性比较强的叙述性语言给出算法描述.可见Lamport对 paxos算法情有独钟.近几年paxos算法的普遍使用也证明它在分布式一致性算法中的重要地位.06年google的三篇论文初现“云”的端倪,其中的chubby锁服务使用p

7、Cocos2dx 3.0游戏开发找小三之3.0版本的代码风格

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

从零实现来理解机器学习算法:书籍推荐及障碍的克服

前部为英文原文,原文链接:http://machinelearningmastery.com/understand-machine-learning-algorithms-by-implementing-them-from-scratch/ 后部为中文翻译,本文中文部分转自:http://www.csdn.net/article/2015-09-08/2825646 Understand Machine Learning Algorithms By Implementing Them From