决策树及Ensemble家族的体系很庞大包括:

决策树(Decision tree)随机森林(Randomforest)Boosting, Bootstrap, Bagging, AdaBoost, GBDTGradient Boosting Decision Tree)XGBoost, LightGBM等等……

决策树

决策树就不细说了,具体可以看我之前的文章决策树 超详细推导,值得一提的是,决策树中的CART树是很多其他算法的基础。

Bootstrap

Boostrap应用很广泛,Boostrap在计算机领域也可以翻译做“自举”,代表着自力更生。boostrap通过有放回的抽样方式生成更多样本,从而达到扩大样本集,来更好研究样本的目的。

Bagging

Bagging是基于投票思想的方法,降低学习器方差。其原理是通过Boostrap的方式生成更多样本的样本,在每个样本的样本上用学习器学习,最后投票得出最终结果。

Random Forest

随机森林就是Bagging在决策树上的实现,不仅随机抽样,还限定特征的数量,让随机森林的种类更丰富。

Boosting

Boosting方法(代表是Adaboost,不断地方法错误样本点的权重)是一种基于弱分类器的方法,不断建立新的弱学习器,每一个都是针对上一个学习器不足的补充,可以提高任意给定学习算法准确度。

与Random Forest的区别:

  • Random Forest随机生成新;
  • Boosting是针对性提升上一个分类器不足之处进行补足;
  • Random forest每个分类器的权重相同;
  • Boosting的各个分类器权重不同;

GBDT(GRADIENT BOOSTING DECISION TREE)

GBDT是基于CART树(分类回归树)的Boosting方法,不过只用到了回归树。它会串行的建立很多棵树,来拟合上一步的残差,每个树是在残差减少的梯度方向建立新的模型,也就是说GBDT沿着残差减小方向的方向一步步优化算法。

最后每一棵树的预测值加在一起,就是给模型一个输入,它会落在叶子节点,然后最终会把每个叶子节点的weight加在一起。

包括在构建模型的时候,计算一个新树的loss的时候,它的预测值也是和前面几棵树的预测值加在一起来的。

XGBoosting

XGBoosting是GBDT的加强版,主要有几个改进方面:

  • 第一个最大的改变是加了正则,它目标函数里面除了损失函数以外,还加了正则项,防止过拟合。正则项是树的复杂度,包括叶子节点的个数,还有每个叶子节点上输出的weight的$L_2$惩罚,就是weight的平方和
  • 另外XGBoost的损失函数是泰勒展开到2阶,优化速度比一阶更快
  • XGBoost比GBDT多一个衰减因子,相当于一个学习率,可以减少新的树对于原本模型的影响,可以让树的数量变得更多;
  • 缺失值这里XGBoost也做了优化,都是工程上的,叫稀疏感知算法。 XGBoost在建树的时候是不考虑缺失值的,只考虑有值的样本。然后在建完树之后,再根据增益选择缺失值的路径。就是分别把缺失值样本放到左子树和右子树,来算增益,然后选择一个增益最高的方式放缺失值,这样就能算出来缺失值怎么算的。一方面保证建树的时候不会被缺失值影响,一方面还优化缺失值的分割。这个我觉得是XGBoost一个很好的设计。
  • 另外的一个区别就是因为找到最优权重的方法就和一阶加二阶梯度相关的一个公式。然后根据这个公式,XGBoost在分割的时候,计算的信息增益就不是简单的Gini指数了,这个增益也是和梯度有关系。
  • 不光支持CART,还支持线性分类器
  • XGBoost改进了划分点的查找方法,CART是遍历和贪心法,XGBoost使用候选分割点(在构建树的初始阶段就计算出所有的候选分割点)、分布式加权直方图
  • 每一轮迭代中使用交叉验证
  • 并行化处理提高速度(比如同时分割一层里面的所有节点),还使用了C/C++代码进一步提高速度
  • 其实XGBoost里面也有些问题,比如说稀疏感知算法,如果输入是稀疏矩阵的时候,一般是因为做one-hot之后feature太多,所以才用稀疏矩阵,这时候XGBoost会把0也当成缺失值处理,如果0是有意义的,这时候就失去很多特征。这时候就得考虑吧0改成比如说0.0001,来避免这种问题吧。

LightGBM

微软做的Boosting包,和XGBoost类似,不过做了优化

  • 之前都是按照层约束来迭代(level-wise)LightGBM变为叶约束(leaf-wise),每次选择分割信息增益率最大的点来分割。而不是把同一层的节点一视同仁。
  • 并行,实现了:

    • 1)特征并行(feature parallel)
    • 2)数据并行(data parallel)
    • 3)投票并行(voting parallel)
最后修改:2021 年 08 月 13 日 12 : 59 PM
如果觉得我的文章对你有用,请随意赞赏