Xgboost模型
⼀.Xgboost简介
1.Xgboost是⼤规模并⾏boosted tree的⼯具,它是⽬前最快最好的开源boosted tree⼯具包之⼀,⽐常见的⼯具包快10倍以上,他是GB⽅法⾥的完全加强版本,也是基于残差优化的算法,希望建⽴K个回归树,使得树群的预测值尽量接近真实值(准确率)⽽且有尽量⼤的泛化能⼒。
trueblue2.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结构也使得并⾏成为了可能,在进⾏节点的分裂时,需要计算每个特征的增益,最终选增益最⼤的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进⾏。
⼆.Xgboost的原理和⼀些疑问
1.Xgboost的每次优化时的⽬标函数是下⾯的式⼦:
好听的英语歌曲
可以看出其⽬标函数⼀⽅⾯要考虑到损失函数L的计算,另⼀⽅⾯要控制模型复杂度,防⽌过拟合,我们每步会构造最佳的模型 。
2.Xgboost的基本过程和GBDT基本是⼀样的,都是通过构造多个基分类器来达到使⽬标函数最⼩的⽬的,每步针对以上有正则限制的损失函数去找到最佳的分类器。接下来我们从三个⾓度进⾏考虑:
pegasus(1).由于为令新加的 使损失函数L值往更⼩的⽅向⾛,所以需要计算L值与 相关的导数式,导数式该怎么引⼊那? (2).这个 正则项表达式该怎么表⽰那?
两部鼓吹(3).每次在构造基分类器时候,如何找到最佳的分裂点?即找到分割⽅案?
天译翻译>pigg三.疑问解答 - 问题⼀
我门会将损失函数中的L部分进⾏⼆阶泰勒展开:
由于⼆阶泰勒展开的计算式⼦是:
对应的将L式⼦内的式⼦,进⾏⼆阶泰勒展开后为(其中yi是已知的实际值):hcu
对应的假定我们令⼀阶导数为g,⼆阶导数为h,整个⽬标函数式⼦可以改写为:
四.疑问解答 - 问题⼆
1.我们⼀般使⽤复杂度来表⽰正则项,对复杂度的定义是使⽤下式:
其中主要分为两部分,T代表了叶⼦节点总数、 代表了叶⼦节点得分L2正则化项, 和 是我们另外设定的参数,这样举个例⼦,下⾯的树对应的复杂度值即为右式,叶⼦节点数为3。
2.经过上⾯的正则项定义,我们可以将⽬标函数展开成:
3.接下来我们进⾏两个替换:
替换之后⽬标函数值为:
4.接下来对⽬标函数对w求导,并令其为0,可以得到:
agitate
将该式⼦代⼊可以得到新的⽬标式:
五.疑问解答 - 问题三
1.到⽬前为⽌,我们已经得到最终的⽬标函数:
金山 翻译我们称此式为打分函数,打分函数越⼩,说明结构越好(其中 越⼤越好)。
2.⽐如下⾯的树,其对应的打分值在右侧(G、H是分到结点位置的阶导数之和)。
3。接下来考虑问题3:每次怎么去寻找合适的分裂结点进⾏结点分割。
寻找分割点是使⽤下⾯的式⼦(γ是进⾏分割之后所产⽣的代价,多了个叶⼦):
杨澜ted演讲稿借助打分函数,每次尝试对树中的每个结点增加⼀个分割,看看⽬标函数经过分割之后能够获得的增
益Gain,⽅法是:从左到右扫描就能得到所有分割的梯度H和GL、GR,代⼊公式就可以得到分割⽅案下的分数值。
代码范例