【集成学习】Boosting策略典型算法原理
集成学习
集成学习是一种由多种弱学习器组合成强学习器的策略,主要分为3类:Boosting方法、Bagging方法、Stacking方法。
一、Boosting
Boosting方法基于串行策略,新的学习器由旧的学习器生成。
代表算法有:
- AdaBoost
- 提升树BT
- 梯度提升树GBDT
- XGBoost
Boosting算法要解决两个问题:
- Q1:如何改变样本数据的权值?
- Q2:如何将弱分类器组合成强分类器?
1.1 AdaBoost
对于Boosting对应的两个问题,AdaBoost的策略为:
- A1:开始时分配同样权值,根据分类误差,提升弱分类器中分类错误的样本权值(对错误的更敏感),降低正确分类样本的权值。
- A2:采用加权表决法组合成强分类器,分类错误率小的分类器有更大的权值。
注:用到两种权值,一个是对样本的,一个是对分类器的。对样本的权值分类错的更大,对弱分类器的权值分类越好(错误率越小)的权值越大。
1.1.1 公式推导
数据有N个,基学习器有M个,如第m个基学习器为Bm(x)B_m(x)Bm(x),最终输出为由基学习器组合而成的最终学习器B(x)。
1.初始化权重分布
Dm=(wm,1,wm,2,⋯ ,wm,N),wm,i=1ND_m=(w_{m,1},w_{m,2},\cdots ,w_{m,N}),w_{m,i}=\frac {1}{N}Dm=(wm,1,wm,2,⋯,wm,N),wm,i=N1
其中权值是分给每个样本的,DmD_mDm表示第m个基学习器的样本权值分配。
2.每个基学习器的学习过程
2.1 使用权值分布为DmD_mDm的数据集,得到基学习器Bm(x)B_m(x)Bm(x)的分类结果
Bm(x)=χ→{−1,+1}B_m(x)=\chi \rightarrow \{-1,+1\}Bm(x)=χ→{−1,+1}
即将样本映射到区间[-1,+1]上。
2.2 弱分类器Bm(x)B_m(x)Bm(x)的误差
em=P(Bm≠yi)=∑i=1Nwm,iI(Bm≠yi)e_m=P(B_m\neq y_i) =\sum _{i=1}^{N}w_{m,i}I(B_m\neq y_i)em=P(Bm̸=yi)=∑i=1Nwm,iI(Bm̸=yi)
2.3 计算Bm(x)B_m(x)Bm(x)系数
αm=12ln1−emem\alpha _m= \frac {1}{2} ln \frac {1-e_m}{e_m}αm=21lnem1−em
由上述公式可以看出某个弱分类器的权值分配的基本原则为:分类的越准,权值越大。
2.4 更新训练集权值分布
Dm+1=(wm+1,1,wm+1,2,⋯ ,wm+1,N)D_{m+1} =(w_{m+1,1},w_{m+1,2},\cdots ,w_{m+1,N})Dm+1=(wm+1,1,wm+1,2,⋯,wm+1,N)
其中
wm+1,i=wm,i⋅exp(−αm⋅yiBm(xi))Zmw_{m+1,i}=\frac {w_{m,i}\cdot exp(-\alpha_m \cdot y_i B_m(x_i))}{Z_m}wm+1,i=Zmwm,i⋅exp(−αm⋅yiBm(xi))
Zm=∑i=1Nwm,i⋅exp(−αmyiBm(xi))Z_m=\sum_{i=1}^{N}w_{m,i}\cdot exp(-\alpha _m y_i B_m(x_i))Zm=∑i=1Nwm,i⋅exp(−αmyiBm(xi))
其实我们可以发现$ y_i B_m(x_i)$要么为+1(分类正确),要么为-1(分类错误)。具体转化公式形式如下:
wm+1,i={wm,i⋅e−αmZmyi=Bm(xi)wm,i⋅eαmZmyi≠Bm(xi)w_{m+1,i}=\left\{\begin{matrix} \frac {w_{m,i}\cdot e^{-\alpha _m}}{Z_m} &y_i=B_m(x_i) \\ \frac {w_{m,i}\cdot e^{\alpha _m}}{Z_m} &y_i\neq B_m(x_i) \end{matrix}\right.wm+1,i={Zmwm,i⋅e−αmZmwm,i⋅eαmyi=Bm(xi)yi̸=Bm(xi)
其中αm\alpha _mαm为(0,1)之间的数,可以看出分类错误的样本会获得更大的权重。
3. 基学习器的组合
B(x)=sign(∑m=1MαmBm(x))B(x)=sign(\sum _{m=1}^{M}\alpha _m B_m(x))B(x)=sign(∑m=1MαmBm(x))
1.1.2 前向分布算法
AdaBoost算法是前向分布算法的一种特例,前向分布算法使求解加法模型的一种算法。
加法模型可以表示为:
f(x)=∑m=1Mαmb(x;γm)f(x)=\sum _{m=1}^{M} \alpha_m b(x;\gamma_m)f(x)=∑m=1Mαmb(x;γm)
其中$ \alpha_m为基学习器系数,为基学习器系数,为基学习器系数, b(x;\gamma_m)为基函数,为基函数,为基函数,\gamma_m$为基函数参数,学习加法模型可以可以转化为损失函数最小化问题:
minαmγm∑i=1ML(yi,∑i=1Mαmb(x;γm))min_{\alpha_m \gamma_m}\sum_{i=1}^M L(y_i,\sum_{i=1}^M\alpha_m b(x;\gamma_m))minαmγm∑i=1ML(yi,∑i=1Mαmb(x;γm))
使用前向分布算法求解上述损失函数过程:
基本思想为从前往后,每次只学习一个基函数和它的系数,逐步优化目标函数。
- 令f0(x)=0f_0(x)=0f0(x)=0
- (αm,γm)=argminα,γ∑i=1NL(yi,fm−1(xi)+αb(xi;γ))(\alpha_m,\gamma_m)=argmin_{\alpha,\gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\alpha b(x_i;\gamma))(αm,γm)=argminα,γ∑i=1NL(yi,fm−1(xi)+αb(xi;γ))
fm(x)=fm−1(x)+αmbm(x;γm)f_m(x)=f_{m-1}(x)+\alpha_m b_m(x;\gamma_m)fm(x)=fm−1(x)+αmbm(x;γm) - f(x)=∑m=1Mαmb(x;γm)f(x)=\sum_{m=1}^M \alpha_m b(x;\gamma_m)f(x)=∑m=1Mαmb(x;γm)
可以从上述公式中看出,AdaBoost为前向分布算法的一种特殊情况。
1.2 梯度提升决策树GBDT
GBDT(梯度提升树)是以决策树(CART)为基学习器的Boosting类型的集成学习方法,与提升树在残差计算方面有所不同,提升树使用真正的残差,梯度提升树使用模型的负梯度拟合残差。
1.2.1 CART回归树
CART分类树采用Gini指数选取最优特征,根据的是信息的纯度,适用于离散的情况。但CART回归树需要拟合梯度值,需要使用连续值,所以使用平方误差来拟合误差。
1.2.2 GBDT算法描述
训练数据有N个,基础决策树有m个,根据决策树深度可以划分为J个叶子节点,c表示初始决策树预测值,$\Upsilon $表示决策树叶子节点参数值。
- 初始化弱学习器
f0(x)=argminc∑i=1NL(yi,c)f_0(x)=argmin_c \sum_{i=1}^{N}L(y_i,c)f0(x)=argminc∑i=1NL(yi,c)
2.第m个决策树的生成
(1)计算第m个决策树中每个样本残差
ri,m=−∂L(yi,fm−1(xi))∂fm−1(xi)r_{i,m}=-\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)}ri,m=−∂fm−1(xi)∂L(yi,fm−1(xi))
(2)得到叶子节点的划分区域Rjm,j=1,2,⋯ ,JR_{jm},j=1,2,\cdots,JRjm,j=1,2,⋯,J。J的大小由决策树深度决定。
(3)对叶子区域计算最佳拟合值
Υjm=argminΥ∑xi∈RjmL(yi,fm−1(xi)+Υ)\Upsilon_{jm} =argmin_\Upsilon \sum_{x_i \in R_{jm} }L(y_i,f_{m-1}(x_i)+\Upsilon)Υjm=argminΥ∑xi∈RjmL(yi,fm−1(xi)+Υ)
(4)更新第m个决策树
fm(x)=fm−1(x)+∑j=1JΥjmI(x∈Rjm)f_m(x)=f_{m-1}(x)+\sum_{j=1}^{J}\Upsilon _{jm}I(x\in R_{jm})fm(x)=fm−1(x)+∑j=1JΥjmI(x∈Rjm)
- 得到最终学习器
f(x)=fM(x)=f0(x)+∑m=1M∑j=1JΥjmI(x∈Rjm)f(x)=f_M(x)=f_0(x)+\sum_{m=1}^{M}\sum_{j=1}^{J}\Upsilon _{jm}I(x\in R_{jm})f(x)=fM(x)=f0(x)+∑m=1M∑j=1JΥjmI(x∈Rjm)
1.2.3 举个例子
数据如下,两个特征:年龄和体重;一个标签:身高,即根据年龄和体重预测身高。
编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签) |
---|---|---|---|
0 | 5 | 20 | 1.1 |
1 | 7 | 30 | 1.3 |
2 | 21 | 70 | 1.7 |
3 | 30 | 60 | 1.8 |
4(需预测) | 25 | 65 | ? |
训练阶段
- 初始化弱学习器
f0(x)=argminc∑i=1NL(yi,c)f_0(x)=argmin_c \sum_{i=1}^{N}L(y_i,c)f0(x)=argminc∑i=1NL(yi,c)
其中损失函数为平方损失,因为平方损失函数为一个凸函数,所以可以直接求导,导数为0即可求出参数c。
∂L(yi,c)∂c=∑i=1N∂12(yi−c)2∂c=∑i=1Nc−yi\frac{\partial L(y_i,c)}{\partial c}=\sum_{i=1}^N \frac{\partial \frac{1}{2} (y_i-c)^2}{\partial c}=\sum_{i=1}^{N}c-y_i∂c∂L(yi,c)=∑i=1N∂c∂21(yi−c)2=∑i=1Nc−yi
令导数为0可以得到:
c=∑i=1NyiNc=\frac{\sum_{i=1}^{N}y_i}{N}c=N∑i=1Nyi
即c的取值为所有样本标签值的均值。
c=(1.1+1.3+1.7+1.8)/4=1.475c=(1.1+1.3+1.7+1.8)/4=1.475c=(1.1+1.3+1.7+1.8)/4=1.475
所以f0(x)=c=1.475f_0(x)=c=1.475f0(x)=c=1.475 - 学习器的迭代m=1,2,···,M
我们设置迭代次数m=1。
计算负梯度,负梯度即为残差,使用残差作为新的标签值,进而利用新的标签分类。
ri,1=−∂L(yi,f0(xi))∂f0(xi)r_{i,1}=-\frac{\partial L(y_i,f_{0}(x_i))}{\partial f_{0}(x_i)}ri,1=−∂f0(xi)∂L(yi,f0(xi))
弱学习器f1(x)f_1(x)f1(x)得到残差数据如下:
编号 | 年龄 | 体重 | 新标签值 |
---|---|---|---|
0 | 5 | 20 | -0.375 |
1 | 7 | 30 | -0.175 |
2 | 21 | 70 | 0.225 |
3 | 30 | 60 | 0.325 |
接着遍历每个特征的每个取值找到合适的划分点是的总的误差最小,即在叶子节点中 分类错误的最小。例如使用年龄=5的条件划分,接着使用年龄=7划分·····,接着继续在 叶子节点划分,直到达到树的最大深度,最终生成一个决策树。
在此次划分中选择的属性为年龄=21,按照是否小于21岁划分为两个叶子节点
接着需要对每个叶子节点分配参数:
$\Upsilon_{j1} =argmin_\Upsilon \sum_{x_i \in R_{j1} }L(y_i,f_{0}(x_i)+\Upsilon) $
损失函数为平方损失,利用求导并令导数为0可以求解出来参数。结果为:
x0,x1∈R11,Υ11=−0.275x_0,x_1\in R_{11},\Upsilon_{11}=-0.275x0,x1∈R11,Υ11=−0.275
x2,x3∈R21,Υ21=0.275x_2,x_3\in R_{21},\Upsilon_{21}=0.275x2,x3∈R21,Υ21=0.275
此时就构成了迭代一次后的决策树:
f1(x)=f0(x)+∑j=12Υj1I(x∈Rj1)f_1(x)=f_{0}(x)+\sum_{j=1}^{2}\Upsilon _{j1}I(x\in R_{j1})f1(x)=f0(x)+∑j=12Υj1I(x∈Rj1)
- 得到最终学习器
f(x)=f1(x)=f0(x)+∑m=11∑j=12ΥjmI(x∈Rjm)f(x)=f_1(x)=f_0(x)+\sum_{m=1}^{1}\sum_{j=1}^{2}\Upsilon _{jm}I(x\in R_{jm})f(x)=f1(x)=f0(x)+∑m=11∑j=12ΥjmI(x∈Rjm) - 最终结果
f0(x)=1.475f_0(x)=1.475f0(x)=1.475
f1(x)=0.2250f_1(x)=0.2250f1(x)=0.2250
测试结果
结果为f(x)=1.475+(0.275)=1.75f(x)=1.475+(0.275)=1.75f(x)=1.475+(0.275)=1.75
参考文献:
CSDN:https://blog.csdn.net/blank_tj/article/details/82262431
Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial
1.3 XGBoost
XGBoost是改进的梯度提升(GB)算法,Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。
1.3.1 XGBoost 与 GB 的主要区别
- 对损失函数加入正则项,包括 L2 权重衰减和对叶子数的限制
- 使用牛顿法代替梯度下降法寻找最优解:前者使用一阶+二阶导数作为残差,后者只使用了一阶导数
- 传统 CART树寻找最优切分点的标准是最小化均方差;XGBoost 通过最大化得分公式来寻找最优切分点:
1.3.2 XGBoost 的一些内部优化
- 在寻找最佳分割点时,传统的方法会枚举每个特征的所有可能切分点。XGBoost 实现了一种近似的算法,大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
- XGBoost 考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper 提到能提高 50 倍。
- 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然 Boosting 算法迭代必须串行,但是在处理每个特征列时可以做到并行。
- 按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致 cache miss,降低算法效率。Paper 中提到,可先将数据收集到线程内部的 buffer,然后再计算,提高算法的效率。
- XGBoost 还考虑了数据量比较大的情况,当内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
【集成学习】Boosting策略典型算法原理相关推荐
- 04 集成学习 - Boosting - AdaBoost算法构建
03 集成学习 - Boosting - AdaBoost算法原理 十.AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的,于是我就可以对模型进行更新操作了. 构建过程一 1.假 ...
- 集成学习-Boosting集成学习算法GBDT
GBDT算法的核心为:先构造一个(决策)树,然后不断在已有模型和实际样本输出的残差上再构造一颗树,依次迭代. 目录 Decistion Tree(决策树) Gradient Boosting(梯度提升 ...
- 笔记—集成学习—Boosting
集成学习--Boosting 一.引言 在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型.但是,实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模 ...
- 【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析
[机器学习]集成学习-Boosting-GBM(Gradient Boosting Machine)解析 文章目录 [机器学习]集成学习-Boosting-GBM(Gradient Boosting ...
- 集成学习结合策略——投票法
初识投票法的一点联想 其实第一次遇见集成学习中的投票法时候,会不由自主联系到leetcode 169. 多数元素和leetcode 229. 求众数 II中利用摩尔投票法求解问题.摩尔投票的基本思 ...
- 周志华教授专著《集成学习:基础与算法》上市,破解AI实践难题
[ 摘要 ]<集成学习:基础与算法>上市一周,斩获京东IT新书销量榜第一名桂冠,并拿下京东IT图书销量总榜第二名的惊人成绩. 文中有数据派独家福利哦 本书共读活动已正式开启,文末加入读者交 ...
- 周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...
近年来,机器学习技术的快速发展推动了语音.自然语言处理.机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展. 回顾机器学习最近30 年的发展历程,各种学习方法推陈出新.不断演进.但是, ...
- 【福利】周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...
近年来,机器学习技术的快速发展推动了语音.自然语言处理.机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展. >>>> 回顾机器学习最近30 年的发展历程,各种 ...
- 集成学习——Boosting(AdaBoost,Gradient Boosting)
集成学习--Boosting 与bagging方法不同,boosting中各个分类器串行生成,第Hn个分类器会受到Hn-1个分类器的影响.其主要思想是使下一个分类器更加关注于在上一个分类器上不能很好预 ...
最新文章
- python3 %%time 表示执行单元格时间 时间指的是CPU时间
- git 代码托管使用方法
- ckks方案优化最好的_果断收藏:SEO高级优化技能升级策略!
- c html联调,JS与native 交互简单应用
- java 调用 spring,java中使用redis和spring中调用redis
- 线程阻塞问题-功能:环信登录失败后自动登录5次
- springmvc获取原生servletAPI
- Tomcat一直启动不成功,连接不到8080(持续更新带图解释并总结了其他博文)
- 支付网关清算及退款流程
- arcgis中python计算面积的表达式_解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始...
- 带隙基准电压源的版图设计
- linux ps1 配色,bashrc - PS1(提示符配色)
- 勒索病毒的种类和传播方式
- 香港虚拟主机和美国虚拟主机的区别体现在哪些方面
- leetcode周赛,希望咸鱼,有一天可以薅到羊毛
- android 多线程创建texture,从源码角度剖析Android系统EGL及GL线程
- 马化腾“扛不住了”?微信“跟风”推出新功能,像极了当年的QQ
- 企业微信集成其他html,企业微信(新微信企业号)集成
- h5实现移动端拍照展示功能
- OJ:Bad Cowtractors(最大生成树)
热门文章
- 国内外常用NTP公共时间同步服务器
- 物联网学习入门:C/C++函数指针与特殊指针
- R9 7950X3D和 R9 7900X3D差距 锐龙R97950X3D和7900X3D对比
- 中国大学moocpython_中国大学慕课mooc2020用Python玩转数据期末考试公众号答案
- html旋转及自适应
- Excel中几个常用的函数
- 我公司去年多计管理费用4000,请教会计分录怎么调整?
- html判断cookies ph,【教程】如何利用IE9的F12去分析网站登陆过程中的复杂的(参数,cookie等)值(的来源)...
- excel格子颜色_在Excel中创建格子图案
- LaTex论文排版 | (29) 打勾和叉