通俗理解kaggle竞赛大杀器xgboost

栏目: 编程工具 · 发布时间: 5年前

内容简介:举个例子,有一堆人,我让你分出男女,你依靠头发长短将人群分为两拨,长发的为“女”,短发为“男”,你是不是依靠一个指标“头发长短”将人群进行了划分,你就形成了一个简单的决策树。划分的依据是啥?这个时候,你肯定问,为什么用“头发长短”划分啊,我可不可以用“穿的鞋子是否是高跟鞋”,“有没有喉结”等等这些来划分啊,Of course!那么肯定就需要判断了,那就是哪一种分类效果好,我就选哪一种啊。

通俗理解kaggle竞赛大杀器xgboost

1 决策树

举个例子,有一堆人,我让你分出男女,你依靠头发长短将人群分为两拨,长发的为“女”,短发为“男”,你是不是依靠一个指标“头发长短”将人群进行了划分,你就形成了一个简单的决策树。

划分的依据是啥?

这个时候,你肯定问,为什么用“头发长短”划分啊,我可不可以用“穿的鞋子是否是高跟鞋”,“有没有喉结”等等这些来划分啊,Of course!那么肯定就需要判断了,那就是哪一种分类效果好,我就选哪一种啊。

分类效果如何评价量化呢?

怎么判断“头发长短”或者“是否有喉结”…是最好的划分方式,效果怎么量化。直观来说,如果根据某个标准分裂人群后,纯度越高效果越好,比如说你分为两群,“女”那一群都是女的,“男”那一群全是男的,这个效果是最好的,但事实不可能那么巧合,所以越接近这种情况,我们认为效果越好。

于是量化的方式有很多,信息增益(ID3)、信息增益率(C4.5)、基尼系数(CART)等等,来用来量化纯度。更多细节如剪枝、过拟合、优缺点、可以参考此文《决策树学习》。

决策树的灵魂就已经有了,依靠某种指标进行树的分裂达到分类/回归的目的(上面的例子是分类),总是希望纯度越高越好。

2.Xgboost

如果用一句话定义xgboost,很简单:Xgboost就是由很多CART回归树集成。但,又什么是回归树呢?

2.1 回归树

事实上,分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射。

回归树是个啥呢?

分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到120万元之间的任意值。

