GBDT 与 XGBoost
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的更多相关文章
- 一步一步理解GB、GBDT、xgboost
GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...
- 机器学习总结(一) Adaboost,GBDT和XGboost算法
一: 提升方法概述 提升方法是一种常用的统计学习方法,其实就是将多个弱学习器提升(boost)为一个强学习器的算法.其工作机制是通过一个弱学习算法,从初始训练集中训练出一个弱学习器,再根据弱学习器的表 ...
- 常见算法(logistic回归,随机森林,GBDT和xgboost)
常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...
- Boosting学习笔记(Adboost、GBDT、Xgboost)
转载请注明出处:http://www.cnblogs.com/willnote/p/6801496.html 前言 本文为学习boosting时整理的笔记,全文主要包括以下几个部分: 对集成学习进行了 ...
- GBDT,Adaboosting概念区分 GBDT与xgboost区别
http://blog.csdn.net/w28971023/article/details/8240756 ============================================= ...
- 机器学习(八)—GBDT 与 XGBOOST
RF.GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性. 根据个体学习器的生成方式,目前 ...
- GB、GBDT、XGboost理解
GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...
- 机器学习(四)--- 从gbdt到xgboost
gbdt(又称Gradient Boosted Decision Tree/Grdient Boosted Regression Tree),是一种迭代的决策树算法,该算法由多个决策树组成.它最早见于 ...
- 机器学习-GBDT和XGboost
参考: 陈天奇slides : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf Friedman GBDT 论文: htt ...
- GBDT和XGBOOST算法原理
GBDT 以多分类问题为例介绍GBDT的算法,针对多分类问题,每次迭代都需要生成K个树(K为分类的个数),记为\(F_{mk}(x)\),其中m为迭代次数,k为分类. 针对每个训练样本,使用的损失函数 ...
随机推荐
- Hadoop 2.7.0模拟分布式实验环境搭建[亲测]
实验目的: 本实验通过在PC电脑上同时运行3个虚拟机,一个为master节点,两个slave节点. 搭建环境: 主机:mac os 10.10 OS:CenOS 6.5 虚拟机:VMware ...
- Exchange DSAccess 事件分析
本文介绍了如何使用事件 ID 2080 来帮助诊断 Exchange DSAccess 问题中所包含的信息. 许多朋友经常遇到Active Directory 域和Exchange 服务器通信问题.那 ...
- SQL 事物回滚
转自https://www.cnblogs.com/delphinet/archive/2010/08/17/1801424.html 第一种: declare @iErrorCount ...
- 洛谷 P1588 丢失的牛
题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...
- UVA1610 PartyGame 聚会游戏(细节题)
给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S.输入保证一定有解.长度要尽量短,在此基础上字典序尽量小. 分类谈论,细节挺多的,比如'Z'. 其实直接暴就过了,没分类辣么麻烦 ...
- shell脚本,awk里面的BEGIN讲解。
解释: BEGIN{}这个特殊的pattern最常用的就是 变量赋值. BEGIN这个pattern就是文件没开始读的时候 执行 awk 'BEGIN{FS=":";OFS=&qu ...
- 201621123080 《Java程序设计》第2周学习总结
Week02-Java基本语法与类库 1. 本周学习总结 本周主要学习了java的数据类型.运算符,String类,java的简单输入输出与流程控制. 在做题上对String和数组的理解与区分仍不够深 ...
- Linux下同进程多进程号实时监控
一.需求: Linux上对一个进程名称可能会对应的多个进程号的进程进行监控,如果有多个则输出到一个日志文件. 以上问题针对的是一个定时程序还未运行结束,到下一个时刻程序又运行起来了,避免造成重复调用接 ...
- 标准C++(1)
一.引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 例: int& num; 引用类似于起别名 注 ...
- Centos7系统下安装Docker
1.确定你的Linux系统是Centos7 命令:cat /etc/redhat-release 2.yum安装gcc相关 1.配置好Centos7能上外网. 2.yum -y install gcc ...