集成学习_GBDT_XGBoost

1.集成学习(Ensemble Learning)

集成学习就是将多个弱分类器组合成为一个强分类器。比起几千年才出一个的力能扛鼎的项羽来说,我们找十几个匹夫把鼎抬过去会更简单一些。这就是集成学习的思想,允许单个模型缺陷的存在,使用多个模型的组合去消除掉单个模型的这种缺陷,达到更理想的结果。
所以我们需要思考两个问题:
1.在这种集成思想下,如何训练单个模型。
2.使用怎样的方式将多个模型组合起来。
围绕上面的两个问题,下面我们介绍一下常用的几种集成学习的套路。

1.1 Bagging(bootstrap aggregating)

bootstrap:也称为自助法,是一种有放回的采样方式。bagging模型是一种并行的集成方法,即所有的模型是可以并行训练的。
随机森林(random decision forests):这个名字本身就已经告诉了我们随机森林是什么,由多棵决策树组成的森林。并且每棵树的训练数据使用bootstrap随机生成,树分裂的过程中使用的特征也是bootstrap随机生成的。
最后bagging输出的结果:如果是分类的话,就多个模型进行投票选出最优解。如果是回归的话,就将多个模型产生的结果求平均数。
在这里插入图片描述

1.2. Boosting

Boosting是一种序列化集成方法,即前面的模型训练完成之后才可以进行后面模型的训练。跟bagging随机生成待选特征和训练集数据,以差异化弱分类器不同的是。Boosting通过改变不同样本的权重,来实现差异化。具体的思想就是,每一轮训练的时候增加上一轮分错数据的权重,减小上一轮分对数据的权重。对于准确率高的模型赋予较高的权重,准确率低的模型赋予较低的权重。
Adaboost:
下面我们讨论Boosting思想的一种具体的实现-Adaboost。
因为Adaboost是一种boosting的算法,所以我们这里主要考虑两个问题:1.样本权重如何确定 2.学习器的权重如何确定。
权重错误率:错误数据的权重和/所有数据的权重和
误差率:ek为t时刻模型的总体误差率
在这里插入图片描述
定义中间变量
在这里插入图片描述
更新t+1轮权重W的方式:
在这里插入图片描述
更新模型权重α的方式: α=ln(Δt)
Adaboost流程:
1.初始化第一轮的数据权重w=1/n
2.训练是的权重错误率最小的模型g(t)
3.更新t+1时刻的w权重,训练g(t+1),计算模型权重α。
4.训练完成后,对所有的学习器加权求和得到最终的结果。

1.3 Stacking

Stacking的思想就是训练多个模型,然后将多个模型的输出作为输入,训练一个新的模型。使用该模型进行最终的预测。跟前面两种思想不一样的是,stacking可以是不同的模型的堆叠,这些模型并不需要使用同一种算法。

2.GBDT 梯度提升决策树

GBDT使用残差拟合的方式来构建CART树,传统的梯度下降是直接对参数求导,使得参数沿着梯度的放下调节,最终使得损失最小。而GBDT是直接对函数F(x)进行求导,因为最终需要得到的是一系列的F(x)。
残差的计算公式是y-F(x)
然后以t时刻的残差作为y,来训练t+1时刻的模型。
二分类
GBDT天然的适合与回归问题,如果进行分类问题,我们的思路和逻辑回归一样。拟合预测结果的对数几率,公式如下:
在这里插入图片描述
使用上面的残差来拟合一棵新的回归树;
最后将所有的学习器组合起来得到最终的学习器F(x);
多分类
多分类时候的思想和逻辑回归多分类一致,可以看到下面的公式类似于softmax公式,使用当前学习器的对数概率除以所有的学习器概率之和。
在这里插入图片描述
特征选择
我们还可以使用GBDT来进行新特征的构造。
其中特征的重要程度是特征在每棵树中的重要程度的平均值。
特征在每棵树中的重要程度是其在该树中的收益之和。
如下图所示,我们先构造了一颗GBDT树,然后输入样本x,假设其在第一棵树中落入节点二,第二棵树中落入节点一,那么使用所有的叶子节点构造的新的特征向量为[0,1,0,1,0],其中向量长度为所有树中的叶子节点的数量,向量中该节点所在的叶子节点位置为1,其它的位置为0。
然后可以把新的特征和原始特征组合在一起进行模型的训练,往往能够很好的提升模型的准确度。
然后将从顶部到

3.XGBoost

