Boosting方法入门
首先什么是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=1Nwm,iI(Φm(x)!=yi)
- 根据误差计算当前弱分类器的权重: α m = 1 2 l o g 1 − ε m ε m α_m=\frac{1}{2}log\frac{1-ε_m}{ε_m} αm=21logεm1−ε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=Zmwm,iexp(−αmyiΦ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,iexp(−αmyiΦ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=argwmini=1∑NL弱学习器(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βmmini=1∑NL(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=argwmini=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βmmini=1∑NL(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=1NL(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方法入门相关推荐
- [转]阮一峰:蒙特卡罗方法入门
ametor 阮一峰:蒙特卡罗方法入门 发表于2016/4/24 10:26:54 84人阅读 分类: 算法 作者: 阮一峰 日期: 2015年7月27日 本文通过五个例子,介绍蒙特卡罗方法(Mon ...
- 第四天学习Java的笔记(方法入门,编译器优化)
第三章 方法入门 方法:就是将一个功能抽取出来,将代码单独定义在一个大括号内,形成一个单独的功能.当我们需要这个功能的时候,就可以去调用,这样即实现了代码的复用性,也解决了代码冗余的现象. Demo1 ...
- Windows下nginx的安装及使用方法入门
Windows下Nginx的安装及使用方法入门 nginx功能之一可以启动一个本地服务器,通过配置server_name和root目录等来访问目标文件 一. 下载 官网地址:http://nginx. ...
- 【工具】(转)PowerDesigner最基础的使用方法入门学习
PowerDesigner最基础的使用方法入门学习 https://www.cnblogs.com/biehongli/p/6025954.html 转载于:https://www.cnblogs.c ...
- 集成学习(ensemble learning)干货系列(3)——Boosting方法详解
集成学习(ensemble learning)干货系列(1)--集成学习概述 集成学习(ensemble learning)干货系列(2)--随机森林(Bagging) Boosting基本原理 提升 ...
- php 生成斜体字,JavaScript italics方法入门实例(把字符串显示为斜体)
这篇文章主要介绍了JavaScript italics方法入门实例,italics方法用于把字符串显示为斜体,需要的朋友可以参考下 JavaScript italics 方法 italics 方法返回 ...
- 【数据类型转换、运算符、方法入门】
day02 [数据类型转换.运算符.方法入门] 今日内容 数据类型转换 算数运算符 比较运算符 逻辑运算符 三元运算符 简单方法定义和调用 教学目标 理解数据类型的自动转换 [小转大] 理解数据类型的 ...
- 知识点总结Day02——JAVA类型转换、运算符、方法入门及JShell
目录 第一章 数据类型转换 一.自动转换 二.自动类型转换(隐式转换) 三.强制类型转换 3.1转换格式 3.2注意事项 第二章 运算符 一.算术运算符 注意事项 二.赋值运算符 三.比较运算符 注意 ...
- Boosting方法及代码实战
1. Boosting基本思路 Boosting(提升)方法是一种常用的统计学习方法,应用广泛且有效,在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的 ...
最新文章
- Linux aptget 参数,ubuntu下apt-get 命令参数大全
- 048_CSS3用户界面
- 机器学习算法基础——k近邻算法
- Java技术分享之函数式编程
- js控制公共模板中,不同页面中的导航选中效果-判断当前的url
- 基于Kafka+Flink+Redis的电商大屏实时计算案例
- redis远程连接超时
- 软考高级-信息系统项目管理(1)
- 淘宝APP用户行为数据分析
- Seaweedfs安装配置使用及mount挂载
- debian or ubuntu下 anjuta配置
- 【Ant Design Vue】封装导出Excel文件的功能模块到ele-pro-table
- 【学术】英文写作中值得参考的语法、句式(二)
- centos 安装Htseq_APPNode管理面板安装使用教材
- web应用F12查看报错(前后端bug判断、2XX/3XX/4XX/5XX常见状态码解析)
- redux入门_Redux入门
- (CVPR 2022 阅读笔记)Residual Local Feature Network for Efficient Super-Resolution
- 5秒解决:VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运行 VMware Workstation。
- nmap——端口扫描_基础命令
- 关于hover改变其他元素