XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些比赛中,其效果显著。它是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包。XGBoost 所应用的算法就是 GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。
XGBoost原理推导
对于XGBoost的预测模型同样可以表示为:
![a894776cbe5a2ef1c5b4af5a8552290a.png](https://i-blog.csdnimg.cn/blog_migrate/604113be4be404f957e7bb55b5a8e1b7.png)
其中,K为树的总个数,kf表示第k颗树,yi表示样本Xi的预测结果。
其中损失函数也同样表示为:
![8c7210baa690594776bff0ae2f8c01c3.png](https://i-blog.csdnimg.cn/blog_migrate/d5e37ffb0ec0651a83f38b38c974bc1a.png)
其中l(yi,yi)为样本Xi的训练误差,
我需要求解和优化的就是每个叶子节点的得分值,也就是f(x)的值。另外我们知道XGBoost是以CART树中的回归树作为基分类器,在给定训练数据后,其单个树的结构(叶子节点个数、树深度等等)基本可以确定了。但XGBoost并不是简单重复的将几个CART树进行组合。它是一种加法模型,将模型上次预测(由t-1棵树组合而成的模型)产生的误差作为参考进行下一棵树(第t棵树)的建立。以此,每加入一棵树,将其损失函数不断降低。如下图就为加法模型案例,它将模型预测值与实际值残差作为下一颗树的输入数据:
![ca8062e427719715a571f53970d5388c.png](https://i-blog.csdnimg.cn/blog_migrate/fd295109ce546b7d4e85ae36794f88c4.jpeg)
对于加法策略可以表示如下:
初始化(模型中没有树时,其预测结果为0):
![d63d881e8171fe8ce92e4d8f2d6226c2.png](https://i-blog.csdnimg.cn/blog_migrate/11a4481b87ef3783110b67f75ceabade.png)
往模型中加入第一棵树:
![aa18bd0bf33ba5edbe2cd0e4a3ddda65.png](https://i-blog.csdnimg.cn/blog_migrate/d8a9b5baac4936541a8a1e1e4aed50ae.png)
往模型中加入第二棵树:
![84669ba1b4a2a9d52bb61606b0ae5a95.png](https://i-blog.csdnimg.cn/blog_migrate/8a15080330963c110edcbc7dff2ded05.png)
…
往模型中加入第t棵树:
![b77d57a3b0845a3cd342c7fc8b3287b2.png](https://i-blog.csdnimg.cn/blog_migrate/da0317977a5e1357d8c791c7be9e22d3.png)
其中f(x)表示第k棵树,yt表示组合t棵树模型对样本Xi的预测结果。
我们知道,每次往模型中加入一棵树,其损失函数便会发生变化。另外在加入第t棵树时,则前面第t-1棵树已经训练完成,此时前面t-1棵树的正则项和训练误差都成已知常数项。对于每棵树的正则项部分,我们将在后面再细说。
![f7cb0bb62e03fda4e12ec884cd0ee15e.png](https://i-blog.csdnimg.cn/blog_migrate/f05b36006d4f5c772aeb57c756a40182.png)
如果损失函数采用均方误差时,其目标损失函数变为:
![be5b014604040587b017acf1528c2163.png](https://i-blog.csdnimg.cn/blog_migrate/e15bbe6f9505e0c5c30dacb017897a07.png)
另外对于目标损失函数中的正则项(复杂度)部分,我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成:
![1376c5df523ccfe73b0f8d4eeed5f422.png](https://i-blog.csdnimg.cn/blog_migrate/02df5f971d7fb0402f50623563787a5b.png)
其中W为叶子节点的得分值,q(x)表示样本X对应的叶子节点。T为该树的叶子节点个数。
因此,在这里。我们将该树的复杂度写成:
![8f9d3b54e394d20c1ad5c1fc5ed72f8d.png](https://i-blog.csdnimg.cn/blog_migrate/c1b63a8da9edf3cb6ec9a9f6df6862e9.png)
复杂度计算例子如下:
![bb62de3626c9bb529c2538254d0add05.png](https://i-blog.csdnimg.cn/blog_migrate/765a3abb672b00a4429d30d97ee9436e.jpeg)
此时,对于XGBoost的目标函数我们可以写为:
![13d100379d60617ec7ca47a6f48058cf.png](https://i-blog.csdnimg.cn/blog_migrate/b97d69d4d4f5c6acf353e54afff9bfce.png)
现在我们只需要找到f(t)来优化上式目标。
![8ff771bd4067624e2e14f6f977738f78.png](https://i-blog.csdnimg.cn/blog_migrate/3f0a63568a5ce9a0a4ba0ee31d845927.jpeg)
在推导之前,我们先介绍下泰勒展开式:
![16aa570cb7cda9c524998fdcc0651104.png](https://i-blog.csdnimg.cn/blog_migrate/46904ba698ca6581541525b604251260.png)
这里我们用泰勒展开式来近似原来的目标函数,将f(t)x(i)看作
![0ae11c3ec9d9a55df2655e84b860c698.png](https://i-blog.csdnimg.cn/blog_migrate/6c435b424a32702250c7d4c1e226986e.png)
令
![a2568d8a6a4c000280758b3023469903.png](https://i-blog.csdnimg.cn/blog_migrate/1ba2e10a88328366f9dc76cd31b9e94f.png)
![a880ecae5364ccef4257848fe458aedd.png](https://i-blog.csdnimg.cn/blog_migrate/675f1498b204d7f05b2fc423e7967e45.png)
同时对于第t棵树时,
![536e8c2605aa94dc6439cb5540b6a5e0.png](https://i-blog.csdnimg.cn/blog_migrate/0b01d3c3131c8ffc2a4964f3d6b70387.png)
为常数。同时去除所有常数项。故目标损失函数可以写成:
![4cc01ba6ac8f2d394c66110bac57cb4b.png](https://i-blog.csdnimg.cn/blog_migrate/20389e14faabd85d609fa0e2ad277ac0.png)
由上面介绍书的复杂度时,我们知道:
![ca9ef4a6d1aa76624e3d2405ab3f72ab.png](https://i-blog.csdnimg.cn/blog_migrate/424b74c9ddd97dfaa554b723988f24f1.png)
同时我们将目标函数全部转换成在第t棵树叶子节点的形式。因为目前对于
![a849aca563f225bd5788da9abca5aab1.png](https://i-blog.csdnimg.cn/blog_migrate/d034fcb1e3ad4544d6cc3de95b9747ad.png)
可以看做是每个样本在第t棵树的叶子节点得分值相关函数的结果之和,所以我们也能从第t棵树的叶子节点上来表示。
![b1d22d9a5498f67fa5d75d9152055fa2.png](https://i-blog.csdnimg.cn/blog_migrate/14accb54fbd02a01e9c787099d65ecfd.png)
上式中,前两行 i=1~n 求和为在样本中遍历,后两行 j = 1~T求和为在叶子节点上遍历,其中T为第t棵树中总叶子节点的个数,
![896ee6da76389b8641fdec57b709306a.png](https://i-blog.csdnimg.cn/blog_migrate/c7ac4e94bfb05eedf0ca01cb0dba1224.png)
表示在第j个叶子节点上的样本,Wj为第j个叶子节点的得分值。
在这里,令
![9bdc29364a93fbab6b079fead5451969.png](https://i-blog.csdnimg.cn/blog_migrate/895df85b45d7c4b69325ab36b576e879.png)
![c4435893c8e84a976cf8251da60ac2bd.png](https://i-blog.csdnimg.cn/blog_migrate/2a897f0a16fb5ca1102deac4e32fc892.png)
则:
![eb06097aca0ca5b65d961f83764d2b1b.png](https://i-blog.csdnimg.cn/blog_migrate/7e4b9d602f7361400bb23a2acd52e914.png)
对Wj求偏导,并使其导函数等于0,则有:
![e8ed514f23693c83b5f2ccf38ca255b6.png](https://i-blog.csdnimg.cn/blog_migrate/21331701f1b43b89b75620dcf936e608.png)
求解得:
![72e941ac9dcb65d97a1fc6bddb52c8d7.png](https://i-blog.csdnimg.cn/blog_migrate/5330d0abe6c4600af3c44b039e3541a2.png)
其目标函数可以为:
![e77920329656f4eece45c5e25d657b8c.png](https://i-blog.csdnimg.cn/blog_migrate/91cb8754972b695876e033c49a8cd48c.png)
根据目标函数,如何分裂样本数据呢
![c0fb20173f88dc2f2d04560368861401.png](https://i-blog.csdnimg.cn/blog_migrate/4336895f092b5b1e9b66f859265f82f5.jpeg)
![adabd7a5f9ef27c36628dc59ca94ca29.png](https://i-blog.csdnimg.cn/blog_migrate/2677bcc9b4e4e433ed4a0ce0b45590b4.jpeg)
文章转载自:https://www.cnblogs.com/zongfa/p/9324684.html