机器学习之boosting和bagging

整理出所有介绍boosting和bagging的文章进行归纳总结

机器学习算法总结(四)——GBDT与XGBOOST
[Machine Learning & Algorithm] 随机森林(Random Forest)
机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
GBDT 算法:原理篇

这篇文章的公式推理特别清楚,GBDT和XGboost都推理了一遍,公式推导的可以看看

决策树(decision tree)(四)——缺失值处理
这篇文章写的特别详细,强烈推荐!总结两点:决策树处理缺失值主要考虑两个方面,一是在选择特征进行分裂时假如特征有缺失值如何选取拿来分裂的特征?二是当我们选取好分裂特征时这个特征上有缺失值该给把缺失值划分到那个类中?举个例子:比如西瓜有花纹,芥蒂,纹理等特征,现在需要选取一个特征作为一下一个分裂点,该选择哪一个特征?没有缺失值时的做法是直接计算三个特征的信息增益(ID3),但是假如花纹上有缺失值,总共17个样本,缺失了4个,那就把这4个先剔除掉,我们计算剩余13个的信息增益,计算好后的信息增益再乘以我们的比例(此时为13/17),这样就把特征的信息增益给计算出来了。同理其他的特征也可以这样计算,最后选出信息增益最大的那个特征。对于第二个问题,我们将缺失的特征同时放到所有的分支上去,只不过他们的权重相应的要小一点(具体多大可以看链接),然后计算信息增益的方法还是一样的。

机器学习算法GBDT的面试要点总结-上篇
这篇文章主要是总结了GBDT的一些面试问题,里面详细的介绍了GBDT的几个问题,包括gbdt 的算法的流程?

  • gbdt 如何选择特征 ?
  • gbdt 如何构建特征 ?
  • gbdt 如何用于分类?
  • gbdt 通过什么方式减少误差 ?
    里面最好的地方是有详细的伪代码让你知道具体的实现过程。其中回归算法和分类算法有详细的演示过程

决策树

cart怎么做回归?

		for 每一个特征:
    		for 每一个数值:
    			计算平方误差
    			最小平方误差 = min(最小平方误差, 平方误差)
    			记录取得最小平方误差的位置为(feature x, number y):第x个feature,第y个值
    	假如第y个值为100, 那么大于100的归为一类right, 小于100的归为一类left
    	分别求left, right类的平均值,利用这个平均值来代替平方误差公式中的标签值,再进行上诉步骤的递归
    			

boosting

为什么说GBDT是在拟合残差?残差的计算公式是哪些?

在这里插入图片描述

XGBoost和GBDT的区别

在这里插入图片描述

Gbdt防止过拟合的几种方法

在这里插入图片描述

GBDT的shrink和随机采样过程

正则化regularization

  • Shrinkage:即学习率
    就是学习率。 一般情况下,越小的学习率,可以越好的逼近预测值,不容易产生过拟合,迭代次数会增加,经验上一般选取0.1左右。
  • 第二种正则化的方式是通过子采样比例(subsample)
    (a subsample of the training set drawn at random without replacement)作为本次base
    learner去拟合的样本集可以提高算法最后的准确率。
    GBDT里的做法是在每一轮建树时,样本是从训练集合中无放回随机抽样,XGBoost和Sklearn的实现均借鉴了随机森林,除了有样本层次上的采样,也有特征采样。也就是说建树的时候只从随机选取的一些特征列寻找最优分裂。

bagging

随机森林如何选择特征重要性?

在随机森林中某个特征X的重要性的计算方法如下:

1:对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.