那么,这时候你就没法用前面的信息增益、信息增益率、基尼系数来判定树的节点分裂了,你就会采用新的方式,预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值),那么怎么确定呢,有的是节点内样本均值,有的是最优化算出来的比如Xgboost(细节可以参看这里:http://blog.csdn.net/app_12062011/article/details/52136117)

2.2 boosting集成学习

boosting集成学习由多个相关联的决策树联合决策,什么叫相关联?举个例子

  1. 有一个样本[数据->标签]是:[(2,4,5)-> 4]
  2. 第一棵决策树用这个样本训练的预测为3.3
  3. 那么第二棵决策树训练时的输入,这个样本就变成了:[(2,4,5)-> 0.7]
  4. 也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关

与之对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥关系。

所以首先Xgboost首先是一个boosting的集成学习,这样应该就很通俗了。

这个时候大家就能感觉到一个回归树形成的关键点:

  • 分裂点依据什么来划分(如前面说的均方误差最小,loss);
  • 分类后的节点预测值是多少(如前面说,有一种是将叶子节点下各样本实际值得均值作为叶子节点预测误差,或者计算所得)

3.gbdt

说到xgboost,不得不说gbdt,两者都是boosting方法(如图所示:Y = Y1 + Y2 + Y3)

通俗理解kaggle竞赛大杀器xgboost 还是用年龄预测这个例子。

简单起见训练集只有4个人:A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。

如果是用一棵传统的回归决策树来训练,会得到如下图所示结果:

通俗理解kaggle竞赛大杀器xgboost 现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。

我们会得到如下图所示结果:

通俗理解kaggle竞赛大杀器xgboost 在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为两拨,每拨用平均年龄作为预测值。此时计算残差(残差的意思就是: A的预测值 + A的残差 = A的实际值),所以A的残差就是16-15=1(注意,A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值)。进而得到A,B,C,D的残差分别为-1,1,-1,1。

残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。

然后我们拿残差替代A,B,C,D的原值,到第二棵树去学习,如果我们的预测值和它们的残差相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了。这里的数据显然是我可以做的,第二棵树只有两个值1和-1,直接分成两个节点。此时所有人的残差都是0,即每个人都得到了真实的预测值。

换句话说,现在A,B,C,D的预测值都和真实年龄一致了。Perfect!:

A: 14岁高一学生,购物较少,经常问学长问题;预测年龄A = 15 – 1 = 14

B: 16岁高三学生;购物较少,经常被学弟问问题;预测年龄B = 15 + 1 = 16

C: 24岁应届毕业生;购物较多,经常问师兄问题;预测年龄C = 25 – 1 = 24

D: 26岁工作两年员工;购物较多,经常被师弟问问题;预测年龄D = 25 + 1 = 26

4.xgboost vs gbdt 
如果不考虑工程实现、解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义。


注:红色箭头指向的l即为损失函数;红色方框为正则项,包括L1、L2;红色圆圈为常数项。

xgboost利用泰勒展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。

5.Xgboost的推导
首先明确下我们的目标,希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力(更为本质的东西),从数学角度看这是一个泛函最优化,多目标,看下目标函数: 


其中i表示第i个样本,l((y^i−yi)表示第i个样本的预测误差,误差越小越好,不然你算得上预测么?后面∑kΩ(fk)表示树的复杂度的函数,越小复杂度越低,泛化能力越强,这意味着啥不用我多说。表达式为 


T表示叶子节点的个数,w表示节点的数值(这是回归树的东西,分类树对应的是类别)

直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端。

怎么说呢?举个例子,如果某个样本label数值为4,那么第一个回归树预测3,第二个预测为1;
另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险。

OK,听起来很美好,可是怎么实现呢,上面这个目标函数跟实际的参数怎么联系起来,记得我们说过,回归树的参数:
(1)选取哪个feature分裂节点呢;
(2)节点的预测值(总不能靠取平均值这么粗暴不讲道理的方式吧,好歹高级一点)。

上述形而上的公式并没有“直接”解决这两个,那么是如何间接解决的呢?

先说答案:贪心策略+最优化(二次最优化,恩你没看错)

通俗解释贪心策略:就是决策时刻按照当前目标最优化决定,说白了就是眼前利益最大化决定,“目光短浅”策略,他的优缺点细节大家自己去了解,经典背包问题等等。

这里是怎么用贪心策略的呢,刚开始你有一群样本,放在第一个节点,这时候T=1,w多少呢,不知道,是求出来的,这时候所有样本的预测值都是w(这个地方自己好好理解,决策树的节点表示类别,回归树的节点表示预测值),带入样本的label数值,此时loss function变为 


如果这里的l(w−yi)误差表示用的是平方误差,那么上述函数就是一个关于w的二次函数求最小值,取最小值的点就是这个节点的预测值,最小的函数值为最小损失函数。

暂停下,这里你发现了没,二次函数最优化! 
要是损失函数不是二次函数咋办,哦,泰勒展开式会否?,不是二次的想办法近似为二次。

接着来,接下来要选个feature分裂成两个节点,变成一棵弱小的树苗,那么需要:
(1)确定分裂用的feature,how?最简单的是粗暴的枚举,选择loss function效果最好的那个(关于粗暴枚举,Xgboost的改良并行方式咱们后面看);
(2)如何确立节点的ww以及最小的loss function,大声告诉我怎么做?对,二次函数的求最值(细节的会注意到,计算二次最值是不是有固定套路,导数=0的点,ok)

那么节奏是,选择一个feature分裂,计算loss function最小值,然后再选一个feature分裂,又得到一个loss function最小值…你枚举完,找一个效果最好的,把树给分裂,就得到了小树苗。

在分裂的时候,你可以注意到,每次节点分裂,loss function被影响的只有这个节点的样本,因而每次分裂,计算分裂的增益(loss function的降低量)只需要关注打算分裂的那个节点的样本。原论文这里会推导出一个优雅的公式,如下图所示:

以上所述就是小编给大家介绍的《通俗理解kaggle竞赛大杀器xgboost》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web开发权威指南

Web开发权威指南

[美] Chris Aquino,、[美] Todd Gandee / 奇舞团 / 人民邮电出版社 / 2017-9 / 99.00元

本书在知名培训机构Big Nerd Ranch 培训教材的基础上编写而成,囊括了JavaScript、HTML5、CSS3等现代前端开发人员急需的技术关键点,包括响应式UI、访问远程Web 服务、用Ember.js 构建应用,等等。此外,还会介绍如何使用前沿开发工具来调试和测试代码,并且充分利用Node.js 和各种开源的npm 模块的强大功能来进行开发。 全书分四部分,每部分独立完成一个项......一起来看看 《Web开发权威指南》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具