博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二阶差分预测后数据还原公式_xgboost系列丨xgboost原理及公式推导
阅读量:1543 次
发布时间:2019-04-21

本文共 2310 字,大约阅读时间需要 7 分钟。

c81649d67a33b8811cd4af3045648a0b.gif

戳上面的
蓝字关注我们哦!
be71a82343948e64456b1d2b992c94c6.png
5077db58d637f1acd9937d146b60e3dc.gif
  • 建树过程中如何选择使用哪个特征哪个值来进行分裂?
  • 什么时候停止分裂?
  • 如何计算叶节点的权值?
  • 建完了第一棵树之后如何建第二棵树?
  • 为防止过拟合,XGB做了哪些改进

树的集成

68fdaa61c3602cea499e648c0cc3ed5e.png 本文主要针对xgboost的论文原文中的公式细节做了详细的推导,对建树过程进行详细分析。 对于样本个数为n特征个数为m的数据集
5e28e4a8e39eb258e356ac0063ab09b7.png ,其中
fd2b724f281c2a08af83da3912081f99.png。 树的集成学习方法使用K个增量函数来预测输出:
1644b19ea15584b5c6b71c14eedb093e.png

fd17a1d0ecc62f8e68e7a8a428895c33.png为子模型的预测函数,每个fd17a1d0ecc62f8e68e7a8a428895c33.png即是一棵树。

函数空间
3b0a719dfeaca63154a301d7e7f21742.png 即树的搜索空间。其中q为每棵树的结构,q将
95632dc99af76b0e14fb99f4cb82e043.png 域 中每个样本对应到唯一的叶节点上,最终产生T个叶节点,
a65c140a4c2842c7781e17703aac8c86.png 则是该叶节点对应的权重,w即从节点到权重的映射(权重即叶节点的值)。 每个
f9fe6829226c26c2be75f5743eabdbc0.png 对应一个独立的树结构q和该树每个叶节点的权重w。 (这里树结构是指每个分裂点和对应的分裂值)。
82b681b2f95a16281cce54ac421151e1.png 可以看做一个分段函数,q对应的不同的分段,w对应的为该分段的值,
82b681b2f95a16281cce54ac421151e1.png即分段到值的映射。 对我们的预测函数
f7fbfe09dbcd723acdae587dc7cc5ae4.png ,目标函数为:
bbe477ef96cf39988134e24517701210.png 从公式1中可以看出,对于最终的预测函数
24bd1f0a24f8f60da69aeb340568e22a.png,其参数为一个个的函数
f8ac5c0eaf8df5ee7bd7cff6645fd246.png,因为参数为函数,所以
24bd1f0a24f8f60da69aeb340568e22a.png无法使用传统的优化方法在欧氏空间中进行优化,而是采用了加法模型来进行训练。 boost的思想是将一系列弱分类器串行的组合起来,在前面的分类器的基础上迭代的优化新的分类器。
90129f731a69d4376022b7664167b7f9.png 首先我们对所有的数据默认预测一个固定值
ccfe3d9dcb3568bacfc0312f97f8d283.png (对应xgboost中参数base_score,注意并不等于base_score,而是经过Sigmoid函数映射后的值),在此基础上根据该预测值与真实y值的损失 ,建立第一棵树
8d0ca4b11553e36fe437e147725ae532.png,之后每次迭代时都是根据 其之前所有树做出的预测之和与真实y值的损失来建立新树。 也就是每次迭代建树时用新树
8d0ca4b11553e36fe437e147725ae532.png来优化前一个树的损失 。

a9a54769c455543b97e3c4ec8344c32f.png为第t棵树对第i个样本做出的预测。我们每次添加新树的时候,要优化的目标函数为上一个树产生的损失。

