机器学习相关知识整理系列之三:Boosting算法原理,GBDT&XGBoost
1. Boosting算法基本思路
提升方法思路:对于一个复杂的问题,将多个专家的判断进行适当的综合所得出的判断,要比任何一个专家单独判断好。每一步产生一个弱预测模型(如决策树),并加权累加到总模型中,可以用于回归和分类问题;如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升(Gradient boosting)。
梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数);提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。这种在函数域的梯度提升观点对机器学习的很多领域有深刻影响。
提升的理论意义:如果一个问题存在弱分类器,则可以通过提升的办法得到强分类器。
2. Boosting算法推导
给定输入向量\(X\)和输出变量\(Y\)组成的若干训练样本,\((x_1,y_1),(x_2,y_2),...,(x_n,y_n)\),目标是找到近似函数\(\hat F(\vec x)\),使得损失函数\(L(y,F(\vec x))\)的损失值最小。
\(L(y,F(\vec x))\)的典型定义为:\[L(y,F(\vec x)) = \frac{1}{2}(y-F(\vec x))^2\]
\[L(y,F(\vec x)) = | y-F(\vec x) |\]
假定最优函数为\(F^*(\vec x)\),即:\[F^*(\vec x) = \arg\min_F E_{(x,y)}[L(y,F(\vec x))]\]
假定\(F(\vec x)\)是一族基函数\(f_i(\vec x)\)的加权和:
\[F(\vec x) = \sum_{i=1}^{M}\gamma _if_i(\vec x) + C\]
梯度提升方法寻找最优解\(F(\vec x)\),使得损失函数在训练集上的期望最小。
首先,给定常函数\(F_0(\vec x)\):
\[F_0(\vec x) = \arg\min_c \sum_{i=1}^nL(y_i,c)\]
以贪心思路扩展得到\(F_m(\vec x)\):
\[F_m(\vec x) = F_{m-1}(\vec x) + \arg\min_{f \in H}\sum_{i=1}^nL(y_i,F_{m-1}(\vec x_i) + f(\vec x_i))\]
贪心法每次选择最优基函数\(f\)时仍然困难,使用梯度下降的方法近似计算。将样本带入基函数\(f\)得到\(f(\vec x_1),f(\vec x_2),...,f(\vec x_n)\),从而\(L\)退化为向量\(L(y_1,f(\vec x_1)),L(y_2,f(\vec x_2)),...,L(y_n,f(\vec x_n))\)
\[F_m(\vec x) = F_{m-1}(\vec x) + \gamma_m \sum_{i=1}^n \Delta_fL(y_i,F_{m-1}(\vec x_i))\]
上式中的权值\(\gamma\)为梯度下降的步长,使用线性搜索求最优步长:
\[\gamma_m = \arg\min_\gamma \sum_{i=1}^{n}L(y_i,F_{m-1}(\vec x_i) - \gamma\cdot\Delta_fL(y_i,F_{m-1}(\vec x_i)))\]
步骤如下:
(1)初始给定模型为常数\(F_0(\vec x)\),对于\(m=1\)到\(M\):
(2)计算伪残差:\[\gamma_{im} = \left[\frac{\partial L(y_i,F(\vec x_i))}{\partial F(\vec x_i)}\right]_{F(\vec x) = F_{m-1}(\vec x)},i=1,2,...,n\]
(3)使用数据\(\left\{ (\vec x_i,\gamma_{im})\right\}^n_{i=1}\)计算拟合残差的基函数\(f_m(x)\)
(4)计算步长\[\gamma_m = \arg\min_\gamma \sum_{i=1}^{n}L(y_i,F_{m-1}(\vec x_i) - \gamma\cdot f_m(\vec x_i)))\]
(5)更新模型\[F_m(\vec x) = F_{m-1}(\vec x) - \gamma_m f_m(\vec x_i)\]
3. GBDT算法推导
梯度提升的典型基函数即决策树(尤其是CART),在第\(m\)步的梯度提升是根据伪残差数据计算决策树\(T_m(x)\)。令树\(T_m(x)\)的叶结点数目为\(J\),即树\(T_m(x)\)将输入空间划分为\(J\)个不相交区域\(R_{1m},R_{2m},...,R_{Jm}\),并且决策树\(T_m(x)\)可以在每个区域中给出某个类型的确定性预测。使用指示标记\(I(x)\),对于输入\(x\),\(T_m(x)\)为:
\[T_m(\vec x) = \sum_{j=1}^J b_{jm}I(\vec x \in R_{jm})\]其中,\(b_{jm}\)是样本\(x\)在区域\(R_{jm}\)的预测值(常量)。
使用线性搜索计算学习率,最小化损失函数
\[F_m(\vec x) = F_{m-1}(\vec x) + \gamma_m \cdot T_m(\vec x)\]
\[\gamma_m = \arg\min_\gamma \sum_{i=1}^n L(y_i,F_{m-1}(\vec x_i) + \gamma \cdot T_m(\vec x_i))\]
进一步,对树的每个区域分别计算步长,从而系数\(b_{jm}\)合并到步长,从而:
\[F_m(\vec x) = F_{m-1}(\vec x) + \sum_{j=1}^{J}\gamma_{jm} \cdot I(\vec x \in R_{jm})\]
\[\gamma_{jm} = \arg\min_\gamma \sum_{\vec x_i \in R_{jm}} L(y_i,F_{m-1}(\vec x_i) + \gamma \cdot T_m(\vec x_i))\]
当采用平方误差损失函数时,\(L(y,f(\vec x)) = (y-f(\vec x))^2\),其损失变为:
\[L\left(y, f_{m-1}(\vec x) + \gamma_m \cdot T_m(\vec x)\right) = \left[y-f_{m-1}(\vec x) - \gamma_m T_m(\vec x)\right] ^2 = \left[ r - \gamma_mT_m(\vec x)\right]^2\]
这里,\(r = y- f_m(\vec x)\)。所以,对回归问题的提升树算法来说,只需要简单的拟合当前模型的残差。
4. XGBoost算法推导
目标函数:
\[J(f_t) = \sum_{i=1}^nL(y_i, \hat y_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) + C\]
根据Taylor展开式:\(f(x+ \Delta x) \approx f(x) + f^\prime(x) \Delta x + \frac{1}{2}f^{\prime\prime}(x)\Delta x^2\),令\[g_i= \frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}, h_i = \frac{\partial^2 L(y_i,\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}\]
则:\[J(f_t) \approx \sum_{i=1}^n \left[L(y_i, \hat y_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2}h_if_i^2(x_i)\right] + \Omega(f_t) + C\]
假定某决策树的叶结点数目为\(T\),每个叶结点的权值为\(\vec w = (w_1,w_2...w_T)\)。决策树的学习过程,就是构造如何使用特征得到划分,从而得到这些权值的过程。样本\(x\)落在叶结点\(q\)中,定义\(f\)为:\(f_t(x) = w_{q(x)}\)。
正则项,决策树的复杂度可考虑叶结点树和叶权值:\(\Omega(f_t) = \gamma^ {T_t} + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\),其中\(T_t\)为叶结点数,\(w_j\)为\(j\)叶子结点权重。
目标函数计算:\[J(f_t) \approx \sum_{i=1}^n \left[L(y_i, \hat y_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2}h_if_i^2(x_i)\right] + \Omega(f_t) + C\]
\[= \sum_{i=1}^n \left[g_if_t(x_i) + \frac{1}{2}h_if_i^2(x_i)\right] + \Omega(f_t) + C\]
\[= \sum_{i=1}^n \left[g_i w_{q(x_i)} + \frac{1}{2}h_i w_{q(x_i)}^2\right] + \gamma^ {T_t} + \frac{1}{2}\lambda \sum_{j=1}^{T_t} w_j^2 + C\]
\[=\sum_{j=1}^{T_t} \left[(\sum_{i \in I_j}g_i)w_j + \frac{1}{2}(\sum_{i \in I_j}h_i)w_j^2\right] +\gamma^ {T_t} + \frac{1}{2}\lambda \sum_{j=1}^{T_t} w_j^2 + C\]
\[=\sum_{j=1}^{T_t} \left[(\sum_{i \in I_j}g_i)w_j + \frac{1}{2}(\sum_{i \in I_j}h_i + \lambda)w_j^2\right] +\gamma^ {T_t} + C\]
定义:\[G_j = \sum_{i \in I_j}g_i, H_j = \sum_{i \in I_j}h_i\]
从而,\[J(f_t) =\sum_{j=1}^{T_t} \left[G_jw_j + \frac{1}{2}(H_i + \lambda)w_j^2\right] +\gamma^ {T_t} + C\]
对\(w\)求偏导,得:\[\frac{\partial J(f_t)}{\partial w_j} = G_j + (H_j + \lambda) w_j\]令偏导等于0,得到:\[w_j = - \frac {G_j}{H_j + \lambda}\]
代回目标函数,得\[J(f_t) = -\frac{1}{2} \sum_{j=1}^{T_t}\frac{G_j^2}{H_j+\lambda} + \gamma^{T_t}\]
构造决策树的结构:
- 对于某可行划分,计算划分后的\(J(f)\);
- 对于所有可行划分,选择\(J(f)\)降低最小的分割点。
5. AdaBoost算法推导
假设给定一个二类分类的训练数据集\(T = {(x_1,y_1),(x_2,y_2),...(x_n,y_n)}\) 。
初始化训练数据集的权值分布\(D_1 = (w_{11},w_{12},...,w_{1i},...,w_{1N}) ,w_{1i} = \frac{1}{N}, i=1,2,...,N\)
对于\(m=1,2,...,M\):
(1)使用具有权值分布\(D_m\)的训练数据集学习,得到基本分类器:\(G_m(x): \chi \to \{-1,1\}\)
(2)计算\(G_m(x)\)在训练数据集上的分类误差率:\(e_m = P(G_m(x) \ne y_i) = \sum_{i=1}^N w_{mi}I(G_m(x) \ne y_i)\)
(3)计算\(G_m(x)\)的系数:\(\alpha_m = \frac{1}{2}\log\frac{1-e_m}{e_m}\),底取自然对数。
(4)更新训练数据集的权值分布:\[D_{m+1} = (w_{m+1,1},w_{m+1,2},...,w_{m+1,i},...,w_{m+1,N})\]
\[w_{m+1,i} = \frac{w_{mi}}{Z_m} \exp(-\alpha_my_iG_m(x_i)), i=1,2,...,N\]这里\(Z_m\)是规范化因子,\(Z_m = \sum_{i=1}^N w_{mi}\exp(-\alpha_my_iG_m(x_i))\),它使\(D_{m+1}\)成为一个概率分布。
(5)构建基本分类器的线性组合:$f(x) = \sum_{m=1}^{M} \alpha_m G_m(x) $,得到最终分类器:
\[G(x) = sign(f(x)) = sign( \sum_{m=1}^{M} \alpha_m G_m(x) )\]
说明:计算基本分类器的\(G_{m}{(x)}\)的系数\(\alpha_m\),\(\alpha_m\)表示\(G_{m}{(x)}\)在最终分类器中的重要性。当\(e_m \leq \frac{1}{2}\)时,\(\alpha_m \geq 0\)。并且\(\alpha_m\)随着\(e_m\)的减小而增大,所以分类误差率越小的基本分类器在最终分类器中的作用越大。所有的\(\alpha_m\)之和并不为1。.
机器学习相关知识整理系列之三:Boosting算法原理,GBDT&XGBoost的更多相关文章
- 机器学习相关知识整理系列之一:决策树算法原理及剪枝(ID3,C4.5,CART)
决策树是一种基本的分类与回归方法.分类决策树是一种描述对实例进行分类的树形结构,决策树由结点和有向边组成.结点由两种类型,内部结点表示一个特征或属性,叶结点表示一个类. 1. 基础知识 熵 在信息学和 ...
- 机器学习相关知识整理系列之二:Bagging及随机森林
1. Bagging的策略 从样本集中重采样(有放回)选出\(n\)个样本,定义子样本集为\(D\): 基于子样本集\(D\),所有属性上建立分类器,(ID3,C4.5,CART,SVM等): 重复以 ...
- Hadoop相关知识整理系列之一:HBase基本架构及原理
1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...
- Redis相关知识整理
Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在 ...
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译 ...
- podSpec文件相关知识整理
上一篇文章整理了我用SVN创建私有库的过程,本文将整理一下有关podSpec文件的相关知识. podSpec中spec的全称是“Specification”,说明书的意思.顾名思义,这是用来描述你这个 ...
- [Cxf] cxf 相关知识整理
① 请求方式为GET @GET @Path(value = "/userAddressManage") @Produces( { MediaType.APPLICATION_JSO ...
- Golang(十)TLS 相关知识(一)基本概念原理
0. 前言 最近参与一个基于 BitTorrent 协议的 Docker 镜像分发加速插件的开发,主要参与补充 https 协议 学习了 TLS 相关知识,下面对之前的学习做一下简单总结 参考文献:T ...
- JVM的相关知识整理和学习--(转载)
JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理.冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操 ...
随机推荐
- python 循环内部添加多个条件判断会出现越界
1.循环遍历数组是,想添加条件修改时,只删除第一个 # -*- coding: utf-8 -*- a=[11,22,33,44,55] for i in a: if i == 11 or i ==2 ...
- 安装onlyoffice document server
1. 安装docker apt install docker.io 2. 安装和启动onlyoffice sudo docker run -i -t -d -p 80:80 onlyoffice/do ...
- RMI 连接超时时间设定
System.setProperty("sun.rmi.transport.tcp.responseTimeout", "2000"); System.setP ...
- C#调用python脚本
因项目需要,需要使用C#控制台程序执行python脚本,查询各种资料后可以成功调用了,记录一下,以备后面遗忘. 只尝试了两种调用方式,第一种只适用于python脚本中不包含第三方模块的情况,第二种针对 ...
- C# winform中 选择文件和保存文件
转载自https://blog.csdn.net/qq_31788297/article/details/62047952 我们在使用桌面软件的时候经常会使用到选择文件并打开和另存为等的窗口,这样方便 ...
- 误: Apache shutdown unexpectedly解决办法
from:http://www.wopus.org/wordpress-basic/getting-started/2536.htmlXAMPP错 2015年10月20日15:58:19 新手上路发 ...
- HDOJ 5044 Tree
树链剖分裸题. . .. 又要扩栈又要输入挂还卡格式....真无语 Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 6553 ...
- ADO.NET详细学习笔记《一》
目录 ADO.NET和ADO的区别 ADO.NET的五大核心对象 Connection对象 Command对象 DataAdapter对象,DataSet对象 DataReader对象 [1]ADO. ...
- 巨蟒python全栈开发数据库前端9:bootstrap
1.bootstrap的主网站: http://www.bootcss.com/ (1)bootstrap的CSS样式 (2)bootstrap组件 (3)JavaScript插件 (4)阿里图标库的 ...
- 常用代码块:java使用剪贴板复制文本
// 获得系统剪切板 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); // 复制到剪切板上 String ...