GBRT 要点理解

1. 首先要理解Boost和Gradient Boost。 前者是在算法开始时候,,为每一个样本赋上一个相等的权重值,也就是说,最开始的时候,大家都是一样重要的。在每一次训练中得到的模型,会使得数据点的估计有所差异,所以在每一步结束后,我们需要对权重值进行处理,而处理的方式就是通过增加错分类点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的基分类器(basic learner),最后将它们组合起来,可以对它们进行加权(错误率越大的基分类器权重值越小,错误率越小的基分类器权重值越大)、或者让它们进行投票等得到一个最终的模型。

Gradient Boost与传统的Boost有着很大的区别,它的每一次计算都是为了减少上一次的残差(residual),而为了减少这些残差,可以在残差减少的梯度(Gradient)方向上建立一个新模型。所以说,在Gradient Boost中,每个新模型的建立是为了使得先前模型残差往梯度方向减少,与传统的Boost算法对正确、错误的样本进行加权有着极大的区别。 它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

2. 要理解Gradient Boost有以下几个步骤,

首先,我们需要有训练集,损失函数和迭代次数。损失函数事实上是可以任意的,如果是平方损失函数,则对其求导就是残差。损失函数是可以任意的。如使用指数损失函数,则可以对错分样本放大来boost。

其次,初始化第一颗树后,我们需要计算损失函数在现有模型上的梯度方向,这个向量就是算法下面的,这个向量怎么计算呢,对于平方损失函数来说,其求导就是残差值,对其他损失函数,也可以根据求导函数求的

然后,根据这个梯度向量,以及 之前的样本点,组成一个训练集 ,根据这个训练集,训练一个较弱的分类器,这个分类器可以是tree,于是就成了GBRT,也可以是其他分类器,记做 

再然后,我们需要知道在第m次迭代后这个新的基分类器在整个模型中的权重,为了找到最佳权重,将新的基分类器加入到原来的整个模型组合中,记做,为了获得h前的权重参数,利用 line search的方法,将其放入损失函数中,寻找最优的

最后,更新总体模型,至此一个循环结束 

算法流程如下:

需要注意几点:

a. 每次迭代获得的base learner,可以是树也可以是其他分类器。 这个分类器前的权重,可以是针对一整颗树的,也可以针对那颗树的每个叶子节点的,如果是针对叶子节点的,则可以写成:,其中J是叶子节点个数

b. 叶子节点的数目限制了base learner的大小,一般建议每颗树的叶子节点在4-8 个内

c. 为了避免 过拟合的问题,通常会设置一个收敛参数 Shrinkage,这个参数在每次基分类器加入到整体模型时候起作用,简单的说,就是 

d. 当GBRT用来解决分类问题的时候,其中的梯度向量事实上转变成了概率梯度向量,即各分类的概率梯度方向,算法可以更新如下,通常损失函数可以定义为负的log似然

3. GBRT的优缺点和参数

优点: 非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换,防止过拟合

缺点:迭代树有时序性,并行化比较困难且效果不佳

参数主要有:

1. 树个数 (迭代次数 M)
2. 树深度 
3. 缩放因子 
4. 损失函数 (通常是平方损失函数)
5. 数据采样比 
6. 特征采样比

时间: 2024-10-13 06:57:56

GBRT 要点理解的相关文章

[有码有真相]python类私有属性等要点理解及测试示例代码

# encoding: utf-8 ''' 1. python约定类定义中"__"开头(至多一个"_"结尾)的属性为"相对"的私有属性 2. 私有属性在类及其子类定义中是"可见"的,在 其它范围正常访问是相对"不可见"的 3. 留下子类可以修改父类私有属性的口子方便debug测试等 4. 在类定义以外可以通过['_'+className+'私有属性名称']名称访问 5. 私有属性引入是避免类,实例等混淆和冲

(二)线程同步_1---同步一个方法

同步一个方法(Synchronizing a method) 在并发编程中,最常见的情景莫过于多线程共享同一资源的情景了,例如多个线程同时读写相同的数据或者同时访问相同的文件或数据库连接,如果不采取一个控制机制,那么就会造成数据的不一致甚至是错误发生: 为了解决这些问题,引入了临界区域(critical section)的概念,一个临界区域是指一个用来控制资源访问的代码块,以保证被访问的资源不会同时被多个线程访问,从而保证了数据的一致性: java中提供了Synchronization机制,当一

用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM——Android端消息处理机制

NhmFramework Android端的消息处理机制原理 1.概要表述:在我们的框架中,Android客户端通过继承Application来控制整个应用程序的生命周期,在Application onCreate()方法中,我们将启动一个MainService,这个Service将负责Activity的异步消息处理(包括异步Http请求).任务调度.数据共享等大部分持久化操作.那么这样做的目的何在呢? 1)异步消息处理:在Service中实现异步消息处理是为了将Activity的界面显示的操作

补习系列-springboot-restful应用

一.目标 了解 Restful 是什么,基本概念及风格: 能使用SpringBoot 实现一套基础的 Restful 风格接口: 利用Swagger 生成清晰的接口文档. 二.Restful 入门 什么是REST 摘自百科的定义:REST即表述性状态转移(英文:Representational State Transfer,简称REST) 是Roy Fielding博士(HTTP规范主要贡献者)在2000年的论文中提出来的一种软件架构风格. 是一种针对网络应用的设计和开发方式,可以降低开发的复杂

多文档读写

51CTO下载-C#读取doc,pdf,ppt文件 C#读取doc,pdf,ppt文件 doc pdf ppt与 txt之间的转换 : 组件的作用一般是将文件读出成字符格式,并不是单纯的转换文件名后缀,所以需要将读出的东西写入txt文件 . 添加office引用 .net中对office中的word及ppt进行编程时,确保安装office时已经安装了word,ppt可编程组件(自定义安装时可查看)或者安装“Microsoft Office 2003 Primary Interop Assembl

hdu 1736

参考:https://www.cnblogs.com/inmoonlight/p/5512878.html 要点 理解汉字的输入和输出方式:在GBK编码的情况下,一个汉字占据两个字节,在输出的时候,例:char str[] 中储存了“中”一个字,输出的时候cout<<str[0]<<endl;和cout << str[1] << endl;不会在控制台上输出字符.cout << str[0] << str[1] << en

理解webpack4.splitChunks之其余要点

splitChunks除了之前文章提到的规则外,还有一些要点或是叫疑惑因为没有找到官方文档的明确说明,所以是通过我自己测试总结出来的,只代表我自己的测试结果,不一定正确. splitChunks.cacheGroup必须同时满足各个条件才能生效,这个之前我理解错误,我以为比如minSize或是minChunks等条件只要满足一条就可以拆分,但是实际上必须同时满足才行 splitChunks的配置项都是作用于cacheGroup上的,如果将cacheGroup的默认两个分组vendor和defau

0003.深入理解JavaScript系列学习:编写高质量JavaScript代码的基本要点

推荐 汤姆大叔博客园深入理解JavaScript系列 此文来源:http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html 书写可维护的代码(Writing Maintainable Code ) 即 代码的可读写维护性 博客园<行者自若的技术笔记> 中参考代码规范与读写可维护性 可作为参考,我也转载了文章到自己的博客园 http://www.cnblogs.com/wolongjv/articles/5937898.html 概括

深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情.具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读,以及更多. 此摘要也包括一些与代码不太相关的习惯,但对整体代码的创建息息相关,包括撰写API文档.执行同行评审以及运行JSLint.这些习惯和最佳做法可以