04-09 XgBoost算法

目录

  • XgBoost算法
  • 一、XgBoost算法学习目标
  • 二、XgBoost算法详解
    • 2.1 XgBoost算法参数
    • 2.2 XgBoost算法目标函数
    • 2.3 XgBoost算法正则化项
    • 2.4 XgBoost算法最小化目标函数
    • 2.5 XgBoost算法举例
  • 三、XgBoost算法优缺点
    • 3.1 优点
    • 3.2 缺点
  • 四、小结

更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/

XgBoost算法

XgBoost算法(eXtreme Gradient Boosting)属于Boosting系列算法,更多的是基于GBDT算法的一个进阶算法。本文假设XgBoost算法使用的弱学习器为决策树。

一、XgBoost算法学习目标

  1. XgBoost算法目标函数
  2. XgBoost算法正则化项
  3. XgBoost算法最小化目标函数
  4. XgBoost算法优缺点

二、XgBoost算法详解

2.1 XgBoost算法参数

假设我们获取了XgBoost的模型和它的目标函数,现在我们的任务就是最小化目标函数\(J(\theta)\)找到最佳的\(\theta\),但是这个参数是什么呢?XgBoost由一堆CART树组成,因此这个参数很明显存在于每颗CART树中。但是CART树的参数又是什么呢?CART树如果被确定之后,子节点是可以丢掉的,剩下的只有每一个叶子节点以及每一个叶子节点上的分数,这就是CART树的参数即XgBoost的参数,还是不清楚继续往下看。

2.2 XgBoost算法目标函数

通过真实值和预测值以及xboost模型我们能得到一个目标函数,该目标函数假设存在一个\(L\)代价函数和一个正则项\(\sum_{i=1}^t\Omega(f_k)\)(类似于线性回归的L1、L2正则化,之后会详细解释,此处是t棵树的正则化项加和,现在假设我们有t棵树,n个训练样本,既得一个目标函数
\[
J(\theta)=\sum_{i=1}^nL(y_i^t,\hat{y}_i^{(t)}))+\sum_{i=1}^t\Omega(f_i)
\]
如果我们假设\(C\)是t-1棵树的正则化项加和,并且代入XgBoost的模型,得
\[
J(\theta)=\sum_{i=1}^nL(y_i^t,\hat{y}_i^{(t-1)}+f_t(x_i))+\Omega(f_t)+C
\]
泰勒展开式公式为:
\[
f(x+\Delta{x})\approx{f(x)}+f'(x)\Delta{x}+{\frac{1}{2}}f''(x)\Delta{x^2}
\]
假设
\[
\begin{align}
& f(x)=\hat{y}_i^{(t-1)} \& \Delta=f_t(x_i) \& gi=\partial_{\hat{y}_i^{(t-1)}}L(y_i^t,\hat{y}_i^{(t-1)}) \& hi=\partial_{\hat{y}_i^{(t-1)}}^2L(y_i^t,\hat{y}_i^{(t-1)})
\end{align}
\]
在这些假设的基础上,我们假设存在一个代价函数\(L\),我们可以把\(J(\theta)\)泰勒二阶展开:
\[
\begin{align}
J(\theta) & = \sum_{i=1}^nL(y_i^t,\hat{y}_i^{(t)}))+\sum_{i=1}^t\Omega(f_i) \& = \sum_{i=1}^nL(y_i^t,\hat{y}_i^{(t-1)}+f_t(x_i))+\Omega(f_t)+C \& = \sum_{i=1}^n[L(y_i^t,\hat{y}_i^{(t-1)})+g_if_t(x_i)+{\frac{1}{2}}h_if_t^2(x_i)]+\Omega(f_t)+C
\end{align}
\]
其中\(y_i^t\)和\(\hat{y}_i^{(t-1)}\)已知,即\(L(y_i^t,\hat{y}_i^{(t-1)})\)是一个常数项(因为我们假设了这个代价函数\(L\)是已知的一个代价函数,可以是MSE,可以是MSA,可以是任何一个已知的代价函数);\(C\)是前t-1棵树的正则化项加和,也是一个常数,这两个常数项对目标函数求最小值无意义,因此我们可以去掉,既得
\[
J(\theta)=\sum_{i=1}^n[g_if_t(x_i)+{\frac{1}{2}}h_if_t^2(x_i)]+\Omega(f_t)
\]
现在如果我们假设损失函数\(L\)使用的是MSE,那么上述式子会变成
\[
\begin{align}
J(\theta) & = \sum_{i=1}^n(y_i^t-(\hat{y}_i^{(t-1)}+f_t(x_i)))^2+\Omega(f_t)+C \& = \sum_{i=1}^n((y_i^t-\hat{y}_i^{(t-1)})-f_t(x_i))^2+\Omega(f_t)+C \& =\sum_{i=1}^n[(y_i^t-\hat{y}_i^{(t-1)})^2-2(y_i^t-\hat{y}_i^{(t-1)})f_t(x_i)+f_t(x_i)^2]+\Omega(f_t)+C
\end{align}
\]
去掉常数项可以得到
\[
J(\theta)=\sum_{i=1}^n[-2(y_i^t-\hat{y}_i^{(t-1)})f_t(x_i)+f_t(x_i)^2]+\Omega(f_t)
\]
如果你代入验证很明显可以发现我们使用泰勒展开式得到的式子是没有问题的

