赞
踩
1.Xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包之一,比常见的工具包快10倍以上,他是GB方法里的完全加强版本,也是基于残差优化的算法,希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力。
2.Xgboost相对于GBDT的优点:
(1)传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
(2)传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。并且xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
(3)xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
(4)列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(随机取一定的列),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
(5)对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
(6)xgboost工具支持并行。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
1.Xgboost的每次优化时的目标函数是下面的式子:
可以看出其目标函数一方面要考虑到损失函数L的计算,另一方面要控制模型复杂度,防止过拟合,我们每步会构造最佳的模型 。
2.Xgboost的基本过程和GBDT基本是一样的,都是通过构造多个基分类器来达到使目标函数最小的目的,每步针对以上有正则限制的损失函数去找到最佳的分类器。接下来我们从三个角度进行考虑:
(1).由于为令新加的 使损失函数L值往更小的方向走,所以需要计算L值与
相关的导数式,导数式该怎么引入那?
(2).这个 正则项表达式该怎么表示那?
(3).每次在构造基分类器时候,如何找到最佳的分裂点?即找到分割方案?
我门会将损失函数中的L部分进行二阶泰勒展开:
由于二阶泰勒展开的计算式子是:
对应的将L式子内的式子,进行二阶泰勒展开后为(其中yi是已知的实际值):
对应的假定我们令一阶导数为g,二阶导数为h,整个目标函数式子可以改写为:
1.我们一般使用复杂度来表示正则项,对复杂度的定义是使用下式:
其中主要分为两部分,T代表了叶子节点总数、 代表了叶子节点得分L2正则化项,
和
是我们另外设定的参数,这样举个例子,下面的树对应的复杂度值即为右式,叶子节点数为3。
2.经过上面的正则项定义,我们可以将目标函数展开成:
3.接下来我们进行两个替换:
替换之后目标函数值为:
4.接下来对目标函数对w求导,并令其为0,可以得到:
将该式子代入可以得到新的目标式:
1.到目前为止,我们已经得到最终的目标函数:
我们称此式为打分函数,打分函数越小,说明结构越好(其中 越大越好)。
2.比如下面的树,其对应的打分值在右侧(G、H是分到结点位置的阶导数之和)。
3。接下来考虑问题3:每次怎么去寻找合适的分裂结点进行结点分割。
寻找分割点是使用下面的式子(γ是进行分割之后所产生的代价,多了个叶子):
借助打分函数,每次尝试对树中的每个结点增加一个分割,看看目标函数经过分割之后能够获得的增益Gain,方法是:从左到右扫描就能得到所有分割的梯度H和GL、GR,代入公式就可以得到分割方案下的分数值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。