GBDT & XGBoost

### 回归树

单棵回归树可以表示成如下的数学形式
\[
f(x) = \sum_j^Tw_j\mathbf{I}(x\in R_j)
\]
其中\(T\)为叶节点的个数,\(\mathbf{I}\)为指示函数。

回归树的参数学习

当给定树的结构的时候,即知道哪些点划分到哪些叶节点后,可以直接优化下式来获得参数
\[
\hat{R}(f) = \dfrac{1}{n}\sum_{i=1}^nL\left(y_i, \sum_{j=1}^Tw_j\mathbf{I}(x_i\in R_j)\right)
\]

又有划分的区域是不相交的,所以可以最小化每个区域的损失来求得每个区域\(R_j\)对应的参数\(w_j\)。

回归树的结构学习

上面给出了回归树的结构化损失函数
\[
\hat{R}(\hat{f}) = \sum_j^T\sum_{i\in I_j}L(y_i,\hat{w}_j)=\sum_j^T\hat{L}_J
\]
假设现在要对节点\(k\)进行分裂,那么有分裂之前的经验损失为
\[
\hat{R}(\hat{f}_{before}) = \hat{L}_k+\sum_{j\not= k}\hat{L}_j
\]
分裂之后的经验损失为
\[
\hat{R}(\hat{f}_{after})=\hat{L}_L + \hat{L}_R+\sum_{j\not= k}\hat{L}_j
\]
我们用增益来评价分裂的好坏,其计算如下
\[
Gain = \hat{R}(\hat{f}_{before}) - \hat{R}(\hat{f}_{after}) = \hat{L}_k - (\hat{L}_L + \hat{L}_R)
\]
上式本质上是比较划分之后相较于划分前,经验损失可以下降多少。也就是说下降得越多就越好,于是使得上式值最大的划分将会被采纳。


boosting 算法

boosting算法的基本形式如下
\[
f(x) = \sum_{m=0}^Mf_m(x)
\]
就是将多个弱学习器(基学习器)通过相加进行组合。可以写成如下的自适应形式
\[
f(x) = \theta_0 + \sum_{m=1}^M\theta_m\phi_m(x)
\]
boosting 算法的学习过程是串行的,不断去拟合残差。所以,在任意的第\(m\)步,其所需要优化和学习的东西可以表示成下式
\[
\{\hat{\theta}_m, \hat{\phi}_m\}=\arg\min_{\{\theta_m, \phi_m\}}\sum_{i=1}^nL\left(y_i,\hat{f}^{(m-1)}(x_i) + \theta_m\phi_m(x_i)\right)
\]


GBDT

GBDT中选取的弱学习器是回归树,增加树的目的纯粹是为了减少经验损失,所以会有
\[
\sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i)) \ge \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i) + \theta_m\phi_m(x_i))
\]
为了使得上式成立,我们寻找得到的新的树\(\phi_m(x_i)\)必须是在\(L(y_i,\hat{f}^{(m-1)}(x_i))\)的负梯度方向,设\(L(y_i, \hat{f}^{(m-1)}(x_i))\)的负梯度为\(-\hat{g}_m(x_i)\),那么让新加入的弱学习器直接去拟合\(-\hat{g}_m\)即可,于是可得到基学习器的学习公式为
\[
\hat{\phi}_m = \arg\min_{\phi\in\Phi}\dfrac{1}{2}\sum_{i=1}^n[-\hat{g}_m-\phi(x_i)]^2
\]

然后使用线性搜,得到
\[
\hat{\rho}_m = \arg\min_\rho \sum_{i=1}^nL(y_i, \hat{f}_m^{(m-1)}(x_i)+\rho\hat{\phi}_m(x_i))
\]

最终得到
\[
\hat{f}^{m}(x) = \eta\hat{\rho}_m\hat{\phi}_m(x) + \hat{f}^{(m-1)}(x)
\]

