机器学习模型的优化是机器学习任务中至关重要的一个环节。传统的优化方法,如梯度下降法,在许多情况下表现良好,但它们也有一些局限性。启发式算法提供了一种替代方案,可以克服这些局限性并提高优化性能。
机器学习算法中GBDT和XGBOOST的区别有哪些?
在昨天阿里的面试中被问到了,我只简单的说了下xgboost能自动利用cpu的多线程,而且适当改进了gradient boosting,加了剪枝,控制了模型的复杂程度
添加评论
分享
默认排序按时间排序
9 个回答
weponML/DM,人赞同
xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?看了陈天奇大神的文章和slides,略抒己见,没有面面俱到,不恰当的地方欢迎讨论:
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统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还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
=============回复@肖岩在评论里的问题,因为有些公式放正文比较好。 评论里讨论的问题的大意是 “xgboost代价函数里加入正则项,是否优于cart的剪枝”。 其实陈天奇大神的slides里面也是有提到的,我当一下搬运工。 决策树的学习过程就是为了找出最优的决策树,然而从函数空间里所有的决策树中找出最优的决策树是NP-C问题,所以常采用启发式(Heuristic)的方法,如CART里面的优化GINI指数、剪枝、控制树的深度。 这些启发式方法的背后往往隐含了一个目标函数,这也是大部分人经常忽视掉的。 xgboost的目标函数如下:其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2模的平方:那这个跟剪枝有什么关系呢???跳过一系列推导,我们直接来看xgboost中树节点分裂时所采用的公式:这个公式形式上跟ID3算法(采用entropy计算增益) 、CART算法(采用gini指数计算增益) 是一致的,都是用分裂后的某种值 减去 分裂前的某种值,从而得到增益。 为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。 另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。
启发式算法、元启发式算法与超启发式算法的区别主要在于解决问题的层次和方式。 启发式算法是依赖问题特性的算法,通常能快速找到局部最优解,但可能陷入局部最优状态,无法找到全局最优解。 元启发式算法是独立于问题的通用优化方法,能够更全面地探索解空间,避免局部最优,但仍然需要微调来适应特定问题。 超启发式算法则是利用机器学习预测优化过程的算法,结合了元启发式算法和机器学习的优势,能处理复杂问题,但对数据和计算资源要求较高。 启发式算法如A*搜索算法、遗传算法和模拟退火等,依赖于问题理解和经验规则,寻找快速可能的解决方案。 元启发式算法如遗传算法、蚁群优化和粒子群优化,通过模拟自然现象寻找最优解,处理复杂问题和大搜索空间。 超启发式算法,如基于神经网络的遗传算法和强化学习,利用机器学习预测解决方案质量,指导优化过程,适用于处理非常复杂的问题和大搜索空间,但需要大量数据和计算资源。 总结而言,启发式算法基于问题特性的快速解法,元启发式算法为通用优化策略,超启发式算法融合机器学习,提升复杂问题的解决能力。 选择合适的算法取决于具体问题和应用场景的需求。
启发式算法是一种基于经验和策略的问题解决算法。 启发式算法是一种寻找问题解决方案的迭代过程,它借鉴已知经验、规则和启发式信息来引导搜索过程,寻找一个或多个可能的解。 它不是盲目地穷举所有可能的解空间,而是通过特定的启发式函数或规则,尝试通过更有效的路径达到目标状态。 这种方式提高了算法的效率和效果,使之更接近实际问题的解决。 具体地说,它的运行主要依赖于特定的规则和经验性的策略来减少计算复杂性。 它并非严格按照数学模型进行计算,而是结合实际问题背景和实践经验进行设计。 通过这种方法,启发式算法能够更快速有效地解决一些复杂的优化问题。 在某些情况下,它还能提供近似最优解或者在某些情况下就是最优解。 由于其在复杂问题处理中的灵活性和效率优势,启发式算法在很多领域都得到了广泛的应用,包括计算机科学、机器学习、规划、工程等领域。 并且许多经典的算法也被看作是启发式算法的实例。 在理解启发式算法时,重点要注意它的基于经验和实践性特征,以及其在解决复杂问题时的有效性和灵活性。 总之,启发式算法是一种高效的解决复杂问题的策略性方法。 它在处理复杂问题时能够展现出极大的优势,是现代计算机科学和人工智能领域不可或缺的一部分。
本文地址:http://www.hyyidc.com/article/39799.html