【机器学习】集成学习各算法-gbdt,xgboost,lightgbm比较及优缺点特征总结

随机森林
优点

  1. 具有极高的准确率
  2. 随机性的引入,使得随机森林不容易过拟合,有很好的抗噪声能力,对异常点离群点不敏感
  3. 能处理很高维度的数据,并且不用做特征选择
  4. 既能处理离散型数据,也能处理连续型数据,数据集无需规范化(归一化)
  5. 实现简单,训练速度快,可以得到变量重要性排序(计算每个特征在分裂时被选到的次数或者某个特征不纯度平均下降了多少)
  6. 容易实现并行化
  7. 在创建随机森林的时候,对generlization error使用的是无偏估计,不需要额外的验证集

缺点

  1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合 
  2. 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
  3. 随机森林模型还有许多不好解释的地方,有点算个黑盒模型


Adaboost
优点

  1. 用于二分类或多分类的应用场景
  2. 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
  3. 无脑化,简单,不会overfitting,不用调分类器
  4. 不需要归一化
  5. 泛化错误率低,精度高,可应用在大部分分类器上,无需调整参数 
  6. 用于特征选择(feature selection)

缺点

  1. AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
  2. 数据不平衡导致分类精度下降。
  3. 训练比较耗时,每次重新选择当前分类器最好切分点。
  4. 对离群点敏感,在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰

GBDT
优点

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
  4. 不需要归一化。树模型都不需要,梯度下降算法才需要,
  5. 基分类器的叶子节点个数J选在[4,8]区间内较好,太小,需要太多的迭代次数。太大又容易过拟合。
  6. gbdt可以构造新特征,然后融合LR模型

缺点

  1. 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过子采样的SGBT来达到部分并行
  2. 不适合高维稀疏特征

XGBoost


之所以XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:

1.使用许多策略去防止过拟合,如:正则化项、Shrinkage 衰减 and Column Subsampling 列抽样等。

2. 目标函数优化利用了损失函数关于待求函数的二阶导数

3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。另外分裂 除了枚举所有不同树结构的贪心法,还实现了分裂点寻找近似算法。

4.添加了对稀疏数据的处理。

5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。

6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。

扫描二维码关注公众号,回复: 9716079 查看本文章

7.目标函数相对dbdt 显示的把树模型复杂度作为正则项加到优化目标中。

8.数据事先排序并且以block形式存储,有利于并行计算。

LightGBM

lightGBM 与 XGBoost的区别:

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

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

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

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

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

        LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;

优点:

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

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

(二)决策树生长策略上:

        XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)

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

(三)histogram 做差加速:

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

(四)直接支持类别特征(即不需要做one-hot编码)【注:这一点十我面试宜信公司一直溜掉的一点】

  实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的one-hot编码特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的one-hot编码展开。并在决策树算法上增加了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。

处理高维稀疏特征的时候LR效果比GBDT好?

https://blog.csdn.net/qq_32742009/article/details/81365969  【机器学习】集成学习各方法优缺点特征总结

https://blog.csdn.net/miclover_feng/article/details/82817391#%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A02%EF%BC%89GBDT%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0  决策树和集成学习

发布了86 篇原创文章 · 获赞 1 · 访问量 8209

猜你喜欢

转载自blog.csdn.net/a1272899331/article/details/104714892