RFGBDTXGBoostLightGBM简单总结
阅读目录
Random Forest(随机森林):GBDT(梯度提升树)XGBoostLightGBM这四种都是非常流行的集成学习(Ensemble Learning) 方式,在本文简单总结一下它们的原理和使用方法.
Random Forest(随机森林):
随机森林属于Bagging ,也就是有放回抽样 ,多数表决或简单平均.Bagging之间的基学习器是并列生成 的.RF就是以决策树为基学习器 的Bagging,进一步在决策树的训练过程中引入了随机特征选择 ,这会使单棵树的偏差增加,但总体而言有利于集成.RF的每个基学习器只使用了训练集中约63.2%的样本,剩下的样本可以用作袋外估计 .一般使用的是sklearn.ensemble中的RandomForestClassifier和RandomForestRegressor.框架参数 (相比GBDT较少,因为基学习器之间没有依赖关系):n_estimators=100:最大的基学习器的个数oob_score=False:是否采用袋外样本bootstrap=True:是否有放回采样n_jobs=1:并行job个数决策树参数 :max_features=None:划分时考虑的最大特征数,可选log2,sqrt,auto或浮点数按比例选择,也可以选整数按个数选择.max_depth:最大深度min_samples_split:内部节点划分所需最小样本数,如果样本小于这个值就不会再继续划分.min_saples_laef:叶子节点最少的样本数,小于这个值就会被剪枝.min_weight_fraction_leaf:叶子节点所有样本权重和的最小值max_leaf_nodes=None:最大叶子节点数,可以防止过拟合min_impurity_split:节点增长的最小不纯度criterion:CART树划分时对特征的评价标准,分类树默认gini,可选entropy,回归树默认mse,可选mae.GBDT(梯度提升树)
GBDT属于Boosting .它和Bagging都使用同样类型的分类器 ,区别是不同分类器通过串行 训练 获得,通过关注被已有分类器错分的数据来获得新的分类器.Boosting分类器的权重并 不相等 ,每个权重对应分类器在上一轮迭代中的成功度.GBDT的关键是利用损失函数的负 梯度方向 作为残差的近似值 ,进而拟合出新的CART回归树.一般使用的是sklearn.ensemble中的GradientBoostingClassifier和GradientBoostingRegressor.框架参数 :n_estimators=100:最大基学习器个数learning_rate=1:每个基学习器的权重缩减系数(步长)subsample=1.0:子采样,是不放回抽样,推荐值0.5~0.8loss:损失函数,分类模型默认deviance,可选exponential.回归模型默认ls,可选lad,huber和quantile.决策树参数 (与RF基本相同):max_features=None:划分时考虑的最大特征数,可选log2,sqrt,auto或浮点数按比例选择,也可以选整数按个数选择.max_depth:最大深度min_samples_split:内部节点划分所需最小样本数,如果样本小于这个值就不会再继续划分.min_saples_laef:叶子节点最少的样本数,小于这个值就会被剪枝.min_weight_fraction_leaf:叶子节点所有样本权重和的最小值max_leaf_nodes=None:最大叶子节点数,可以防止过拟合min_impurity_split:节点增长的最小不纯度XGBoost
相比传统GBDT,XGBoost能自动利用CPU的多线程,支持线性分类器,使用二阶导数进行优化,在代价函数中加入了正则项,可以自动处理缺失值,支持并行(在特征粒度上的).参考XGBoost python API和xgboost调参经验.在训练过程一般用xgboost.train(), 参数有:params:一个字典,训练参数的列表,形式是 {‘booster’:’gbtree’,’eta’:0.1}dtrain:训练数据num_boost_round:提升迭代的次数evals:用于对训练过程中进行评估列表中的元素obj:自定义目的函数feval:自定义评估函数maxmize:是否对评估函数最大化early_stopping_rounds:早停次数learning_rates:每一次提升的学习率的列表params参数 :booster=gbtree:使用哪种基学习器,可选gbtree,gblinear或dartobjective:目标函数,回归一般是reglinear,reg:logistic,count:poisson,分类一般是binary:logistic,rank:pairwiseeta:更新中减少的步长max_depth:最大深度subsample:随即采样的比例min_child_weight:最小叶子节点样本权重和colsample_bytree:随即采样的列数的占比gamma:分裂最小loss,只有损失函数下降超过这个值节点才会分裂lambda:L2正则化的权重LightGBM
LightGBM是基于决策树的分布式梯度提升框架.它与XGBoost的区别是:切分算法,XGBoost使用pre_sorted,LightGBM采用histogram.决策树生长策略:XGBoost使用带深度限制的level-wise,一次分裂同一层的叶子.LightGBM采用leaf-wise,每次从当前所有叶子找到一个分裂增益最大的叶子.4.此外还有objective,metric等参数.
机器学习之AdaBoost、GBDT、RF、XGboost、LightGBM的对比分析
AdaBoost
简单介绍
AdaBoost是基于boosting的思想,通过多个弱分类器的线性组合来得到强分类器,训练时重点关注被错分的样本,准确率高的弱分类器权重大。
更深一步的介绍
在训练过程中,它不改变所给的训练数据,而是不断改变训练数据权值的分布,使得被误分类的数据在后一轮的分类中受到更大的关注。
同时采用加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在最后的表决中起更大的作用,减小分类误差率大的弱分类器的权值,使其在最后的表决中起较小的作用。所有弱分类器的权值之和并不为1,是通过最后结果的符号来决定实例的类别,该结果的绝对值表示分类的确信度。(参考《统计学习方法》P140)
Adaboost 还有另外一种理解,即可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。(参考《统计学习方法》P143)
加法模型就是多个基函数线性组合得到的模型
前向分步算法:对于加法模型,从前往后,每一步只学习一个基函数及其系数,而不是一次性学习所有的基函数,从而简化优化的复杂度。
损失函数是根据 adaboost 算法特点推导而来的。
GBDT
简单介绍
GBDT是基于boosting的思想,串行地构造多棵决策树来进行数据的预测,它是在损失函数所在的函数空间中做梯度下降,即把待求的决策树模型当作参数,每轮迭代都去拟合损失函数在当前模型下的负梯度,从而使得参数朝着最小化损失函数的方向更新。
更深一步的介绍
GBDT可以看作是AdaBoost的一个推广,AdaBoost是通过错分数据点来识别问题,通过调整错分数据点的权重来改进模型,GBDT是通过负梯度来识别问题,通过计算负梯度来改进模型,实际上,负梯度绝对值大的样例同样会在之后的训练中受到更大的关注,因为它造成的损失更容易在最后的损失函数中占很大的比重,因此,需要更多地偏向于它去减小损失。这也是GBDT和AdaBoost相似的一个点,而相比AdaBoost, Gradient Boosting可以使用更多类型的损失函数,因此可以解决更多的问题。
最常见的损失函数是平方损失函数,square loss的优点是便于理解和实现,它的负梯度就是残差,而其他损失函数的负梯度只能看作残差的近似值,它的缺点在于对于异常值它的鲁棒性较差,因此会常用absolute loss或Huber loss来代替。
Random Forest
简单介绍
随机森林算法背后的思想是群体智慧的体现,它通过随机的行采样(bagging)和列采样(feature bagging)构造不同的训练集,建立一个决策树森林,利用加权平均方式或多数表决的方式得到最后的预测结果,能够并行学习,对噪声和异常数据具有很好的过滤作用,因此有很广泛的应用。
更深一步的介绍
随机森林的行采样(bagging)和列采样(feature bagging)都是为了减小模型之间的相关性使基学习器变得不同从而减小集成模型的方差,但这种随机性会导致随机森林的偏差有所增加(相比于单棵不随机树),因此随机森林的单棵树都会采用很深的决策树,并不进行剪枝操作,以减小每棵树的偏差,这使得每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从全部特征中选择部分来让每一棵决策树学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终再通过投票或平均得到结果。这也正是群体智慧的体现。
XGboost
简单介绍
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还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。这里参考:https://www.zhihu.com/question/41354392/answer/98658997
LightGBM
简单介绍
LightGBM是一个实现GBDT算法的分布式高效框架。它通过leaf-wise分裂方法进行决策树的生成,通过基于直方图的算法寻找特征分割点,并支持并行学习,能够更高效的处理大数据,也得到了越来越广泛的应用。
更深一步的介绍
首先,它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,能够实现更高的准确率。虽然这样有时候会导致过拟合,但可以通过设置 max-depth 参数来防止过拟合的发生。(每一次的生长都是选取分裂增益最高的节点,而不是对一层中的所有节点都进行分裂)。
其次,它使用基于直方图的算法,将连续的特征值分桶(buckets)装进离散的箱子(bins),并通过直方图做差加速计算兄弟节点的直方图,能够加速训练过程,并实现更少的内存占用。
另外,它支持并行学习,包括特征并行 和数据并行
特征并行的主要思想是不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。(mapreduce思想)数据并行则是让不同的机器先在不同的记录集合上构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。它还支持直接输入类别特征,在对离散类别特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个类别“的增益,对于类别特征的操作类似于one-hot编码。
对比分析
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 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
相关问答
研一读的管理会计想学数据挖掘,这样发展有戏吗?
这个可能是比较大挑战的。数据挖掘主要要侧重三点:a.数据挖掘算法(logistic回归+l1+l2正则化、决策树、adboosting、RF、gbdt、xgboost、k-means、关联规则.....
pythonAI入门或进阶,有什么好的培训机构或学习途径吗?
锋python率先覆盖所有类型数据库,传授学生包括mysql、redis和mongdb数据库最全最新数据库知识。推出最贴近企业实战的机器学习案例,例如人脸识别,手写数字...如...
如何构建可行的欺诈检测方案?
谢邀,刚好之前收录了一篇关于银行欺诈风险预测模型的研究。现在摘录一些分享给出来提供参考,内容大概如下:机器学习是一种重要的金融科技创新手段,近年来在...