首先什么是boosting

boosting是一种将弱分类器组合成强分类器的过程

  • 构造一个强分类器很难
  • 构造弱分类器不难
  • 弱分类器的要求:强于随机猜测 (很浅的CART树即可)

用数学公式表示即:

f ( x ) = ∑ m = 1 M α m Φ m ( x ) f(x)=\sum_{m=1}^{M} {α_m{Φ_m(x)}} f(x)=∑m=1M​αm​Φm​(x)

其中: Φ m ( x ) {Φ_m(x)} Φm​(x)为每个弱分类器 (不同boost方法在 α m α_m αm​选择不一样)

AdaBoost

一般用于二分类,改进后可用于多分类

每次往强分类器中塞一个弱分类器,并给它相应话语权 α m α_m αm​,再检查是否达到收敛

算法过程:
  • 假设训练集有 N N N个样本: ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) (x_1,y_1),(x_2,y_2),...,(x_N,y_N) (x1​,y1​),(x2​,y2​),...,(xN​,yN​)对应标签为 y i ∈ ( 1 , − 1 ) y_i∈(1,-1) yi​∈(1,−1),
  • 初试给定每个样本的权重为 w 1 , i = 1 N w_{1,i}=\frac{1}{N} w1,i​=N1​
  • 对 m = 1 : M m=1:M m=1:M
      - 对有权重 w m , i w_{m,i} wm,i​的数据得到一个最优的弱分类器 Φ m ( x ) {Φ_m(x)} Φm​(x) (这个最优可以是引入权重的loss 或者 使得误差 ε m ε_m εm​最小)
      - 计算该弱分类器在 w m w_{m} wm​的误差: ε m = ∑ i = 1 N w m , i I ( Φ m ( x ) ! = y i ) ε_m=\sum_{i=1}^{N} {w_{m,i}I({Φ_m(x)}}!=y_i) εm​=∑i=1N​wm,i​I(Φm​(x)!=yi​)
      - 根据误差计算当前弱分类器的权重: α m = 1 2 l o g 1 − ε m ε m α_m=\frac{1}{2}log\frac{1-ε_m}{ε_m} αm​=21​logεm​1−εm​​ (可以看出误差越小,当前弱分类器组合的权重越大)
      - 更新训练数据的权重分布: w m + 1 , i = w m , i e x p ( − α m y i Φ m ( x i ) ) Z m w_{m+1,i}=\frac{w_{m,i}exp(-α_my_iΦ_m(x_i))}{Z_m} wm+1,i​=Zm​wm,i​exp(−αm​yi​Φm​(xi​))​ (其中 Z m Z_m Zm​为所有数据 w m , i e x p ( − α m y i Φ m ( x i ) ) w_{m,i}exp(-α_my_iΦ_m(x_i)) wm,i​exp(−αm​yi​Φm​(xi​))之和,可以看出当分类错误时, − y i Φ m ( x i ) -y_iΦ_m(x_i) −yi​Φm​(xi​)为正,分子会较大,即给了该分错数据更大的权重)
      - 最后将第m步的弱分类器组合进强分类器: Φ ( x ) = ∑ m = 1 M α m Φ m ( x ) Φ(x)=\sum_{m=1}^{M} {α_m{Φ_m(x)}} Φ(x)=∑m=1M​αm​Φm​(x)
  • 再取sign函数得强分类器: f ( x ) = s i g n ( ∑ m = 1 M α m Φ m ( x ) ) f(x)=sign(\sum_{m=1}^{M} {α_m{Φ_m(x)}}) f(x)=sign(∑m=1M​αm​Φm​(x))
    每次检验 f ( x ) f(x) f(x)是否达到收敛条件,或者迭代次数是否达到上限。(取sign函数只在检验是否收敛时有用)
  • 满足则停止算法

实例:https://blog.csdn.net/guyuealian/article/details/70995333
推导(建议熟悉):https://zhuanlan.zhihu.com/p/62037189 (给出了公式得来由&指数损失)
另外还有西瓜书可以看。