因此我们建立第t棵树时有损失函数:
7a342f82a8420b128c88cabe34cec8f0.png
76c08ffe7591de17ed5228f2ced305fd.png为新建的这棵树做出的预测,
6d4ce18948dff214f092fb9702250bbc.png为之前所有的树预测值之和,
3f73fcbec2ae89b870331bac9ac3e09a.png 即是新建了当前这棵树后模型做出的预测值,求其与真实值
b137010e58f8dc58526c35246f3459c1.png 之间的损失(注意这里是损失不是残差,这里的
40d166d3ba566cb62fce76d9a2bad7b3.png 可以是log_loss, mse等)。
泰勒展开
853378031938d7c1b7c60d6f2208760b.png gbdt的目标函数与xgboost区别就是带不带正则项,也就是上面式子中的
2a4f5d73646ea7ae5fbc1d18c408a236.png 。 gbdt对损失函数的优化是直接使用了损失函数的负梯度,沿着梯度下降的方向来减小损失,其是也就是一阶泰勒展开。 而xgboost在这里使用了二阶泰勒展开,因为包含了损失函数的二阶信息,其优化的速度大大加快。
b7b47379dbc67f330352ee0310d695f1.png 下面来看一下泰勒展开的推导。首先我们来复习一下泰勒定理: 设n是一个正整数。如果定义在一个包含a的区间上的函数f在a点处n+1次可导,那么对于这个区间上的任意x,则有:
ee2c857d762f93c28faec6054d5c559e.png其中的多项式称为函数在a处的泰勒展开式,剩余的
6127d32cc10f98a9c5253a165a5ad55d.png是泰勒公式的余项,是
87d850ee2918261f2e7e1da6ed93e567.png的高阶无穷小。  该公式经过变换
7493613af7fb102dd1a942eea7131500.png可以得到二阶展开式:
0f5b346c62515447b03883aa27d34286.png 对于式子:
2f317ee4527cf20f23a3cf1d7f8ed8b1.png 可以这样分析,
79bc1e7949355e07d8c996b93ba0b90f.png
为预测值
2c9b2c1d03da1c85b7e3c445d944576a.png
和真实值
fb03d28324698911538d84d1f04b6375.png
之间的损失,
fb03d28324698911538d84d1f04b6375.png
为常量,因此79bc1e7949355e07d8c996b93ba0b90f.png是以预测值2c9b2c1d03da1c85b7e3c445d944576a.png为自变量的函数,当建立新树给出新的预测4469311e5f0acb98c60f843fc002a928.png后,相当于在上一次的预测
bc7b248b48dd2922efc0bd8151f4efd6.png
上增加了一个无穷小量
4ba90b96a27dcf0563a57e69e063de55.png 则有
9efe0dae5497c3642c07eb2e02ed562e.png 其中真实标签
fb03d28324698911538d84d1f04b6375.png是常数,
38424075600a6cbed4ae5b6e0b9169ac.png是上次迭代求出的值即这里的
f0ccc9181817910fc7cfaa09a2621074.png
4469311e5f0acb98c60f843fc002a928.png 为无穷小量
f3a807466362a67e2224b273836eb35c.png 。 有了这个对应之后。
adb54ef6eb776ff78b54ceba4103a942.png 因此我们建立第t棵树时有损失函数:
54c526c12c800774edbdba3b8c0956e0.png 令损失函数的一阶、二阶偏导分别为
72fa359397a0144d6468200ed419146e.png,其中
fe26ab2c196ce9bc5fc31fcdf02208a4.png
b493e082d07e8bd1dc9338b5bd29a9d3.png
d27ebc89fbae5f4029ac4e8c0c536f66.png 式中
5e5dc7c69462dedcfd072cc5017d9433.png为常量,优化的是损失函数的最小值,因此常量值可以从损失函数中去掉。上式可简化为:
eb725cc2d7a2ce1617092e2532db4efa.png

叶节点权重

ff57364831dd26927c005e728c27ffbf.png 式中正则项
8a04c3809b65f1d9d954e6791d914873.png进行展开,得:
0e8dad127473253ba877991f73fefb51.png 其中
4469311e5f0acb98c60f843fc002a928.png是新建的树的值,对于每个样本来说,就是对应的叶节点的权重
3892d82afd485cca9cc723091f4565e4.png 。定义
63015732594a76247ab8955cfbb9e9b9.png 为分到叶节点
269e604b37c644cd248dd19ebed44f27.png 的样本(叶节点 总数为T,样本总数为n) 上式是对本次建树时n个样本的损失求和,下面分两步:先对每个叶节点的样本损失求和,再对所有叶节点求和,两者结果一样。
c6317170924554b8fd2a4879258a0b11.png 对于叶节点
269e604b37c644cd248dd19ebed44f27.png上的损失:
51316130f225b46211eb1151fab1d683.png 对于当前的树结构求
96a557ea63d2b061766bd5e9f0e6e683.png 使
8c69c708eb64b137ab0e0dda1ee886bc.png 最小,显然这是 个一元二次方程求最小值问题。
3212fbf6e2396b3f8ba2a6cbe3db8bec.png 可以得到叶节点权重
3892d82afd485cca9cc723091f4565e4.png的最优值:
75d4c5bdb89df88f5898a30eb4027c34.png

