1、衡量决策树(结果是离散的)划分纯度的方式(也就是划分指标是否对数据进行最恰当地划分):信息增益(ID3)、信息增益率(C4.5)、基尼系数(CART)等等。
2、回归树的关键点、参数:(1)选取哪个feature分裂节点呢;(2)节点的预测值(总不能靠取平均值这么粗暴不讲道理的方式吧,好歹高级一点)。
3、确定分裂用的feature,how?最简单的是粗暴的枚举,选择loss function效果最好的那个(关于粗暴枚举,Xgboost的改良并行方式咱们后面看);(2)如何确立节点的ww 以及最小的loss function,大声告诉我怎么做?对,二次函数的求最值(细节的会注意到,计算二次最值是不是有固定套路,导数=0的点,ok)

Xgboost是很多CART回归树集成,注意这里说的是CART回归树,那么什么是CART:
1:CART既可以是分类树,又可以使回归树
2:当CART是分类树时,采用GINI值作为节点分裂的依据;当CART是回归树时,采用样本的最小方差作为节点分裂的依据;
3:CART是一棵二叉树。
GINI值的计算公式:

节点越不纯,GINI值越大。以二分类为例,如果节点的所有数据只有一个类别,则
如果两类数量相同,则
回归方差计算公式:

方差越大,表示该节点的数据越分散,预测的效果就越差。如果一个节点的所有数据都相同,那么方差就为0,此时可以很肯定得认为该节点的输出值;如果节点的数据相差很大,那么输出的值有很大的可能与实际值相差较大。因此,无论是分类树还是回归树,CART都要选择使子节点的GINI值或者回归方差最小的属性作为分裂的方案。
CART对连续型属性的处理与C4.5差不多,通过最小化分裂后的GINI值或者样本方差寻找最优分割点,将节点一分为二,在这里不再叙述,详细请看C4.5。
对于离散型属性,理论上有多少个离散值就应该分裂成多少个节点。但CART是一棵二叉树,每一次分裂只会产生两个节点,怎么办呢?很简单,只要将其中一个离散值独立作为一个节点,其他的离散值生成另外一个节点即可。这种分裂方案有多少个离散值就有多少种划分的方法,举一个简单的例子:如果某离散属性一个有三个离散值X,Y,Z,则该属性的分裂方法有{X}、{Y,Z},{Y}、{X,Z},{Z}、{X,Y},分别计算每种划分方法的基尼值或者样本方差确定最优的方法。
如何剪枝:选择表面误差率增益值最小的非叶子节点进行剪枝。
表面误差率增益值的计算公式:
Gradient Boost:

Gradient Boost优缺点

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

缺点:Boost是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维稀疏特征。

XGBoost

XGBoost能自动利用cpu的多线程(可并行),而且适当改进了gradient boosting,加了剪枝,控制了模型的复杂程度

传统GBDT以CART作为基分类器,特指梯度提升决策树算法,而XGBoost还支持线性分类器(gblinear),这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

xgboost中树节点分裂时所采用的公式:

Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(传统GBDT的实现也有学习速率)

列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

xgboost工具支持并行。注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。(特征粒度上的并行,block结构,预排序)

这个公式形式上跟ID3算法、CART算法是一致的,都是用分裂后的某种值减去分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。

XGBoost优势小结:

显式地将树模型的复杂度作为正则项加在优化目标公式推导里用到了二阶导数信息,而普通的GBDT只用到一阶允许使用列抽样(column(feature) sampling)来防止过拟合,借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗。节点分裂算法能自动利用特征的稀疏性。样本数据事先排好序并以block的形式存储,利于并行计算penalty function Omega主要是对树的叶子数和叶子分数做惩罚,这点确保了树的简单性。支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit。

XGBoost与GDBT的区别

  1. XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。

  2. XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。

  3. XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。

lightGBM:基于决策树算法的分布式梯度提升框架。

lightGBM与XGBoost的区别:

切分算法(切分点的选取)

占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)

空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存

时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大

对cache优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点

LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点在于决策树生长策略上:
XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)

LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

直接支持类别特征:LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。并在决策树算法上增加了类别特征的决策规则。

分布式训练方法上(并行优化)

在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;

