RF,GBDT,XgBoost的区别

Random Forest:

主要运用到的方法是bagging,采用Bootstrap的随机有放回的抽样,抽样出N份数据集,训练出N个决策树。然后根据N个决策树输出的结果决定最终结果(离散型的输出:取最多的类别,连续型的输出:取平均数),是一种集成学习

下面引用的是谢益辉博士关于Bootstrap (和 Jackknife)基本思想的论述

一般情况下,总体永远都无法知道,我们能利用的只有样本,现在的问题是,样本该怎样利用呢?Bootstrap的奥义也就是:既然样本是抽出来的,那我何不从样本中再抽样(Resample)?Jackknife的奥义在于:既然样本是抽出来的,那我在作估计、推断的时候“扔掉”几个样本点看看效果如何?既然人们要质疑估计的稳定性,那么我们就用样本的样本去证明吧。

随机森林的优势:

  • 容易理解和解释
  • 不需要太多的数据预处理工作
  • 隐含地创造了多个联合特征,并能够解决非线性问题
  • 随机森林模型不容易过拟合
  • 自带out-of-bag (oob)错误评估功能
  • 并行化容易实现

随机森林的劣势:

  • 不适合小样本,只适合大样本
  • 精度较低
  • 适合决策边界是矩形的,不适合对角线型的

GBDT:

原理:
通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。一般选择cart tree且树的深度不会很深。

训练过程:
模型可以描述为:

Fm(x)=m=1MT(x;θm) F m ( x ) = ∑ m = 1 M T ( x ; θ m )

一共训练M轮,每轮产出一个弱分类器 T(x;θm) T ( x ; θ m ) 。弱分类的损失函数为
θm^=argmini=1NL(yi;Fm1(xi)+T(xi;θm)) θ m ^ = a r g m i n ∑ i = 1 N L ( y i ; F m − 1 ( x i ) + T ( x i ; θ m ) )

每一轮选择一个特征m的值j作为切分点。通过比较

minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2] min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ]

GBDT的另一个比较重要的用途可以用于组合特征
RF,GBDT,XgBoost的区别_第1张图片

我们 使用 GBDT 生成了两棵树,两颗树一共有五个叶子节点。我们将样本 X 输入到两颗树当中去,样本X 落在了第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,于是我们便可以依次构建一个五纬的特征向量,每一个纬度代表了一个叶子节点,样本落在这个叶子节点上面的话那么值为1,没有落在该叶子节点的话,那么值为 0.于是对于该样本,我们可以得到一个向量[0,1,0,1,0] 作为该样本的组合特征,和原来的特征一起输入到逻辑回归当中进行训练。实验证明这样会得到比较显著的效果提升。

GBDT一些调参的方式:

  • 树的个数 100~10000
  • 叶子的深度 3~8
  • 学习速率 0.01~1
  • 叶子上最大节点树 20
  • 训练采样比例 0.5~1
  • 训练特征采样比例 ( n n )

GBDT的优势:

  • 精度高
  • 能处理非线性数据
  • 能处理多特征类型
  • 适合低维稠密数据
  • 模型可解释性好
  • 不需要做特征的归一化,可以自动选择特征
  • 能适应多种损失函数

GBDT的劣势:

  • 不太适合并发执行
  • 计算复杂度高
  • 不适用高维稀疏特征

RF和GBDT的比较

相同点:

  • 都是由多棵树组成
  • 最终的结果都是由多棵树一起决定

不同点:

  • 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
  • 组成随机森林的树可以并行生成;而GBDT只能是串行生成
  • 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
  • 随机森林对异常值不敏感,GBDT对异常值非常敏感
  • 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
  • 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

XgBoost:

简单来说xgBoost是GBDT的一种高效实现,主要具有以下几个优势

  • 显式的把树模型复杂度作为正则项加到优化目标中。
  • 公式推导中用到了二阶导数,用了二阶泰勒展开。
  • 实现了分裂点寻找近似算法。
  • 可以并行执行

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

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

3.split finding algorithms(划分点查找算法):
3.1 exact greedy algorithm—贪心算法获取最优切分点
3.2 approximate algorithm— 近似算法,提出了候选分割点概念,先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。
3.3 Weighted Quantile Sketch—分布式加权直方图算法
这里的算法 3.2,3.3 是为了解决数据无法一次载入内存或者在分布式情况下算法 3.1 效率低的问题

可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

4.xgboost工具支持并行。xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的。xgboost的并行是在特征粒度上的。xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

你可能感兴趣的:(机器学习)