2: 随机地对袋外数据OOB所有样本的特征X加入噪声干扰(就可以随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2.

3:假设随机森林中有Ntree棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

随机森林的优缺点

优点
1、 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好
2、它能够处理很高维度(feature很多)的数据,并且不用做特征选择
PS:特征子集是随机选择的
3、在训练完后,它能够给出哪些feature比较重要
PS:http://blog.csdn.net/keepreder/article/details/47277517
4、在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强
5、训练速度快,容易做成并行化方法
PS:训练时树与树之间是相互独立的
6、 在训练过程中,能够检测到feature间的互相影响
7、 实现比较简单
8、 对于不平衡的数据集来说,它可以平衡误差。
9、如果有很大一部分的特征遗失,仍可以维持准确度。
缺点:
1、随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟
2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

LightGBM

『我爱机器学习』集成学习(四)LightGBM
(三)提升树模型:Lightgbm原理深入探究
机器学习算法之LightGBM
这篇文章详细的介绍了lightGBM的各个算法细节,图文并茂
LightGBM算法总结(20个赞)
https://www.jianshu.com/p/3daf08229d78
这篇文章讲的好的地方主要是把EFB算法给讲清楚了,lightGBM主要通过将features x instences转换为bin x bundles,而efb算法的作用是用来将features转换为bundles的,在实际情况中,features通常是非常稀疏的,有些特征之间是mutually exclusive的,这样的话我们可以将这种特征合并成一个bundles,EFB的算法主要分为两步:怎样的特征是可以合并的,怎样合并。两个特征之间的mutually exclusive的值小于一个阈值的时候就可以合并。合并时为了保证数据不冲突,我们能够知道是哪个特征在起作用需要进行range的叠加,如特征1的取值范围是[0, 10], 特征2的取值范围是[0, 20],那么合共的范围变成了[0,30]其中bundles取值在[0,10]的时候说明特征1在起作用,取[10, 30]说明是特征2在起作用。

链接:https://www.zhihu.com/question/51644470/answer/130946285
来源:知乎
GBDT 虽然是个强力的模型,但却有着一个致命的缺陷,不能用类似 mini batch 的方式来训练,需要对数据进行无数次的遍历。如果想要速度,就需要把数据都预加载在内存中,但这样数据就会受限于内存的大小;如果想要训练更多的数据,就要使用外存版本的决策树算法。虽然外存算法也有较多优化,SSD 也在普及,但在频繁的 IO 下,速度还是比较慢的。为了能让 GBDT 高效地用上更多的数据,我们把思路转向了分布式 GBDT, 然后就有了 LightGBM。设计的思路主要是两点,1. 单个机器在不牺牲速度的情况下,尽可能多地用上更多的数据;2.多机并行的时候,通信的代价尽可能地低,并且在计算上可以做到线性加速。基于这两个需求,LightGBM 选择了基于 histogram 的决策树算法。相比于另一个主流的算法 pre-sorted(如 xgboost 中的 exact 算法),histogram 在内存消耗和计算代价上都有不少优势。Pre-sorted 算法需要的内存约是训练数据的两倍(2 * #data * #features* 4Bytes),它需要用32位浮点来保存 feature value,并且对每一列特征,都需要一个额外的排好序的索引,这也需要32位的存储空间。对于 histogram 算法,则只需要(#data* #features * 1Bytes)的内存消耗,仅为 pre-sorted算法的1/8。因为 histogram 算法仅需要存储 featurebin value (离散化后的数值),不需要原始的 feature value,也不用排序,而 binvalue 用 uint8_t (256bins) 的类型一般也就足够了。在计算上的优势则主要体现在“数据分割”。决策树算法有两个主要操作组成,一个是“寻找分割点”,另一个是“数据分割”。从算法时间复杂度来看,Histogram 算法和 pre-sorted 算法在“寻找分割点”的代价是一样的,都是O(#feature*#data)。而在“数据分割”时,pre-sorted 算法需要O(#feature*#data),而 histogram 算法是O(#data)。因为 pre-sorted 算法的每一列特征的顺序都不一样,分割的时候需要对每个特征单独进行一次分割。Histogram算法不需要排序,所有特征共享同一个索引表,分割的时候仅需对这个索引表操作一次就可以。(更新: 这一点不完全正确,pre-sorted 与 level-wise 结合的时候,其实可以共用一个索引表(row_idx_to_tree_node_idx)。然后在寻找分割点的时候,同时操作同一层的节点,省去分割的步骤。但这样做的问题是会有非常多随机访问,有很大的chche miss,速度依然很慢。)。另一个计算上的优势则是大幅减少了计算分割点增益的次数。对于一个特征,pre-sorted 需要对每一个不同特征值都计算一次分割增益,而 histogram 只需要计算 #bin (histogram 的横轴的数量) 次。最后,在数据并行的时候,用 histgoram 可以大幅降低通信代价。用 pre-sorted 算法的话,通信代价是非常大的(几乎是没办法用的)。所以 xgoobst 在并行的时候也使用 histogram 进行通信。当然, histogram 算法也有缺点,它不能找到很精确的分割点,训练误差没有 pre-sorted 好。但从实验结果来看, histogram 算法在测试集的误差和 pre-sorted 算法差异并不是很大,甚至有时候效果更好。实际上可能决策树对于分割点的精确程度并不太敏感,而且较“粗”的分割点也自带正则化的效果。在 histogram 算法之上, LightGBM 进行进一步的优化。首先它抛弃了大多数 GBDT 工具使用的按层生长(level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。 level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合。但实际上level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环。因此同 level-wise 相比,在分裂次数相同的情况下,leaf-wise 可以降低更多的误差,得到更好的精度。leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。另一个比较巧妙的优化是 histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的 k 个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值