树模型原理与区别
RF,GBDT,XGBoost,lightGBM都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善基本学习器的泛化能力和鲁棒性。
随机森林(RandomForest)
原理:
Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择。
因此可以概括RF包括四个部分:
1、随机选择样本(放回抽样);
2、随机选择特征属性;
3、构建决策树;
4、随机森林投票(平均), 因此防止过拟合能力更强,降低方差。
优点:
- 随机森林算法能解决分类与回归两种类型的问题,表现良好,由于是集成学习,方差和偏差都比较低,泛化性能优越;
- 随机森林对于高维数据集的处理能力很好,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出特征的重要性程度,这是一个非常实用的功能。
- 可以应对缺失数据;
- 当存在分类不平衡的情况时,随机森林能够提供平衡数据集误差的有效方法;
- 高度并行化,易于分布式实现
- 由于是树模型 ,不需要归一化即可之间使用
缺点:
随机森林在解决回归问题时并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续型的输出。当进行回归时,随机森林不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合。
GBDT (Gradient Boosting Decision Tree)
原理:
GradientBoosting算法关键是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。
GBDT会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树) 因为Gradient Boosting 需要按照损失函数的梯度近似的拟合残差,这样拟合的是连续数值,因此只有回归树。
优点:
- 它能灵活的处理各种类型的数据;
- 在相对较少的调参时间下,预测的准确度较高。
缺点:
当然由于它是Boosting,因此基学习器之前存在串行关系,难以并行训练数据。
XGBoost
XGBoost与GBDT的区别: 在了解了XGBoost原理后容易理解二者的不同
-
损失函数的改变:(导数和正则项的认识)
传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性;
-
工具的优化:(趋势值和并行的认识)
shrinkage(缩减),相当于学习速率(XGBoost中的eta)。
-
列抽样:XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
-
对缺失值的处理:对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;
-
XGBoost工具支持并行
注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。
XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。
这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
缺点
- level-wise 建树方式对当前层的所有叶子节点一视同仁,有些叶子节点分裂收益非常小,对结果没影响,但还是要分裂,加重了计算代价。
- 预排序方法空间消耗比较大,不仅要保存特征值,也要保存特征的排序索引,同时时间消耗也大,在遍历每个分裂点时都要计算分裂增益(不过这个缺点可以被近似算法所克服)