其实走到这里我们的XgBoost已经算是结束了,是不是忘了我们在做什么,哈哈!我们在做的是通过前t-1棵的预测值加和我们是否能算出第t棵树的最优预测值。

2.3 XgBoost算法正则化项

如线性回归的正则化项一样,你可以使用L1正则化,你也可以使用L2正则化。这里我就讲讲我对XgBoost使用的正则化项。

正则化前我们先对CART树做处理:假设一棵树有T个叶子节点,这T个叶子节点组成了一个T维向量\(w\),而\(q(x)\)是一个映射,用来将样本映射成1到T的某个值,即\(q(x)\)表示了CART树的结构,\(w_q(x)\)表示了这棵树对样本x的预测值
\[
f_t(x)=w_{q(x)},w\in{R^T},a:R^d\rightarrow\{1,2,\cdots,T\}
\]
由此我们可以假设XgBoost的正则化项
\[
\Omega(f_t)=\gamma{T}+{\frac{1}{2}}\lambda\sum_{j=1}^T{w_j^2}
\]
其中\(\gamma\)和\(\lambda\)是我们自定义的一个数(类似线性回归的学习率),如果\(\gamma\)越大,表示希望获得结构简单的树,因为\(\gamma\)越大对叶子节点多的树惩罚更大;\(\lambda\)越大也是如此。

2.4 XgBoost算法最小化目标函数

这个时候我们有了泰勒二阶展开的目标函数,有了自定义的正则化项,我们可以把自定义的正则项代入目标函数中
\[
J(\theta)=\sum_{i=1}^n[g_if_t(x_i)+{\frac{1}{2}}h_if_t^2(x_i)]+\gamma{T}+{\frac{1}{2}}\lambda\sum_{j=1}^T{w_j^2}
\]
代入\(f_t(x)=w_{q(x)}\),得
\[
J(\theta)=\sum_{i=1}^n[g_iw_{q(x_i)}+{\frac{1}{2}}h_i{w_{q(x_i)}^2}]+\gamma{T}+{\frac{1}{2}}\lambda\sum_{j=1}^T{w_j^2}
\]
这个时候我们需要考虑,如果一个叶子节点上难道只会对应一个样本吗?很明显如果样本很多,一个叶子可能会对应多个样本。因此我们用\(I_j\)表示一个叶子节点上的所有样本,即\(\sum_{i\in{I_j}}\)对应一个叶子节点上所有样本的对应值的加和,我们需要计算的就是T个叶子节点上的样本预测值的加和,这也是为什么用\(\sum_{j=1}^T\)开头的原因
\[
\begin{align}
J(\theta) & =\sum_{j=1}^T{[(\sum_{i\in{I_j}}g_i)w_j+{\frac{1}{2}}(\sum_{i\in{I_j}}hi)w_j^2]+\gamma{T}+{\frac{1}{2}}\lambda\sum_{j=1}^T{w_j^2}} \& = \sum_{j=1}^T{[(\sum_{i\in{I_j}}g_i)w_j+{\frac{1}{2}}(\sum_{i\in{I_j}}hi+\lambda)w_j^2]+\gamma{T}}
\end{align}
\]
假设\(G_j=\sum_{i\in{I_j}}g_i,H_j=\sum_{i\in{I_j}}h_i\)
\[
J(\theta)=\sum_{j=1}^T[G_jw_j+{\frac{1}{2}}(H_j+\lambda)w_j^2]+\gamma{T}
\]
通过上式我们可以对目标函数对\(w\)求偏导找到最优\(w^{*}\)为
\[
{\frac{\partial{J(f_t)}}{\partial{w_J}}}=G_j+(H_j+\lambda)w_j==0\Rightarrow{w_j^*}=-{\frac{G_j}{H_j+\lambda}}
\]
回代最优\(w^{*}\)得
\[
J(\theta)^*=-{\frac{1}{2}}\sum_{j=1}^T{\frac{G_j^2}{H_j+\lambda}}+\gamma{T}
\]
因为\(J(\theta)^*\)的推导过程中只和\(G_j\)和\(H_j\)和有关,而它们又只和树的结构\(q(x)\)有关,这表示\(J(\theta)^*\)代表了这颗树的结构有多好,值越小,代表这样的结构越好。

