黑马程序员技术交流社区

标题: 【上海校区】通俗、有逻辑的说下Xgboost的原理 [打印本页]

作者: 不二晨    时间: 2018-8-1 09:22
标题: 【上海校区】通俗、有逻辑的说下Xgboost的原理
初看Xgboost,翻了多篇博客发现关于xgboost原理的描述实在难以忍受,缺乏逻辑性,写一篇供讨论。
——以下是抛砖引玉。 观其大略,而后深入细节,一开始扎进公式反正我是觉得效率不高,还容易打消人的积极性。
首先说下决策树说下Xgboost的建树过程
Xgboost是很多CART回归树集成
是时候看看Xgboost了
首先明确下我们的目标,希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力(更为本质的东西),从数学角度看这是一个泛函最优化,多目标,看下目标函数:
 L(ϕ )=∑ i l(y ^ i −y i )+∑ k Ω( f k ) L(ϕ)=∑il(y^i−yi)+∑kΩ(fk)
其中表示第i个样本,表示第个样本的预测误差,误差越小越好,不然你算得上预测么?后面表示树的复杂度的函数,越小复杂度越低,泛化能力越强,这意味着啥不用我多说。表达式为
Ω (f)=γ T+1 2 λ| | w| | 2 Ω(f)=γT+12λ||w||2
表示叶子节点的个数,表示节点的数值(这是回归树的东西,分类树对应的是类别)
直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端(这个怎么看,如果某个样本label数值为4,那么第一个回归树预测3,第二个预测为1;另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险)
ok,听起来很美好,可是怎么实现呢,上面这个目标函数跟实际的参数怎么联系起来,记得我们说过,回归树的参数:(1)选取哪个feature分裂节点呢;(2)节点的预测值(总不能靠取平均值这么粗暴不讲道理的方式吧,好歹高级一点)。上述形而上的公式并没有“直接”解决这两个,那么是如何间接解决的呢?
先说答案:贪心策略+最优化(二次最优化,恩你没看错)
通俗解释贪心策略:就是决策时刻按照当前目标最优化决定,说白了就是眼前利益最大化决定,“目光短浅”策略,他的优缺点细节大家自己去了解,经典背包问题等等。
这里是怎么用贪心策略的呢,刚开始你有一群样本,放在第一个节点,这时候多少呢,不知道,是求出来的,这时候所有样本的预测值都是(这个地方自己好好理解,决策树的节点表示类别,回归树的节点表示预测值),带入样本的label数值,此时loss function变为
 L(ϕ )=∑ i l(w−y i )+γ+ 1 2 λ| | w| | 2 L(ϕ)=∑il(w−yi)+γ+12λ||w||2
如果这里的误差表示用的是平方误差,那么上述函数就是一个关于的二次函数求最小值,取最小值的点就是这个节点的预测值,最小的函数值为最小损失函数。
暂停下,这里你发现了没,二次函数最优化!
要是损失函数不是二次函数咋办,哦,泰勒展开式会否?,不是二次的想办法近似为二次。
接着来,接下来要选个feature分裂成两个节点,变成一棵弱小的树苗,那么需要:(1)确定分裂用的feature,how?最简单的是粗暴的枚举,选择loss function效果最好的那个(关于粗暴枚举,Xgboost的改良并行方式咱们后面看);(2)如何确立节点的以及最小的loss function,大声告诉我怎么做?对,二次函数的求最值(细节的会注意到,计算二次最值是不是有固定套路,导数=0的点,ok)
那么节奏是,选择一个feature分裂,计算loss function最小值,然后再选一个feature分裂,又得到一个loss function最小值…你枚举完,找一个效果最好的,把树给分裂,就得到了小树苗。
在分裂的时候,你可以注意到,每次节点分裂,loss function被影响的只有这个节点的样本,因而每次分裂,计算分裂的增益(loss function的降低量)只需要关注打算分裂的那个节点的样本。原论文这里会推导出一个优雅的公式,我不想敲latex公式了,
想研究公式的去这里吧
matafight.github.io/2017/03/14/…….
接下来,继续分裂,按照上述的方式,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树,是不是贪心策略?!
凡是这种循环迭代的方式必定有停止条件,什么时候停止呢:
(1)当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思(其实我这里有点疑问的,一般后剪枝效果比预剪枝要好点吧,只不过复杂麻烦些,这里大神请指教,为啥这里使用的是预剪枝的思想,当然Xgboost支持后剪枝),阈值参数为 正则项里叶子节点数T的系数(大神请确认下);
(2)当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,这个好理解吧,树太深很容易出现的情况学习局部样本,过拟合;
(3)当样本权重和小于设定阈值时则停止建树,这个解释一下,涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;
(4)貌似看到过有树的最大数量的…这个不确定
具体数学推导细节(只要是那个节点分裂增益计算的公式),请参看作者(论文作者哦)介绍,很细致! www.52cs.org/?p=429,上面那个也可以
问题1:节点分裂的时候是按照哪个顺序来的,比如第一次分裂后有两个叶子节点,先裂哪一个?
答案:呃,同一层级的(多机)并行,确立如何分裂或者不分裂成为叶子节点,来源
wenku.baidu.com/view/44778c…
看下Xgboost的一些重点看下Xgboost的工程优化
这部分因为没有实战经验,都是论文、博客解读来的,所以也不十分确定,供参考。
与GDBT、深度学习对比下
Xgboost第一感觉就是防止过拟合+各种支持分布式/并行,所以一般传言这种大杀器效果好(集成学习的高配)+训练效率高(分布式),与深度学习相比,对样本量和特征数据类型要求没那么苛刻,适用范围广。
说下GBDT:有两种描述版本,把GBDT说成一个迭代残差树,认为每一棵迭代树都在学习前N-1棵树的残差;把GBDT说成一个梯度迭代树,使用梯度迭代下降法求解,认为每一棵迭代树都在学习前N-1棵树的梯度下降值。有说法说前者是后者在loss function为平方误差下的特殊情况。这里说下我的理解,仍然举个例子:第一棵树形成之后,有预测值 ,真实值(label)为 ,前者版本表示下一棵回归树根据样本进行学习,后者的意思是计算loss function在第一棵树预测值附近的梯度负值作为新的label,也就是对应xgboost中的
这里真心有个疑问:
Xgboost在下一棵树拟合的是残差还是负梯度,还是说是一阶导数+二阶导数,?可能人蠢,没看太懂,换句话说GBDT残差树群有一种拟合的(输入样本)是 ,还一种拟合的是,Xgboost呢?
Xgboost和深度学习的关系,陈天奇在Quora上的解答如下:
不同的机器学习模型适用于不同类型的任务。深度神经网络通过对时空位置建模,能够很好地捕获图像、语音、文本等高维数据。而基于树模型的XGBoost则能很好地处理表格数据,同时还拥有一些深度神经网络所没有的特性(如:模型的可解释性、输入数据的不变性、更易于调参等)。
这两类模型都很重要,并广泛用于数据科学竞赛和工业界。举例来说,几乎所有采用机器学习技术的公司都在使用tree boosting,同时XGBoost已经给业界带来了很大的影响。


作者: 不二晨    时间: 2018-8-1 10:21

奈斯,很赞
作者: 梦缠绕的时候    时间: 2018-8-2 16:27





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2