在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行(Parallel Voting)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。

特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。

数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

优点:
LightGBM针对这两种并行方法都做了优化,
Cache命中率优化
基于直方图的稀疏特征优化
DART(Dropout + GBDT)
GOSS(Gradient-based One-Side Sampling):一种新的Bagging(row subsample)方法,前若干轮(1.0f / gbdtconfig->learning_rate)不Bagging;之后Bagging时, 采样一定比例g(梯度)大的样本

LightGBM优点小结(相较于XGBoost)

速度更快
内存消耗更低

第二篇:对CART,Gradient Boost,Xgboost,LightGBM的学习相关推荐

  1. Python:第二篇【Python】进阶-关东升-专题视频课程

    Python:第二篇[Python]进阶-614人已学习 课程介绍         本书是智捷课堂开发的立体化图书中的一本,所谓"立体化图书"就是图书包含:书籍.视频.课件和服务等 ...

  2. xgboost, lightgbm, catboost, 谁才是预言之战的最终赢家?

    引子: xgboost,lightgbm和catboost都是非常好用的工具,它们将多个弱分类器集成为一个强分类器.在此对他们使用的框架背景和不同之处做简单的总结. xgboost vs lightg ...

  3. 从xgboost, lightgbm 到catboost

    CSDN xgboost 目标函数 O b j t = ∑ j = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) Obj^t= \sum_{j=1}^T(G_jw_j ...

  4. XGBoost, LightGBM

    目录 XGBoost (eXtreme Gradient Boosting) Regularized Learning Objective Gradient Tree Boosting (How do ...

  5. 机器学习中的算法:决策树模型组合之GBDT(Gradient Boost Decision Tree)

    转载自:http://blog.csdn.net/holybin/article/details/22914417 前言 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速 ...

  6. Django框架之第二篇

    Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...

  7. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  8. 深入理解javascript函数系列第二篇——函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...

  9. Spotify敏捷模式详解三部曲第二篇:研发过程

    本文转自:Scrum 中文网 引言 在本系列文章的第一篇,我们介绍了Spotify的敏捷研发团队,以及它独特的组织架构.Spotify的研发团队采用的是一种非常独特的组织架构,如下图所示: 整个研发组 ...

最新文章

  1. 捷讯技术分享SSH 无法远程登录问题的处理办法汇总
  2. 近十年和近三年智能车竞赛国赛奖项在各赛区的分布分析
  3. 「MTA」的「錯誤訊息代碼」
  4. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
  5. 网页同步交互和异步交互的区别?
  6. 【附源码】一看就懂的感知机算法PLA
  7. fastjson safemode_它又又又来了,Fastjson 最新高危漏洞来袭!
  8. 【SHOI2017】相逢是问候【扩展欧拉定理】【复杂度分析】【线段树】
  9. ssl提高组周六备考赛【2018.10.27】
  10. postman里测试文件上传(MultipartFile)
  11. redis数据类型hash总结
  12. hashset去重原理_9道Java集合面试题,搞定了再去投简历吧!
  13. spring data redis的使用jar包版本冲突问题
  14. 谁给讲讲语音识别中的CTC方法的基本原理?
  15. JavaScript 游戏开发包-收集
  16. python_datetime
  17. Ubuntu安装Jenkins
  18. word排版快捷指令_常用的Word快捷键大全
  19. Qt编写自定义控件65-光晕日历
  20. c# Excel 添加组合Range区域,方便选择Select()删除 Delete()

热门文章

  1. 1.无重复字符的最长子串
  2. 小程序中字符串转数组如何实现
  3. bzoj1217: [HNOI2003]消防局的设立 [树形dp]
  4. c# 事件和委托的区别,使用事件的好处
  5. 【聚类】- 聚类实现的数据结构抽象
  6. C#中常用的几个委托
  7. 深入探究ConvNets vs. Transformers,哪种预训练模型的可迁移性更好?
  8. 大会门票限免最后一周!来聊聊 NVIDIA、抖音等大厂的 AI 技术落地
  9. ICCV2021 Oral | UNO:用于“新类发现”的统一目标函数,简化训练流程!已开源!...
  10. DAS 2020 Keynote Speech | 深度学习时代的 OCR