bagging
利用bootstrap方法从整体数据集中采取有放回抽样N个数据集,从每个数据集中学习出一个模型,最后分类采用N个模型预测投票的方式,回归采用平均。(随机森林)
boosting
boosting创建一系列预测器,或者说学习器。前面的学习器用简单的模型去适配数据,然后分析错误。然后会给予错误预测数据更高权重,然后用后面的学习器去修复。boosting通过把一些弱学习器串起来,组成一个强学习器。boosting的典型应用是Adaboost。
XGBoost和LightGBM的区别
1.切分算法:XGBoost通过对所有特征都按照特征数值进行预排序选取最好的分割点;LightGBM通过直方图算法寻找最优分割点。
2.LightGBM占用内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8.
3.LightGBM直接支持类别特征
4.决策树生长策略不同
XGBoost采用的是带深度限制的level-wise生长策略。level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层叶子,带来了很多没必要的开销(实际上很多叶子的分裂增益较低,没必要搜索和分裂)
LightGBM采用leaf-wise生长策略,每次从当前叶子中找到分裂增益最大(数据量最大)的一个叶子,进行分裂,如此循环;但会长出比较深的决策树,产生过拟合(因此LightGBM在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。)
XGBoost和GBDT的区别
1.传统的GBDT以cart作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯底回归(分类问题)或者线性回归(回归问题)
2.传统的GBDT在优化时只用到一阶倒数信息,xgboost对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,训练速度更快。
3.XGBoost在代价函数里加入了 正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。防止过拟合。
4.Shrinkage(缩减),相当于学习率。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。
5.列抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。对缺失值的处理:对于特征的值有缺失的样本,xgboost可以自动学习出它的方向;传统的GBDT没有设计对缺失值进行处理。
6.xgboost工具支持并行,gbdt属于串行。
7.gbdt是机器学习算法,xgboost是该算法的工程实现。
xgboost的block结构
在树的生成过程中,最耗时的一个步骤就是在每次寻找最佳分裂点时都需要对特征的值进行排序。而XGBoost在训练之前会根据特征对数据进行排序,然后保存到块结构中,并在每个块结构中都采用了稀疏矩阵存储格式进行存储,后面的训练过程中会重复的使用块结构,可以大大减少计算量。
RF和GBDT的区别
相同点:
1.都是由多棵树组成
2.最终的而结果都是由多棵树一起决定
不同点:
1.组成随机森林的树可以分类树也可以回归树,而GBDT只由回归树组成
2.随机森林的结果是多数表决的,而GBDT是多棵树累计之和
3.组成随机森林的树可以并行生成,而GBDT只能是串行生成
4.随机森林对异常值不敏感,而GBDT对异常值比较敏感
5.随机森林是通过减少模型的方差来提高性能的,而GBDT是减少模型的偏差来提高性能的
6.随机森林不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。
GBDT是否适合于处理大规模的ID特征?
GBDT对于海量的id类特征,GBDT由于树的深度和树的数量的限制,不能有效存储;另外还两个字也会存在性能瓶颈,当GBDT的onehot特征大于100k维时,需要做分布式训练才能保证内存不爆炸。
LightGBM的直方图排序后会比xgboost的效果差吗,为什么
1.基于树模型的boosting算法,很多苏算法比如xgboost都使用预排序算法进行特征的选择和分裂。
2.LightGBM采用HistoGram算法,其思想是将连续的浮点特征离散成k个离散值,并构造宽度为k的histogram。然后遍历训练数据,计算每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点
xgboost正则化项和什么有关
正则化项里包含了树的叶子结点个数、每个叶子节点上输出的score的L2模的平方和
随机森林哪两个随机
两个随机(boostrap + 特征m)
- 引用boostrap法有放回随机抽取k个新的自助样本集,并由此构建k颗分类树
- 随机选择属性子集,个数为k,然后再从这个子集中选择一个最优属性用于划分
boostrap
Bootstrap是一种抽样方法,即随机抽取数据并将其放回。如一次抽取一个样本,然后放回样本集中,下次可能再抽取这个样本。
XGBoost缺失值处理办法
论文中关于缺失值的处理将其与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历, 通过这个技巧减少了为系数离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子节点和右叶子结点两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值划分到右子树。
XGBoost为什么要二阶展开?
1.XGBoost是以mse为基础推导出来的,在mse的情况下,xgboost的目标函数展开就是一阶项+二阶项的形式,而其他类似log loss这样的目标函数不能表示成这种形式。为了后续推导的统一,索一江目标函数进行二阶泰勒展开,就可以直接自定义损失函数了,只要二阶可导即可,增强了模型的扩展性。
2.二阶信息能够让梯度收敛的更快,类似于牛顿法比SGD收敛更快。一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是如何变化的。
XGBoost如果损失函数没有二阶导怎么办?
gbdt的目标函数与xgboost区别就是带不带正则项。gdbt对损失函数 的优化直接使用了损失函数的负梯度,沿着梯度下降的方向来减小损失,其实也就是一阶泰勒展开。而xgboost在这里使用了二阶泰勒展开,因为包含了损失函数的二阶信息,其优化的速度大大加快。但如果loss没有二阶导数,就是用一阶倒数优化