下面介绍下如何优化损失函数得到\(\hat{\phi}_m(x)\)
\[
\begin{split}
J_m(\theta_m) &= \dfrac{1}{2}\sum_{i=1}^n[-\hat{g}_m-\phi_m(x_i)]^2\\
&= \dfrac{1}{2}\sum_{i=1}^n\hat{g}_m^2(x_i) + \phi_m^2(x_i) + 2\hat{g}_m(x_i)\phi_m(x_i)\\
&= \dfrac{1}{2}\sum_{i=1}^n\sum_{j=1}^Tw_{jm}^2I(x_i\in R_{jm}) + 2\hat{g}_m(x_i)w_{jm}I(x_i\in R_{jm}) + constant\\
&= \dfrac{1}{2}\sum_{j=1}^T\sum_{i\in I_{jm}}w_{jm}^2 + 2\hat{g}_m(x_i)w_{jm} + constant\\
&= \sum_{j=1}^T\dfrac{1}{2}n_{jm}w_{jm}^2+G_{jm}w_{jm} + constant
\end{split}
\]
其中\(n_{jm}\)为第\(j\)个节点的样本数量。对\(w_{jm}\)进行求导并使得导函数为0,解得
\[
\hat{w}_{jm} = -\dfrac{G_{jm}}{n_{jm}}
\]
回代得到

\[
\hat{J}_m(\hat{\theta}) = -\dfrac{1}{2}\sum_{j=1}^T\dfrac{G_{jm}^2}{n_{jm}}
\]

那么有分裂时的信息增益为
\[
Gain = \dfrac{1}{2}\left[\dfrac{G_L^2}{n_L} + \dfrac{G_R^2}{n_R} - \dfrac{G_{jm}^2}{n_{jm}}\right]
\]


XGBoost

XGBoost与GBDT根本不同在于XGBoost使用了损失函数的泰勒二阶展开。同上,我们有

\[
J_m(\theta_m) = \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i) + \phi_m(x_i))
\]
对其进行泰勒二阶展开,于是有
\[
J_m(\theta_m) = \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i)) + \hat{g}_m(x_i)\phi_m(x_i) + \dfrac{1}{2}\hat{h}_m(x_i)\phi_m(x_i)^2
\]
其中
\[
\begin{split}
\hat{g}_m(x_i) &= \left[\dfrac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=\hat{f}^{(m-1)}(x)}\\
\hat{h}_m(x_i) &= \left[\dfrac{\partial^2 L(y_i,f(x_i))}{\partial f(x_i)^2}\right]_{f(x)=\hat{f}^{(m-1)}(x)}\\
\end{split}
\]

于是有
\[
\begin{split}
J_m(\theta_m) &= \sum_{i=1}^n\left[\hat{g}_m\phi_m(x_i) + \dfrac{1}{2}\hat{h}_m(x_i)\phi_m(x_i)^2\right] + constant\\
&= \sum_{i=1}^n\left[\hat{g}_m(x_i)\sum_{j=1}^Tw_{jm}I(x_i\in R_{jm}) + \dfrac{1}{2}\hat{h}_m(x_i)\sum_{j=1}^Tw_{jm}^2I(x_i\in R_{jm})\right] + constant\\
&= \sum_{j=1}^T\sum_{i\in I_{jm}}[\hat{g}_m(x_i)w_{jm} + \dfrac{1}{2}\hat{h}_m(x_i)w_{jm}^2] + constant\\
&= \sum_{j=1}^T[G_{jm}w_{jm} + \dfrac{1}{2}H_{jm}w_{jm}^2] + constant
\end{split}
\]
上式对\(w_{jm}\)求导,使其等于0,得到
\[
\hat{w}_{jm} = -\dfrac{G_{jm}}{H_{jm}}
\]

回代得到
\[
\hat{J}_m(\hat{\theta}) = -\dfrac{1}{2}\sum_{j=1}^T\dfrac{G_{jm}^2}{H_{jm}}
\]
那么有分裂时的信息增益为
\[
Gain = \dfrac{1}{2}\left[\dfrac{G_L^2}{H_L} + \dfrac{G_R^2}{H_R} - \dfrac{G_{jm}^2}{H_{jm}}\right]
\]