其实聪明的同学已经发现了我们的\(\theta\)这个参数完全可以看成\(f_t\),它表示的是第t颗树的结构,也就可以看成我们的\(\theta\)呀?不是吗?嘻嘻,你仔细思考下。当然\(f_t\)也是我们自己定义的。

2.5 XgBoost算法举例

现在我们假设我们有一家五口的数据,见下表

儿子 妈妈 爸爸 奶奶 爷爷
g1,h1 g2,h2 g3,h3 g4,h4 g5,h5

儿子+妈妈
\[
G_L=g_1+g_2
\]
爸爸+奶奶+爷爷
\[
G_R=g_3+g_4+g_5
\]
\[
J(\theta)^*=-{\frac{1}{2}}\sum_{j=1}^T{\frac{G_j^2}{H_j+\lambda}}+\gamma{T}
\]
如果我们不对这5个样本分开,把数据代入\(J(\theta)\),他们的目标值是
\[
{\frac{1}{2}}{\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}}
\]
如果我们把他们五个人按照年龄排列并从空格列分开,即该决策树会有两个叶子,一个叶子会有儿子+妈妈的分数;另一个叶子会有爸爸+奶奶+爷爷的分数

把数据代入\(J(\theta)\)目标值是
\[
{\frac{1}{2}}[{\frac{G_L^2}{H_L+\lambda}}+{\frac{G_R^2}{H_R+\lambda}}]
\]
由此可以计算Gain值
\[
Gain={\frac{1}{2}}[{\frac{G_L^2}{H_L+\lambda}}+{\frac{G_R^2}{H_R+\lambda}}-{\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}}]+\gamma
\]
总结:该Gain值是单节点的目标值减去切分后的所有节点的目标值,Gain值如果是正的,并且Gain值越大,就越值得切分,然后不断重复上述过程;如果Gain值是负的,表明切分后目标值变大了。而\(\gamma\)在这里控制目标值的下降幅度。Gain值类似于信息增益,并且相比较传统的GBDT,XgBoost使用了二阶泰勒展开,可以更快的在训练集上收敛,虽然XgBoost需要计算每个样本的g和h值,但是XgBoost使用了并行/多核运算,这都不是问题。

三、XgBoost算法优缺点

3.1 优点

  1. 可以使用正则化项等策略防止过拟合
  2. 目标函数优化利用了损失函数关于待求函数的二阶导数,相比较GBDT,迭代速度更快
  3. 支持并行化,训练速度快
  4. 添加了对稀疏数据的处理
  5. 支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本

3.2 缺点

  1. 数据量大时,由于选择划分点需要对特征做预排序,计算开销过大

四、小结

XgBoost算法是GBDT算法的一个提升,他们两者之间的主要区别在于目标函数形式不同。并且XgBoost使用了二阶泰勒展开,使得XgBoost算法收敛速度更快。

原文地址:https://www.cnblogs.com/nickchen121/p/11686743.html

时间: 2024-10-28 15:10:28

04-09 XgBoost算法的相关文章

DBDT的改进之XGBoost算法介绍

