简单介绍
AdaBoost是基于boosting的思想,通过多个弱分类器的线性组合来得到强分类器,训练时重点关注被错分的样本,准确率高的弱分类器权重大。
更深一步的介绍
在训练过程中,它不改变所给的训练数据,而是不断改变训练数据权值的分布,使得被误分类的数据再后一轮的分类中受到更大的关注。
同时采用加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在最后的表决中起更大的作用,减小分类误差率大的弱分类器的权值,使其在最后的表决中起较小的作用。所有弱分类器的权值之和并不为1,是通过最后结果的符号来决定实例的类别,该结果的绝对值表示分类的确信度。(参考《统计学习方法》P140)
Adaboost 还有另外一种理解,即可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。(参考《统计学习方法》P143)
加法模型就是多个基函数线性组合得到的模型
前向分步算法:对于加法模型,从前往后,每一步只学习一个基函数及其系数,而不是一次性学习所有的基函数,从而简化优化的复杂度。
损失函数是根据 adaboost 算法特点推导而来的。
简单介绍
GBDT是基于boosting的思想,串行地构造多棵决策树来进行数据的预测,它是在损失函数所在的函数空间中做梯度下降,即把待求的决策树模型当作参数,每轮迭代都去拟合损失函数在当前模型下的负梯度,从而使得参数朝着最小化损失函数的方向更新。
更深一步的介绍
GBDT可以看作是AdaBoost的一个推广,AdaBoost是通过错分数据点来识别问题,通过调整错分数据点的权重来改进模型,GBDT是通过负梯度来识别问题,通过计算负梯度来改进模型,实际上,负梯度绝对值大的样例同样会在之后的训练中受到更大的关注,因为它造成的损失更容易在最后的损失函数中占很大的比重,因此,需要更多地偏向于它去减小损失。这也是GBDT和AdaBoost相似的一个点,而相比AdaBoost, Gradient Boosting可以使用更多类型的损失函数,因此可以解决更多的问题。
最常见的损失函数是平方损失函数,square loss的优点是便于理解和实现,它的负梯度就是残差,而其他损失函数的负梯度只能看作残差的近似值,它的缺点在于对于异常值它的鲁棒性较差,因此会常用absolute loss或Huber loss来代替。
简单介绍
随机森林算法背后的思想是群体智慧的体现,它通过随机的行采样(bagging)和列采样(feature bagging)构造不同的训练集,建立一个决策树森林,利用加权平均方式或多数表决的方式得到最后的预测结果,能够并行学习,对噪声和异常数据具有很好的过滤作用,因此有很广泛的应用。
更深一步的介绍
随机森林的行采样(bagging)和列采样(feature bagging)都是为了减小模型之间的相关性使基学习器变得不同从而减小集成模型的方差,但这种随机性会导致随机森林的偏差有所增加(相比于单棵不随机树),因此随机森林的单棵树都会采用很深的决策树,并不进行剪枝操作,以减小每棵树的偏差,这使得每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从全部特征中选择部分来让每一棵决策树学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终再通过投票或平均得到结果。这也正是群体智慧的体现。
简单介绍
xgboost是梯度提升树的一种高效系统实现,是对GBDT进一步的改进,包括对代价函数进行了二阶泰勒展开,在代价函数里加入了正则项,借鉴了随机森林的列采样方法,支持并行计算等
更深一步的介绍
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
这里参考:机器学习算法中 GBDT 和 XGBOOST 的区别有哪些?
简单介绍
LightGBM是一个实现GBDT算法的分布式高效框架。它通过leaf-wise分裂方法进行决策树的生成,通过基于直方图的算法寻找特征分割点,并支持并行学习,能够更高效的处理大数据,也得到了越来越广泛的应用。
更深一步的介绍
首先,它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,能够实现更高的准确率。虽然这样有时候会导致过拟合,但可以通过设置 max-depth 参数来防止过拟合的发生。(每一次的生长都是选取分裂增益最高的节点,而不是对一层中的所有节点都进行分裂)。
其次,它使用基于直方图的算法,将连续的特征值分桶(buckets)装进离散的箱子(bins),并通过直方图做差加速计算兄弟节点的直方图,能够加速训练过程,并实现更少的内存占用。
另外,它支持并行学习,包括特征并行和数据并行
它还支持直接输入类别特征,在对离散类别特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个类别“的增益,对于类别特征的操作类似于one-hot编码。
简单介绍
CatBoost是Category 和 Boosting的缩写,最大的特点就是可以直接处理类别特征,不需要任何预处理来将类别转换为数字。
具体详细的介绍请参考:CatBoost原理及实践
xgb是对gbdt的优化改进
1、目标函数中加入了正则项来控制模型的复杂度,替代原来的剪枝方法。
2、利用了one-hot编码等情况中的特征稀疏性。(仅对特征值为非缺失值的样本的特征进行遍历)
3、支持列抽样(同random forest)。
4、数据事先排序并按block结构保存,有利于并行运算(树的生成还是串行的,这里说的并行计算指并行计算各个特征的增益或是基尼系数)。除此之外,xgb还通过一种可并行的近似直方图算法来高效生成候选的分割点。
5、对损失函数进行了优化,gbdt只用到了其一阶导数信息,而xgb同时用到其一阶导与二阶导。
lgb则是在xgb基础上进一步改进
1、内存需求小:xgb使用基于pre-sorted的决策树算法,而lgb使用基于histogram的决策树算法。histogram算法占用的内存很小:pre-sorted需要两倍数据大小的内存空间,一半用于数据(float32),一半用于存放排好序的索引,而histogram不需要存放索引,且特征值只需要存放离散后的值,用uint8即可,故内存需求仅为pre-sorted的1/8。
2、计算速度快:决策树算法的主要操作包括“寻找分割点”与“数据分割”两步,pre-sorted算法和histogram算法在“寻找分割点”上的时间复杂度是一致的;但是在“数据分割”上histogram要快,histogram所有特征共享一张索引,而pre-sorted一个特征对应一张索引,若集合level-wise,pre-sorted也可以共用一张索引,但是会带来很多随机访问的问题,速度仍不及histogram。此外,histogram算法还减少了计算分割点增益的次数。
3、通信代价小:histogram算法的通信代价远远小于pre-sorted,可用于分布式计算。
但是,histogram不能找到很精确的分割点,训练误差不如pre-sorted算法,可以说是牺牲一定精度来换取速度。需要指出的是,这种粗犷的分割相当于自带正则效果,所以测试集的误差两种决策树算法差距不大。
以上参考:http://www.cnblogs.com/asprin/p/9267453.html
关键两点差别
1、决策树算法
XGBoost使用的是pre-sorted算法,能够更精确的找到数据分隔点;LightGBM使用的是histogram算法,占用的内存更低,数据分隔的复杂度更低。
2、决策树生长策略
XGBoost采用的是level(depth)-wise生长策略,能够同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销。
LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合。因此,LightGBM 在leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。