Gradient Boosting

一般用于回归任务,设定阈值后也可用于回归任务

根据梯度下降的启发,把学习器器 f ( x ) f(x) f(x)当作一个整体进行求导

思路:
  • 首先梯度下降为: θ = θ − α ∂ L ( θ ) ∂ θ θ=θ-α\frac{∂L(θ)}{∂θ} θ=θ−α∂θ∂L(θ)​
  • 我们看boosting的学习器更新公式: f m ( x ) = f m − 1 ( x ) + β m Φ m ( x ) f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}} fm​(x)=fm−1​(x)+βm​Φm​(x)其中 Φ m Φ_m Φm​为当前弱学习器,可以看出两者存在形式上的一致性。
  • 当把 f m − 1 ( x ) f_{m-1}(x) fm−1​(x)当作参数,由梯度下降得到
    f m ( x ) = f m − 1 ( x ) − β m ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) f_m(x)=f_{m-1}(x)-β_m\frac{∂L(y,f_{m-1}(x))}{∂f_{m-1}(x)} fm​(x)=fm−1​(x)−βm​∂fm−1​(x)∂L(y,fm−1​(x))​
    对比学习器更新公式,我们可以让 Φ m ( x ) Φ_m(x) Φm​(x)尽量接近 − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) -\frac{∂L(y,f_{m-1}(x))}{∂f_{m-1}(x)} −∂fm−1​(x)∂L(y,fm−1​(x))​,即直观理解为在函数空间的梯度下降方法。
