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等参数.
Netflix工程总监眼中的分类算法:深度学习优先级最低
【编者按】针对Quora上的一个老问题:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain近日给出新的解答,他根据奥卡姆剃刀原理依次推荐了逻辑回归、SVM、决策树集成和深度学习,并谈了他的不同认识。他并不推荐深度学习为通用的方法,这也侧面呼应了我们之前讨论的问题:深度学习能否取代其他机器学习算法。
不同分类算法的优势是什么?例如有大量的训练数据集,上万的实例,超过10万的特征,我们选择哪种分类算法最好?Netflix公司工程总监Xavier Amatriain认为,应当根据奥卡姆剃刀原理(Occam's Razor)来选择算法,建议先考虑逻辑回归。
选择一个合理的算法可以从很多方面来考察,包括:
训练实例的数量?特征空间的维度?是否希望该问题线性可分? 特征是否是独立的?是否预期特征能够线性扩展?过度拟合是否会成为一个问题?系统在速度/性能/内存使用等方面的要求如何?……这个看起来有点吓人的列表并没有直接回答问题,但我们可以按照奥卡姆剃刀原则解决这个问题:用能够满足需求的最简单的算法,如果绝对的必要,不要增加复杂性。
逻辑回归
作为一般的经验法则,我建议先考虑逻辑回归(LR,Logistic Regression)。逻辑回归是一个漂亮乖巧的分类算法,可以训练你希望的特征大致线性和问题线性可分。你可以很容易地做一些特征引擎把大部分的非线性特征转换为线性。逻辑回归对噪声也相当强劲,能避免过度拟合,甚至使用L2或L1正则化做特征选择。逻辑回归也可以用在大数据场景,因为它是相当有效的,并且可以分布使用,例如ADMM。 逻辑回归的最后一个优点是,输出可以被解释为概率。这是一个好的附加作用,例如,你可以使用它排名而不是分类。
即使在你不希望逻辑回归100%地工作,你也可以帮自己一个忙,在使用“票友”办法之前,运行一个简单的L2正则化逻辑回归作为基线。
好了,现在你已经设置逻辑回归基线,下一步你应该做的,我基本上会推荐两个可能的方向:支持向量机(SVM)或者决策树集成。如果我不知道你的具体问题,我肯定会选择后者,但我将开始描述为什么SVM可能是一个值得考虑的方法。
支持向量机
支持向量机使用一个与LR不同的损失函数(Hinge)。它们也有不同的解释(maximum-margin)。然而,在实践中,用线性核函数的SVM和逻辑回归是没有很大的不同的(如果你有兴趣,你可以观察Andrew Ng在他的Coursera机器学习课程如何从逻辑回归中驱动SVM)。用SVM代替逻辑回归的一个主要原因可能是因为你的问题线性不可分。在这种情况下,你将不得不使用有非线性内核的SVM(如RBF)。事实上,逻辑回归也可以伴随不同的内核使用,但出于实际原因你更可能选择SVM。另一个使用SVM的相关理由可能是高维空间。例如,SVM已经被报道在工作文本分类方面做得更出色。
不幸的是,SVM的主要缺点是,它们的训练低效到痛苦。所以,对于有大量训练样本的任何问题,我都不会推荐SVM。更进一步地说,我不会为大多数“工业规模”的应用程序推荐SVM。任何超出玩具/实验室的问题可能会使用其他的算法来更好地解决。
决策树集成
第三个算法家族:决策树集成(Tree Ensembles)。这基本上涵盖了两个不同的算法:随机森林(RF)和梯度提升决策树(GBDT)。它们之间的差异随后再谈,现在先把它们当做一个整体和逻辑回归比较。
决策树集成有超过LR的不同优势。一个主要优势是,它们并不指望线性特征,甚至是交互线性特性。在LR里我没有提到的是,它几乎不能处理分类(二进制)特性。而决策树集成因为仅仅是一堆决策树的结合,可以非常好地处理这个问题。另一主要优点是,因为它们构造了(使用bagging或boosting)的算法,能很好地处理高维空间以及大量的训练实例。
至于RF和GBDT之间的差别,可以简单理解为GBDT的性能通常会更好,但它们更难保证正确。更具体而言,GBDT有更多的超参数需要调整,并且也更容易出现过度拟合。RF几乎可以“开箱即用”,这是它们非常受欢迎的一个原因。
深度学习
最后但并非最不重要,没有深度学习的次要参考,这个答案将是不完整的。我绝对不会推荐这种方法作为通用的分类技术。但是,你可能会听说这些方法在某些情况下(如图像分类)表现如何。如果你已经通过了前面的步骤并且感觉你的解决方案还有优化的空间,你可能尝试使用深度学习方法。事实是,如果你使用一个开源工具(如Theano)实现,你会知道如何使这些方法在你的数据集中非常快地执行。
总结
综上所述,先用如逻辑回归一样简单的方法设定一个基准,如果你需要,再使问题变得更加复杂。这一点上,决策树集成可能正是要走的正确道路,特别是随机森林,它们很容易调整。如果你觉得还有改进的余地,尝试GBDT,或者更炫一些,选择深度学习。
你还可以看看Kaggle比赛。如果你搜索关键字“分类”,选择那些已经完成的,你能找到一些类似的东西,这样你可能会知道选择一个什么样的方法来赢得比赛。在这一点上,你可能会意识到,使用集成方法总容易把事情做好。当然集成的唯一问题,是需要保持所有独立的方法并行地工作。这可能是你的最后一步,花哨的一步。
编辑点评:Xavier Amatriain不推荐深度学习为通用算法的理由,并不能说是因为深度学习不好,而是因为深度学习会增加复杂性及成本,却无法保证在所有的场景表现出比逻辑回归、SVM及决策树集成更优的结果。事实上,Xavier Amatriain的Netflix团队早已开始研究人工神经网络和深度学习技术,希望借助AWS云服务和GPU加速的分布式神经网络,分析网民最爱看的电影电视剧,实现节目的个性化推荐。
Netflix推荐系统架构(图片来自Xavier Amatrain参与撰写的Netflix官方博客)
此后,Xavier Amatriain还分享了Netflix机器学习实践的十大经验教训,大致包括:
更多的数据需要与更好的模型之匹配你可能不需要所有的大数据更复杂的模型未必意味着更好的结果,可能是你的样本集太简单要充分考虑你的训练数据学会处理偏差UI是联系算法和最重要的用户之间唯一通道正确的演进方式比数据和模型更重要分布式算法重要,知道在哪个层级使用它更重要选择合适的度量自动超参数优化并非所有的事都能离线完成,近线处理也是一种选择6月3-5日,北京国家会议中心,第七届中国云计算大会,3天主会,17场分论坛,3场实战培训,160+位讲师,议题全公开!
相关问答
pythonAI入门或进阶,有什么好的培训机构或学习途径吗?
千锋python率先覆盖所有类型数据库,传授学生包括mysql、redis和mongdb数据库最全最新数据库知识。推出最贴近企业实战的机器学习案例,例如人脸识别,手写数字...
如何构建可行的欺诈检测方案?
如果你对学习人工智能和深度学习感兴趣,可以订阅我的头条号,我会在这里发布所有与算法、机器学习以及深度学习有关的有趣文章。(码字不易,若文章对你帮助可...