RF、GBDT、XGBoost、lightGBM原理与区别

  RF、GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是经过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性。
  根据个体学习器的生成方式,目前的集成学习方法大体分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的表明就是Boosting,后者的表明是Bagging和“随机森林”(Random Forest)。html

一、RF
1.1 原理
  提到随机森林,就不得不提Bagging,Bagging能够简单的理解为:放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。
  Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程当中引入了随机特征选择,所以能够归纳RF包括四个部分:一、随机选择样本(放回抽样);二、随机选择特征;三、构建决策树;四、随机森林投票(平均)。
  随机选择样本和Bagging相同,随机选择特征是指在树的构建中,会从样本集的特征集合中随机选择部分特征,而后再从这个子集中选择最优的属 性用于划分,这种随机性致使随机森林的误差会有稍微的增长(相比于单棵不随机树),可是因为随机森林的‘平均’特性,会使得它的方差减少,并且方差的减少补偿了误差的增大,所以整体而言是更好的模型。
  在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF一般对分类问题使用简单投票法,回归任务使用简单平均法。
  RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集得到无偏估计,它能够在内部进行评估,也就是说在生成的过程当中能够对偏差进行无偏估计,因为每一个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对其泛化性能进行“包外估计”。
  RF和Bagging对比:RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林一般会收敛到更低的泛化偏差。随机森林的训练效率也会高于Bagging,由于在单个决策树的构建中,Bagging使用的是‘肯定性’决策树,在选择特征划分结点时,要对全部的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。
1.2 优缺点
  随机森林的优势较多,简单总结:一、在数据集上表现良好,相对于其余算法有较大的优点(训练速度、预测准确度);二、可以处理很高维的数据,而且不用特征选择,并且在训练完后,给出特征的重要性;三、容易作成并行化方法。
  RF的缺点:在噪声较大的分类或者回归问题上回过拟合。
二、GBDT
  提GBDT以前,谈一下Boosting,Boosting是一种与Bagging很相似的技术。不管是Boosting仍是Bagging,所使用的多个分类器类型都是一致的。可是在前者当中,不一样的分类器是经过串行训练而得到的,每一个新分类器都根据已训练的分类器的性能来进行训练。Boosting是经过关注被已有分类器错分的那些数据来得到新的分类器。
  因为Boosting分类的结果是基于全部分类器的加权求和结果的,所以Boosting与Bagging不太同样,Bagging中的分类器权值是同样的,而Boosting中的分类器权重并不相等,每一个权重表明对应的分类器在上一轮迭代中的成功度。
2.1 原理
  GBDT与传统的Boosting区别较大,它的每一次计算都是为了减小上一次的残差,而为了消除残差,咱们能够在残差减少的梯度方向上创建模型,因此说,在GradientBoost中,每一个新的模型的创建是为了使得以前的模型的残差往梯度降低的方法,与传统的Boosting中关注正确错误的样本加权有着很大的区别。
  在GradientBoosting算法中,关键就是利用损失函数的负梯度方向在当前模型的值做为残差的近似值,进而拟合一棵CART回归树。
  GBDT的会累加全部树的结果,而这种累加是没法经过分类完成的,所以GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也能够用于分类但不表明GBDT的树为分类树)。
2.2 优缺点
  GBDT的性能在RF的基础上又有一步提高,所以其优势也很明显,一、它能灵活的处理各类类型的数据;二、在相对较少的调参时间下,预测的准确度较高。
  固然因为它是Boosting,所以基学习器以前存在串行关系,难以并行训练数据。web

三、XGBoost
3.1 原理
  XGBoost的性能在GBDT上又有一步提高,而其性能也能经过各类比赛管窥一二。坊间对XGBoost最大的认知在于其可以自动地运用CPU的多线程进行并行计算,同时在算法精度上也进行了精度的提升。
  因为GBDT在合理的参数设置下,每每要生成必定数量的树才能达到使人满意的准确率,在数据集较复杂时,模型可能须要几千次迭代运算。可是XGBoost利用并行的CPU更好的解决了这个问题。
3.2优势
  一、传统的GBDT以CART树做为基学习器,XGBoost还支持线性分类器,这个时候XGBoost至关于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,获得一阶和二阶导数;
  二、XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差误差来看,它下降了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
  三、shrinkage(缩减),至关于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
  四、列抽样。XGBoost借鉴了随机森林的作法,支持列抽样,不只防止过 拟合,还能减小计算;
  五、对缺失值的处理。对于特征的值有缺失的样本,XGBoost还能够自动 学习出它的分裂方向;
  六、XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。咱们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(由于要肯定最佳分割点),XGBoost在训练以前,预先对数据进行了排序,而后保存为block结构,后面的迭代 中重复地使用这个结构,大大减少计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,须要计算每一个特征的增益,最终选增益最大的那个特征去作分裂,那么各个特征的增益计算就能够开多线程进行。
3.3缺点
  一、level-wise 建树方式对当前层的全部叶子节点一视同仁,有些叶子节点分裂收益很是小,对结果没影响,但仍是要分裂,加剧了计算代价。
  二、预排序方法空间消耗比较大,不只要保存特征值,也要保存特征的排序索引,同时时间消耗也大,在遍历每一个分裂点时都要计算分裂增益(不过这个缺点能够被近似算法所克服)
四、lightGBM
4.1 与XGboost对比
  一、xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层全部节点作无差异分裂,可能有些节点的增益很是小,对结果影响不大,可是xgboost也进行了分裂,带来了务必要的开销。 leaft-wise的作法是在当前全部叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种作法容易过拟合,由于容易陷入比较高的深度中,所以须要对最大深度作限制,从而避免过拟合。
  二、lightgbm使用了基于histogram的决策树算法,这一点不一样与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优点。
  (1)内存上优点:很明显,直方图算法的内存消耗为(#data* #features * 1Bytes)(由于对特征分桶后只需保存特征离散化以后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),由于xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值须要32位的浮点数来保存。
  (2)计算上的优点,预排序算法在选择好分裂特征计算分裂收益时须要遍历全部样本的特征值,时间为(#data),而直方图算法只须要遍历桶就好了,时间为(#bin)
  三、直方图作差加速
一个子节点的直方图能够经过父节点的直方图减去兄弟节点的直方图获得,从而加速计算。
  四、lightgbm支持直接输入categorical 的feature
在对离散特征分裂时,每一个取值都看成一个桶,分裂时的增益算的是”是否属于某个category“的gain。相似于one-hot编码。
  五、多线程优化算法

参考:
一、http://blog.csdn.net/qq_28031525/article/details/70207918
二、https://www.cnblogs.com/mata123/p/7440774.html
三、http://www.noobyard.com/article/p-ayhjyfeh-co.html多线程