XGBoost是GBDT思想在工程上的一种实现,那我们就基于上面GBDT来谈谈XGBoost都做了哪些不同的事情。这样也就了解了SGBoost。

3.1目标函数

传统的GBDT启发式的生成树,每一步都选择对于当前收益最大的特征和切分点作为分裂的条件。但是XGBoost使用目标式的生成一棵树,也就是首先定义一个目标函数,然后不断的优化这个目标函数使得整体的损失最小。
下面的公式就是目标函数的定义,由两部分组成:第一部分是损失项,代表了模型的准确性;第二部分是惩罚项,表示出模型的复杂程度。
在这里插入图片描述
由GBDT我们知道,整体优化的过程与传统的SGD不同。因为SGD是对数值进行求导,而我们是对函数本身求导。如下所示,每一次优化我们都新加一个f(xi)来拟合上一次的残差。
在这里插入图片描述
使用泰勒二阶展开来近似我们的目标函数,下图所示其中gi表示一阶导数,hi表示二阶导数。对于t时刻来说,前t-1时刻的树不会再变化,所以其复杂度也不会再变化,我们将其看做是常数项constant。所以t时刻的目标函数就是:损失 + 一阶导 + 二阶导 + t时刻的复杂度 +常数项;
在这里插入图片描述
对于上面的式子我们将所有的常数项去掉,就得到了目标函数最终简化的形式。注意,上式中第一项的损失是对t-1时刻所求的,对于t时刻来说它是不变的,也可以作为常数项去掉。
在这里插入图片描述
接着上面的公式我们进一步来简化一下目标函数,首先我们考虑一下如何定义一棵树,也就是目标函数中第一部分。当给定一个输入x的时候,树会找到x的位置,并且输出x的权重。这就是一个数的两部分,树的结构,叶子节点的值。那么用一个数组q表示树的结构,用w表示对应位置的权重。如下图所示,q(x)代表x在树中的下标信息,w表示x对应的权重。这样Ft(x) = wq(x)
在这里插入图片描述
下俩定义树的复杂度,由两部分组成:1.叶子节点的数量T 2.叶子节点权重的二范数
在这里插入图片描述
将上面对于树的定义以及复杂度的定义带入到简化后的目标函数中,我们得到下面的式子。我们简单的介绍一下,其中Ij表示某个叶子节点中的所有的节点,由之前我们定义F(x) = wq(x),再加上对于复杂度Ω的定义就有了下面的第二行。第二行的n表示对所有样本加和,也可以表示为所有叶子节点中的节点的加和,因为每一条样本肯定会落到某个叶子节点中。这样就将前面的损失和后面的复杂度求和统一在了T的范围,然后我们对于公共的部分进行合并就得到了第三行。
在这里插入图片描述
下面的推算是一个从特性到共性的过程,首先对于有两个参数G、H的式子得到x最小时为-G/H,此时式子的最小值为-1/2*G^2/H;然后将一阶导的和定义为G,二阶导的和定义为H;使用前面我们得到的规律就得到了参数w的最小值,以及目标函数的最小值。这是一个比较巧妙的过程。

在这里插入图片描述
下面来看一下我们整体的树的结构
在这里插入图片描述

3.2 定义树的结构

树结构的生成其实和GBDT差不多,贪婪式的寻找下一个用来分裂的特征,遍历这个特征中可以用来分割的点,选择使得目标收益最大的特征和切分点。
关于收益的计算,如下图所示,使用分裂后目标函数的值减去分裂之前的值,就是其对应的收益。
在这里插入图片描述

3.3 XGBoost和GBDT的区别

1.GBDT使用cart作为基学习器,XGBoost支持线性分类器
2.GBDT使用泰勒一阶展开近似目标函数,XGBoost使用泰勒二阶展开近似目标函数。
3.XGBoost中加入了正则项,考虑到了树的复杂度。
4.XGBoost会进行列的抽样。
5.XGBoost可以自动处理缺失值。

4.总结

本文中我们总结了集成学习的知识点,以及一些常用的继承学习的方法。包括Bagging思想的随机森林,使用Bosting思想的GBDT和XGBoost。基本的思想都是使用多个弱学习器组合成为一个强学习器,提高模型的整体性能。

5.look me up

莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。
《定风波

【七代小丑/踩点/混剪/高燃】前方高能!欢乐与惊悚的踩点视觉盛宴!希斯莱杰诞辰40周年纪念。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值