算法过程
  • 假设训练集有 N N N个样本: ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) (x_1,y_1),(x_2,y_2),...,(x_N,y_N) (x1​,y1​),(x2​,y2​),...,(xN​,yN​)对应为回归任务
  • 初试化一个弱学习器(回归树等) f 0 ( x ) = 0 f_0(x)=0 f0​(x)=0其中 w w w为对应弱学习器的参数。
  • 对 m = 1 : M m=1:M m=1:M
      - 计算负梯度 y i ′ = − ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) , i = 1 , 2 , . . . , N y_{i}^{'}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}, i=1,2,...,N yi′​=−∂fm−1​(xi​)∂L(yi​,fm−1​(xi​))​,i=1,2,...,N

    - 用 Φ m ( x ) Φ_m(x) Φm​(x)来拟合 ( x i , y i ′ ) (x_i,y_{i}^{'}) (xi​,yi′​), w m = a r g   min ⁡ w ∑ i = 1 N L 弱 学 习 器 ( y i ′ , Φ m ( x i ; w ) ) w_m=arg\,\min_{w}\sum_{i=1}^{N}L_{弱学习器}(y_{i}^{'},Φ_m(x_i;w)) wm​=argwmin​i=1∑N​L弱学习器​(yi′​,Φm​(xi​;w))    最小化弱学习器的 L L L,得到此轮的弱分类器 Φ m ( x ) Φ_m(x) Φm​(x)

     - 确定 Φ m Φ_m Φm​后,之后就要确定 β m β_m βm​(求导令为0或更高效的) β m = a r g   min ⁡ β m ∑ i = 1 N L ( y i ′ , f m − 1 ( x ) + β m Φ m ( x i ; w m ) ) β_m=arg\,\min_{β_m}\sum_{i=1}^{N}L(y_{i}^{'},f_{m-1}(x)+β_mΦ_m(x_i;w_m)) βm​=argβm​min​i=1∑N​L(yi′​,fm−1​(x)+βm​Φm​(xi​;wm​))
     - 最后将第m步的弱学习器组合进强学习器: f m ( x ) = f m − 1 ( x ) + β m Φ m ( x ) f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}} fm​(x)=fm−1​(x)+βm​Φm​(x)

  • 每次检验 f ( x ) f(x) f(x)是否达到收敛条件,或者迭代次数是否达到上限。
  • 满足则停止算法

我们其实能在很多时候,发现 Φ m ( x ) Φ_m(x) Φm​(x)要拟合的是 ( x i , y m − 1 , i − Φ m ( x i ; w ) ) (x_i,y_{m-1,i}-Φ_m(x_i;w)) (xi​,ym−1,i​−Φm​(xi​;w)),那是因为当 L ( y i ′ , Φ m ( x i ; w ) L(y_{i}^{'},Φ_m(x_i;w) L(yi′​,Φm​(xi​;w)中loss函数取MSEloss时,对其求导并加符号就是 y m − 1 , i − Φ m ( x i ; w ) y_{m-1,i}-Φ_m(x_i;w) ym−1,i​−Φm​(xi​;w)

自此GB的思想讲完了,那GBDT是什么呢?

GBDT

顾名思义GBDT = GB + DT,即将弱学习器固定为决策树(CART回归树)的GB算法

算法过程
  • 假设训练集有 N N N个样本: ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) (x_1,y_1),(x_2,y_2),...,(x_N,y_N) (x1​,y1​),(x2​,y2​),...,(xN​,yN​)对应为回归任务
  • 初试化一个弱学习器(CART回归树等) f 0 ( x ) = 0 f_0(x)=0 f0​(x)=0其中 w w w为对应弱学习器的参数。
  • 对 m = 1 : M m=1:M m=1:M
      - 计算负梯度 y i ′ = − ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) , i = 1 , 2 , . . . , N y_{i}^{'}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}, i=1,2,...,N yi′​=−∂fm−1​(xi​)∂L(yi​,fm−1​(xi​))​,i=1,2,...,N

    - 用 Φ m ( x ) Φ_m(x) Φm​(x)来拟合 ( x i , y i ′ ) (x_i,y_{i}^{'}) (xi​,yi′​), w m = a r g   min ⁡ w ∑ i = 1 N ( y i ′ − Φ m ( x i ; w ) ) 2 w_m=arg\,\min_{w}\sum_{i=1}^{N}(y_{i}^{'}-Φ_m(x_i;w))^{2} wm​=argwmin​i=1∑N​(yi′​−Φm​(xi​;w))2    最小化第m棵树的MSELoss,得到此轮的弱分类器 Φ m ( x ) Φ_m(x) Φm​(x)

     - 确定 Φ m Φ_m Φm​后,通过一维线搜索确定 β m β_m βm​ β m = a r g   min ⁡ β m ∑ i = 1 N L ( y i ′ , f m − 1 ( x ) + β m Φ m ( x i ; w m ) ) β_m=arg\,\min_{β_m}\sum_{i=1}^{N}L(y_{i}^{'},f_{m-1}(x)+β_mΦ_m(x_i;w_m)) βm​=argβm​min​i=1∑N​L(yi′​,fm−1​(x)+βm​Φm​(xi​;wm​))
     - 最后将第m步的弱学习器组合进强学习器: f m ( x ) = f m − 1 ( x ) + β m Φ m ( x ) f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}} fm​(x)=fm−1​(x)+βm​Φm​(x)

  • 每次检验 f ( x ) f(x) f(x)是否达到收敛条件,或者迭代次数是否达到上限。
  • 满足则停止算法

XGBoost

XGBoost是一种比较特殊的GB方法,引入了二阶导的信息,并加入了正则项的约束

理论推导网上大把,无非几点:

  • 目标函数增加正则项 Ω ( f t ) Ω(f_{t}) Ω(ft​)
  • 将式子通过泰勒公式展开到二阶导部分
  • 将对所有样本的遍历变成对所有叶子节点的遍历,这样可以将每个叶子的值/一阶导/二阶导都用一个很优美的式子结合。最终得到目标函数的形式
  • 最后叶子节点的w值为目标函数对w求导,令其为0的w值,使目标函数最小
与GBDT比较
  • XGBoost引入了二阶导信息,并且不需要进行线搜,仅仅靠叶节点分裂得到树(复杂的推导保证了分裂的同时是沿着二阶+一阶导方向使loss降低);GBDT只使用了一阶导,并且需要进行线搜。
  • XGBoost对目标函数做了正则化;GBDT没有
算法实现

https://blog.csdn.net/qq_22238533/article/details/79477547

目标函数为 O b j = ∑ i = 1 N L ( y i , y i p r e d ) + ∑ i = 1 K Ω ( f ( x ) ) Obj=\sum_{i=1}^{N}L(y_i,y_i^{pred})+\sum_{i=1}^{K}Ω(f(x)) Obj=∑i=1N​L(yi​,yipred​)+∑i=1K​Ω(f(x))

  • 假设训练集有 N N N个样本: ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) (x_1,y_1),(x_2,y_2),...,(x_N,y_N) (x1​,y1​),(x2​,y2​),...,(xN​,yN​)对应为回归任务
  • 初试化一个弱学习器(回归树等) f 0 ( x ) = 0 f_0(x)=0 f0​(x)=0其中 w w w为对应弱学习器的参数。
  • 对 m = 1 : M m=1:M m=1:M
      - 计算目标函数种 L L L部分的一阶导 g i = − ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) g_{i}^{}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)} gi​=−∂fm−1​(xi​)∂L(yi​,fm−1​(xi​))​和二阶导 h i = − ∂ 2 L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) h_{i}^{}=-\frac{∂^{2}L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)} hi​=−∂fm−1​(xi​)∂2L(yi​,fm−1​(xi​))​, 其中 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N

    - 用 Φ m ( x ) Φ_m(x) Φm​(x)来拟合 ( x i , y i − f m − 1 ( x i ) ) (x_i,y_i-f_{m-1}(x_i)) (xi​,yi​−fm−1​(xi​)),拟合的过程其实就是XGBoost节点分裂的过程,使得目标函数最小。是否根据某属性划分的依据 G a i n Gain Gain:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H R + H L + λ ] − γ Gain=\frac{1}{2}[\frac{G_L^2}{H_L+λ}+\frac{G_R^2}{H_R+λ}-\frac{(G_L+G_R)^2}{H_R+H_L+λ}]-γ Gain=21​[HL​+λGL2​​+HR​+λGR2​​−HR​+HL​+λ(GL​+GR​)2​]−γ    根据 G a i n Gain Gain最大的属性分裂,如都是小于0,则不分裂。其中 G L G_L GL​和 H L H_L HL​分别是左边节点所有例子的一阶导之和 和 二阶导之和。
     - 叶子节点的值w (对于该叶子的一阶和二阶导的和):
