1)初始化特征集合和数据集合;
2)计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;
3)更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);
4)重复 2),3 )两步,若子集值包含单一特征,则为分支叶子节点。
如何在特征值缺失的情况下进行划分特征的选择?
选定该划分特征,模型对于缺失该特征值的样本该进行怎样处理?
随机选择样本(放回抽样);
随机选择特征;
构建决策树;
随机森林投票(平均)。
在数据集上表现良好,相对于其他算法有较大的优势
易于并行化,在大数据集上有很大的优势;
能够处理高维度数据,不用做特征选择。
初始化训练样本的权值分布,每个样本具有相同权重;
训练弱分类器,如果样本分类正确,则在构造下一个训练集中,它的权值就会被降低;反之提高。用更新过的样本集去训练下一个分类器;
将所有弱分类组合成强分类器,各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,降低分类误差率大的弱分类器的权重。
分类精度高;
可以用各种回归分类模型来构建弱学习器,非常灵活;
不容易发生过拟合。
对异常点敏感,异常点会获得较高权重。
可以自动进行特征组合,拟合非线性数据;
可以灵活处理各种类型的数据。
对异常点敏感。
都是 Boosting 家族成员,使用弱分类器;
都使用前向分布算法;
迭代思路不同:Adaboost 是通过提升错分数据点的权重来弥补模型的不足(利用错分样本),而 GBDT 是通过算梯度来弥补模型的不足(利用残差);
损失函数不同:AdaBoost 采用的是指数损失,GBDT 使用的是绝对损失或者 Huber 损失函数;
从深度为 的树开始,对每个叶节点枚举所有的可用特征;
针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益;
选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新的叶节点,并为每个新节点关联对应的样本集
回到第 1 步,递归执行到满足特定条件为止
精度更高:GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
灵活性更强:GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,(使用线性分类器的 XGBoost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题))。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
正则化:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 L2 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合;
Shrinkage(缩减):相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间;
列抽样:XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算;
缺失值处理:XGBoost 采用的稀疏感知算法极大的加快了节点分裂的速度;
可以并行化操作:块结构可以很好的支持并行计算。
虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
单边梯度抽样算法;
直方图算法;
互斥特征捆绑算法;
基于最大深度的 Leaf-wise 的垂直生长算法;
类别特征最优分割;
特征并行和数据并行;
缓存优化。
哪些特征可以一起绑定?
特征绑定后,特征值如何确定?
构造一个加权无向图,顶点是特征,边是两个特征间互斥程度;
根据节点的度进行降序排序,度越大,与其他特征的冲突越大;
遍历每个特征,将它分配给现有特征包,或者新建一个特征包,是的总体冲突最小。
4)带深度限制的 Leaf-wise 算法
本地找出 Top K 特征,并基于投票筛选出可能是最优分割点的特征;
合并时只合并每个机器选出来的特征。
首先,所有的特征都采用相同的方法获得梯度(区别于不同特征通过不同的索引获得梯度),只需要对梯度进行排序并可实现连续访问,大大提高了缓存命中;
其次,因为不需要存储特征到样本的索引,降低了存储消耗,而且也不存在 Cache Miss的问题。
XGBoost 使用预排序后需要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,将空间复杂度从 降低为 ,极大的减少了内存消耗;
LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;
LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
《机器学习》周志华,
《数据挖掘十大算法》吴信东
CART 树怎么进行剪枝?,zhihu.com/question/22697086
机器学习算法中 GBDT 与 Adaboost 的区别与联系是什么?- Frankenstein 的回答 - 知乎,https://www.zhihu.com/question/54626685/answer/140610056
为什么说bagging是减少variance,而boosting是减少bias,https://www.zhihu.com/question/26760839
Ensemble Learning - 周志华,https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/springerEBR09.pdf
使用sklearn进行集成学习——理论,https://www.cnblogs.com/jasonfreak/p/5657196.html
《XGBoost: A Scalable Tree Boosting System》,https://arxiv.org/pdf/1603.02754.pdf
陈天奇论文演讲 PPT,https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
LightGBM: A Highly Efficient Gradient Boosting Decision Tree,https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf
LightGBM 文档,https://lightgbm.readthedocs.io/en/latest/
论文阅读——LightGBM 原理,https://www.biaodianfu.com/lightgbm.html
机器学习算法之 LightGBM,https://blog.csdn.net/shine19930820/article/details/79123216
关于sklearn中的决策树是否应该用one-hot编码?- 柯国霖的回答 - 知乎,https://www.zhihu.com/question/266195966/answer/306104444
如何玩转LightGBM,https://v.qq.com/x/page/k0362z6lqix.html
【机器学习】决策树(上)——ID3、C4.5、CART(非常详细),https://zhuanlan.zhihu.com/p/85731206
【机器学习】决策树(中)——Random Forest、Adaboost、GBDT (非常详细),https://zhuanlan.zhihu.com/p/86263786
【机器学习】决策树(下)——XGBoost、LightGBM(非常详细),https://zhuanlan.zhihu.com/p/87885678