上面的操作可以得到
\[
\hat{f}^{(m)}(x) = \hat{f}^{(m-1)}(x) + \eta\sum_{j=1}^T\hat{w}_{jm}I(x\in R_{jm})
\]

GBDT 与 XGBoost的更多相关文章

  1. 一步一步理解GB、GBDT、xgboost

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  2. 机器学习总结(一) Adaboost,GBDT和XGboost算法

    一: 提升方法概述 提升方法是一种常用的统计学习方法,其实就是将多个弱学习器提升(boost)为一个强学习器的算法.其工作机制是通过一个弱学习算法,从初始训练集中训练出一个弱学习器,再根据弱学习器的表 ...

  3. 常见算法(logistic回归,随机森林,GBDT和xgboost)

    常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...

  4. Boosting学习笔记(Adboost、GBDT、Xgboost)

    转载请注明出处:http://www.cnblogs.com/willnote/p/6801496.html 前言 本文为学习boosting时整理的笔记,全文主要包括以下几个部分: 对集成学习进行了 ...

  5. GBDT,Adaboosting概念区分 GBDT与xgboost区别

    http://blog.csdn.net/w28971023/article/details/8240756 ============================================= ...

  6. 机器学习(八)—GBDT 与 XGBOOST

    RF.GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性.  根据个体学习器的生成方式,目前 ...

  7. GB、GBDT、XGboost理解

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  8. 机器学习(四)--- 从gbdt到xgboost

    gbdt(又称Gradient Boosted Decision Tree/Grdient Boosted Regression Tree),是一种迭代的决策树算法,该算法由多个决策树组成.它最早见于 ...

  9. 机器学习-GBDT和XGboost

    参考: 陈天奇slides :   https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf Friedman GBDT 论文:  htt ...

  10. GBDT和XGBOOST算法原理

    GBDT 以多分类问题为例介绍GBDT的算法,针对多分类问题,每次迭代都需要生成K个树(K为分类的个数),记为\(F_{mk}(x)\),其中m为迭代次数,k为分类. 针对每个训练样本,使用的损失函数 ...

随机推荐

  1. java面试题(杨晓峰)---第七讲谈谈int和integer有什么区别?

    理解装箱和拆箱的过程. 对象由三部分组成:对象头,对象实例,对齐填充. 对象头:一般是十六个字节,分两部分,第一部分:哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等,第二部分是类型指针 ...

  2. OpenLayers 3 的 图层控制控件

    openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...

  3. UVA12897 - Decoding Baby Boos

    没必要每次都真的修改一遍字母值,用一个标记表示字母最后的值,最后一遍的时候再进行修改 #include<cstdio> #include<cstring> +; char st ...

  4. Android(java)学习笔记119:BroadcastReceiver之 短信发送的广播接收者

    有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和  activity_main. ...

  5. 批量格式化json

    单个文件格式化工具: vscode和sublime都有格式化json的插件. 但是笔者遇到的情况是有几百个文件需要格式化,不可能每个文件都打开,进行分别格式化. 于是写了一个python脚本,非常强大 ...

  6. 2018.4.6 java交易记录系统

    题目 ###1.交易明细文件内容如下例: 客户号 姓名 所述机构号 性别 帐号 发生时间 发生额 000001|刘德华|0000|1|4155990188888888|20060720200005|3 ...

  7. Spark集锦

    1 Spark官网  http://spark.apache.org/ 2 Spark书籍 http://down.51cto.com/tag-spark%E4%B9%A6%E7%B1%8D.html

  8. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  9. RuntimeError: cryptography is required for sha256_password or caching_sha2_p

    报错原因:mysql版本身份验证出现问题引起的 我这里报错的地方是在Django里,pycharm连接数据库时出现的 解决办法,安装安装cryptography即可:pip install crypt ...

  10. ASP.NET WebApi 路由配置

    ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们的请求最终将定 ...