w = − ∑ G ∑ H + λ w=-\frac{\sum G}{\sum H+λ} w=−∑H+λ∑G​
     - 最后将第m步的弱学习器组合进强学习器: f m ( x ) = f m − 1 ( x ) + Φ m ( x ) f_m(x)=f_{m-1}(x)+ {Φ_m(x)} fm​(x)=fm−1​(x)+Φm​(x)

  • 每次检验 f ( x ) f(x) f(x)是否达到收敛条件,或者迭代次数是否达到上限。
  • 满足则停止算法
一些trick
  • Shrinkage
    其实就是在得到的 w w w上乘上一个系数,让每一棵树学的东西不要太多,给之后的树学习空间;
    这个方法在GBDT中也有用到。可以对应于传统机器学习中的学习率参数,xgb.train()函数中的eta参数
  • 行列采样
    其实就是Random Forest的方法,两个随机性的体现。
    行采样(样本随机性bootstrap)xgb.train()中的subsample参数;
    列采样(随机选择属性) xgb.train()中的colsample_bytree参数 防止过拟合

这是xgb.train()函数中最关键且不易理解的参数,更具体地可以看官方文档,或XGBoost参数详解

Boosting方法入门相关推荐

  1. [转]阮一峰:蒙特卡罗方法入门

    ametor 阮一峰:蒙特卡罗方法入门 发表于2016/4/24 10:26:54  84人阅读 分类: 算法 作者: 阮一峰 日期: 2015年7月27日 本文通过五个例子,介绍蒙特卡罗方法(Mon ...

  2. 第四天学习Java的笔记(方法入门,编译器优化)

    第三章 方法入门 方法:就是将一个功能抽取出来,将代码单独定义在一个大括号内,形成一个单独的功能.当我们需要这个功能的时候,就可以去调用,这样即实现了代码的复用性,也解决了代码冗余的现象. Demo1 ...

  3. Windows下nginx的安装及使用方法入门

    Windows下Nginx的安装及使用方法入门 nginx功能之一可以启动一个本地服务器,通过配置server_name和root目录等来访问目标文件 一. 下载 官网地址:http://nginx. ...

  4. 【工具】(转)PowerDesigner最基础的使用方法入门学习

    PowerDesigner最基础的使用方法入门学习 https://www.cnblogs.com/biehongli/p/6025954.html 转载于:https://www.cnblogs.c ...

  5. 集成学习(ensemble learning)干货系列(3)——Boosting方法详解

    集成学习(ensemble learning)干货系列(1)--集成学习概述 集成学习(ensemble learning)干货系列(2)--随机森林(Bagging) Boosting基本原理 提升 ...

  6. php 生成斜体字,JavaScript italics方法入门实例(把字符串显示为斜体)

    这篇文章主要介绍了JavaScript italics方法入门实例,italics方法用于把字符串显示为斜体,需要的朋友可以参考下 JavaScript italics 方法 italics 方法返回 ...

  7. 【数据类型转换、运算符、方法入门】

    day02 [数据类型转换.运算符.方法入门] 今日内容 数据类型转换 算数运算符 比较运算符 逻辑运算符 三元运算符 简单方法定义和调用 教学目标 理解数据类型的自动转换 [小转大] 理解数据类型的 ...

  8. 知识点总结Day02——JAVA类型转换、运算符、方法入门及JShell

    目录 第一章 数据类型转换 一.自动转换 二.自动类型转换(隐式转换) 三.强制类型转换 3.1转换格式 3.2注意事项 第二章 运算符 一.算术运算符 注意事项 二.赋值运算符 三.比较运算符 注意 ...

  9. Boosting方法及代码实战

    1. Boosting基本思路   Boosting(提升)方法是一种常用的统计学习方法,应用广泛且有效,在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的 ...

最新文章

  1. Linux aptget 参数,ubuntu下apt-get 命令参数大全
  2. 048_CSS3用户界面
  3. 机器学习算法基础——k近邻算法
  4. Java技术分享之函数式编程
  5. js控制公共模板中,不同页面中的导航选中效果-判断当前的url
  6. 基于Kafka+Flink+Redis的电商大屏实时计算案例
  7. redis远程连接超时
  8. 软考高级-信息系统项目管理(1)
  9. 淘宝APP用户行为数据分析
  10. Seaweedfs安装配置使用及mount挂载
  11. debian or ubuntu下 anjuta配置
  12. 【Ant Design Vue】封装导出Excel文件的功能模块到ele-pro-table
  13. 【学术】英文写作中值得参考的语法、句式(二)
  14. centos 安装Htseq_APPNode管理面板安装使用教材
  15. web应用F12查看报错(前后端bug判断、2XX/3XX/4XX/5XX常见状态码解析)
  16. redux入门_Redux入门
  17. (CVPR 2022 阅读笔记)Residual Local Feature Network for Efficient Super-Resolution
  18. 5秒解决:VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运行 VMware Workstation。
  19. nmap——端口扫描_基础命令
  20. 关于hover改变其他元素

热门文章

  1. ElasticSearch-2
  2. 阿里QuickBi快速上手
  3. 张赐荣:计算机网络快速入门教程
  4. 20189200余超 2018-2019-2 移动平台应用开发实践第六周作业
  5. linux关闭计算机的命令是,关闭Linux计算机的命令操作
  6. PID控制算法实践应用(一):PID算法的离散化
  7. 【逆向基础】常用逆向工具介绍
  8. AtCoder题解 —— AtCoder Beginner Contest 182 —— D - Wandering
  9. 2017第四届“云鼎奖”申报火热进行中
  10. electron-vue通过配置文件设置baseUrl