分裂准则

da06f1771227e1dc00e2542256185a83.png 上 面是对 单个叶节点计算出 了最优权重,对于新建的这树(树结构
accc0fb42ec0afee8a1fca62b67d3ccf.png )在此权重下对应的的最小损失为每个叶节点上样本最小损失之和(将上式中的
f984029e72bd207b26485784f16cdbae.png 代入):
ef1e2ac22f17df30117ebb1e2d914c28.png 在树结构
accc0fb42ec0afee8a1fca62b67d3ccf.png下产生的最优损失
d3c8b8fd6ad29f1b12c2a3f482a0dda2.png可以做为树结构的评价函数,也就是作为树分裂时候的评价指标。 令
34fe707dd35f1ecf6340bdf6fdacb9ac.png 为每次分裂时分到左子树上的样本,
815a00c0174669312ae5d98edaca6753.png 为每次分裂时分到右子树上的样本,有
50d9c2eca2b7889a9174cebaee6b3551.png 。 则在该次分裂后损失的减小量为:
ec332af8a4f1a5ea3c3c40c23750c65d.png 因此将分裂时增益定义为:
ac7ea596600c17d81fb79f5f6cd017d6.png 我们在建树的过程(也就是求分段函数的过程)包括两步:一是选择分裂依据的特征和特征值(将自变量分段),二是确定叶节点的权重(确定每段对应的函数值)。划分的依据准则是Gain,其实也就是损失函数的解析解,划分后叶节点的权重
f984029e72bd207b26485784f16cdbae.png是使函数达到解析解的权重
f984029e72bd207b26485784f16cdbae.png。 从最优化的角度来看:GBDT采用的是数值优化的思维, 用的最速下降法去求解Loss Function的最优解, 其中用CART决策树去拟合负梯度, 用牛顿法求步长。XGboost用的解析的思维, 对Loss Function展开到二阶近似, 求得解析解, 用解析解作为Gain来建立决策树, 使得Loss Function最优.

7edee50bfbaa9dda18e2a60bb8c7acb7.gif

除了对目标函数添加正则项外,为了减小过拟合,xgboost还使用了列采样和缩减方法(Shrinkage,即Learning rate)。

损失函数计算

de1ba8a0a9e9314efccf0e119f5dbe34.png 对于二分类问题常使用
log损失作为损失函数,下面推导一下log loss的一阶梯度G和海森矩阵H。
ad2f9411903900d9eccdc894415e2324.png
ce285577efc9011ace372c014def9ca5.png 其中p为预测概率。 若
98efb59f37a3d5041fee6772bc850836.png 为预测值,则有:
d342d3851fa785eac1da50e3576858ee.png 因此:
59a4631dc585a7633e2aa4332cb0262d.png 即:
0378343dcdd5cf5f7bdbceefa551d9d4.png
851b21b2a0969a6a74ce0b0def11b074.png

网络人工智能园地,力求打造网络领域第一的人工智能交流平台,促进华为iMaster NAIE理念在业界(尤其通信行业)形成影响力!

d4e93ae420028125ac5f5157e4090260.png

a61573925de46bc30a210f81fdfa28db.png

851b21b2a0969a6a74ce0b0def11b074.png

11129490f094aa34d1d95dacb190f0fe.png

转载地址:http://rqwcy.baihongyu.com/

你可能感兴趣的文章
C++面经总结之《Effective C++》(一)
查看>>
C++面经总结之《Effective C++》(二)
查看>>
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!!
查看>>
打开我的收藏夹 -- Python数据分析杂谈
查看>>
linux shell — 6.初识 EXT2 文件系统
查看>>
python - 【用户、商品】【购买、浏览】数据处理
查看>>
python - sql + pandas 与 sqlite 结合
查看>>
python - 使用sql 分析(06 - 15)国内各省GDP
查看>>
python - 抓取汇率数据分析美元和欧元对RMB的变化曲线
查看>>
python 数据科学 - 【回归分析】 ☞ 线性回归(2)
查看>>
设计模式——工厂模式
查看>>
Unity中实现有限状态机FSM
查看>>
Unity中实现反弹
查看>>
U3D游戏开发框架(九)——事件序列
查看>>
Unity中解决“SetDestination“ can only be called on an active agent that has been placed on a NavMesh
查看>>
Unity中的刚体
查看>>
Unity中的坐标转换
查看>>
Unity中为什么不能对transform.position.x直接赋值?
查看>>
Lua(四)——变量
查看>>
Lua(十四)——元表
查看>>