主要内容: XGBoost算法的介绍 XGBoost算法的损失函数 XGBoost函数介绍 算法的应用实战——信用卡欺诈行为的识别 1.XGBoost算法的介绍 XGBoost是由传统的GBDT模型发展而来的,GBDT模型在求解最优化问题时应用了一阶导技术,而XGBoost则使用损失函数的一阶和二阶导,而且可以自定义损失函数,只要损失函数可一阶和二阶求导. XGBoost算法相比于GBDT算法还有其他优点,例如支持并行计算,大大提高算法的运行效率:XGBoost在损失函数中加入了正则项,用来控制

机器学习——XGboost算法

XGboost算法 XGBoost是GBDT算法的一种改进,是一种常用的有监督集成学习算法:是一种伸缩性强.便捷的可并行构建模型的GradientBoosting算法. 原理是:在GBDT目标函数的基础上加入惩罚项,如下图绿框.通过限制树模型的叶子节点的个数和叶子节点的值来降低模型复杂度,从而防止过拟合,二分之一是为了求导方便.t是树的棵数,obj为损失函数 大体步骤:防止过拟合,二阶泰勒展开公式计算,给出了新的树的划分标准,用的是损失函数的增量. 目的:找到第t颗树是如何搭建的 所以我们的期望

Ubuntu16.04安装xgboost

1.Python下安装方法 git clone --recursive https://github.com/dmlc/xgboost cd xgboost ake -j4 cd python-package/ sudo python setup.py install 如果在import xgboost后,遇到问题 OSError: /home/common/anaconda2/lib/python2.7/site-packages/scipy/sparse/../../../../libstd

09.19算法第二章上机实践报告

算法第二章上机实践报告 https://edu.cnblogs.com/campus/gdwywm/se1803/homework/7608 1.实践题目 7-3 两个有序序列的中位数 https://pintia.cn/problem-sets/1173827583729741824/problems/1173827629514764290 2.问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A ?0 ?? ,A ?1 ?? ,?,A ?N−1 ?

2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型

2016-04-09  21:10:24     本文原创受版权保护,严禁转载. 请大家不要用于商业用途,支持正版,大家都是做软件的,知道开发一套软件实属不易啊! 今天看到了一个很有趣并且很有用的辅助开发的工具,简单易用,能让创建数据库还有设计数据库的物理模型变得简单. 让本来逻辑性高,抽象不好设计的数据间的关系,变得可视化的.让开发人员快速的创建一些比较大型的,表间关系较为复杂的关系数据库变得更为易于开发和易于理解.废话就不多说了.直接就给大家一点干货带着上路吧!!!!! 壹---安装 首先是

18.04.09 luoguP1021 邮票面值设计

题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到. 例如,N=3,K=2,如果面值分别为1分.4分,则在1分-6分之间的每一个邮资值都能得到(当然还有8分.9分和12分):如果面值分别为1分.3分,则在1分-7分之间的每一个邮资值都能得到.可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值分别为1分.3分. 输入

2019.04.09 电商25 结算功能1

结算功能要获取很多数据, 现在的主要问题是要知道获取对应的商品信息,要知道我选的是哪个的商品信息啊 它们选框的类名都一样啊,能遍历吗?遍历之后要去获取,它父级属性的值 有多少商品就有多少复选框,可以获取的,有几个就几个 var cks = $('.son_check'); $.each(cks,function(index,ck) 和for in 一样的     cks是遍历的数组,index每一个对象的下标,0,1, 2   ck就是对应的对象 判断是否选中就是要判断它的checked属性 i

贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)

克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikipedia上的那个.很清晰且直观. 首先第一步,我们有一张图,有若干点和边 例如以下图所看到的: 第一步我们要做的事情就是将全部的边的长度排序,用排序的结果作为我们选择边的根据.这里再次体现了贪心算法的思想.资源排序,对局部最优的资源进行选择. 排序完毕后,我们领先选择了边AD. 这样我们的图就变成了 第

hadoop+mahout部署及20newsgroups经典算法测试

--------------------------------------------------------------------------第一阶段:hadoop的伪分布式安装 第二阶段:mahout的安装 第三阶段:20newsgroups的bayes算法测试------------------------------------------------------------------------- 注意:安装完vmwaretools必须重启centos才可以生效第一阶段:hado