提升树算法总结(一)

本文是综合了之前的以往多个笔记汇总而成,内容较长。感兴趣的建议收藏用到时随时翻阅内容包含:

若有遗漏错误之处请反馈修改,感激不尽

一、Boosting基本概念
二、前向分步加法模型1. 加法模型2. 前向分步算法
三、AdaBoost1. 算法解析2. 模型构建3. 算法缺点
四、二叉分类树
五、回归分类树1. 算法解析2. 模型构建
六、梯度提升树(GBDT)1. 算法解析2. 模型构建
七、XGBoost1. 原理详解2. 目标函数3. 学习过程4. 损失函数5. 正则化6. 决策树的构建7. 流程步骤8. 优缺点
八、总结1. Boosting家族2. AdaBoost3. 回归提升树和AdaBoost4. GBDT和回归提升树   5. XGBoost和GBDT6. 参考文献

提升(Boosting)是集成学习方法里的一个重要方法,其主要思想是将弱分类器组装成一个强分类器。在 PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

提升树模型实际采用加法模型(即基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(Boosting Tree)。

对分类问题决策树是二叉分类树对回归问题决策树是二叉回归树

提升树模型可以表示为决策树的加法模型:

fM(x)=Mi=1T(x;Θm)fM(x)=∑i=1MT(x;Θm)
其中 T(x;Θm)T(x;Θm)表示决策树; ΘmΘm表示决策树的参数; MM为树的个数。

不同问题的提升树学习算法,其主要区别在于损失函数不同。平方损失函数常用于回归问题,用指数损失函数用于分类问题,以及绝对损失函数用于决策问题

由于树的线性组合可以很好的拟合训练数据,即使数据中的输入和输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。

一、基本概念

提升(Boosting)方法是一类应用广泛且非常有效的统计学习方法。

它基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。

强可学习:如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的

弱可学习:如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的

AdaBoost算法:那么如何将弱学习算法提升为强学习算法呢?关于提升方法的研究很多,有很多算法被提出。最具代表性的是AdaBoost算法(AdaBoost algorithm)

Boosting算法的两个核心问题

  1. 在每一轮如何改变训练数据的权值或概率分布

    通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

  2. 如何将弱分类器组合成一个强分类器

    通过加法模型将弱分类器进行线性组合,比如 AdaBoost 通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。

AdaBoost的巧妙之处就在于它将这些想法自然且有效地实现在一种算法里。
AdaBoost算法是损失函数为指数函数时的Boosting算法

二、前向分步加法模型(Forward Stagewise Additive Modeling)

1. 加法模型

(形为Y=I+U+T+K的模型为加法模型)

f(x)=Mm=1βmb(x;γm)f(x)=∑m=1Mβmb(x;γm)
其中, b(x;γm)b(x;γm)为基函数, βmβm为基函数的系数。

2. 前向分步算法

在给定训练数据及损失函数L(y,f(x))L(y,f(x))的条件下,学习加法模型f(x)f(x)称为经验风险极小化,即损失函数极小化的问题:

min(βm,γm)Ni=1L(yi,Mm=1βmb(xi;γm))min(βm,γm)∑i=1NL(yi,∑m=1Mβmb(xi;γm))

通常这是一个复杂的优化问题。前向分布算法(forward stagwise algorithm)求解这一优化问题的思路是:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式f(x)=Mm=1βmb(x;γm)f(x)=∑m=1Mβmb(x;γm),那么就可以简化优化的复杂度。

具体地,每步只需优化如下损失函数:

minβ,γMi=1L(yi,βb(xi;γ))minβ,γ∑i=1ML(yi,βb(xi;γ))

前向分布算法步骤如下:

输入:训练数据集D=(x1,y1),(x2,y2),(x3,y3),...,(xN,yN)D=(x1,y1),(x2,y2),(x3,y3),...,(xN,yN);损失函数L(y,f(x))L(y,f(x));基函数集(β(x;γ))(β(x;γ));
输出:加法模型f(x)f(x)

(1)初始化f0(x)=0f0(x)=0

(2)对于k=1,2,...,Kk=1,2,...,K
(a)极小化损失函数,得到βm,γmβm,γm:

(βm,γm)=argmin(β,γ)Ni=1L(yi,fm1(xi)+βb(xi,γ))(βm,γm)=argmin(β,γ)∑i=1NL(yi,fm−1(xi)+βb(xi,γ))

(b)更新
fm(x)=fm1(x)+βmb(x;γm)fm(x)=fm−1(x)+βmb(x;γm)

(3)得到加法模型

f(x)=fM(x)=Mm=1βmb(x;γm)f(x)=fM(x)=∑m=1Mβmb(x;γm)

这样。前向分步算法将同时求解从m=1m=1m=Mm=M所有参数βm,γmβm,γm的优化问题简化为逐次求解βm,γmβm,γm的优化问题。
前向分布算法学习的是加法模型,当基函数为基本分类器是,该加法模型等价于Adaboost的最终分类器。(AdaBoost算法参数迭代公式就是由此而来)

基学习器:基函数为同一类型;反之称为组件学习器或直接成个体学习器

三、AdaBoost

AdaBoost算法是前向分步算法的特例,其模型是由基本分类器组成的加法模型,损失函数是指数函数。

1. AdaBoost算法解析

AdaBoost模型是弱分类器的线性组合:

f(x)=Mm=1αmGm(x)f(x)=∑m=1MαmGm(x)

  • MM表示该提升树共有M个弱分类器组成
  • Gm(x)Gm(x)表示第mm个弱分类器
  • αm为第mm个弱分类器的参数(反应该分类器的重要性)

Adaboost算法在分类问题中的主要特点:通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。 AdaBoost-算法描述(伪代码)如下:

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN),其中xiχRn,yiY={1,1}xi∈χ⊆Rn,yi∈Y={−1,1},弱学习算法Gm(x)Gm(x);
输出:最终强化算法分类器G(x)G(x)
(1)初始化训练数据总和为1的权值分布:(初始权重为归一化后的均值既1N1N

D1=(w11,...,w1i,...w1N),w1i=1N,i=1,2,...ND1=(w11,...,w1i,...w1N),w1i=1N,i=1,2,...N

(2)对m=1,2,...Mm=1,2,...M:(弱分类器的个数)
(a)使用具有权值分布的DmDm的训练数据集学习,得到基本分类器:(数据集XX到{-1,1}的映射)
Gm(x):X>{1,1}

(b)计算Gm(x)Gm(x)在训练数据集上的分类误差率:(公式不够简洁明了,其实总结下来非常好理解:误差率emem=误分类样本的权值之和)
em=Ni=1P(Gm(xi)yi)=Ni=1wmiI(Gm(xi)yi)em=∑i=1NP(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)

我们来考虑下误差emem的取值空间:由于训练集权制之和为1,因此误差0em10≤em≤1。但是这样还不够。因为我们在选择分裂阈值的时候会选择一个最优或局部最优的取值来分裂,且当em=0.5em=0.5是表明该分裂阈值对预测无贡献。因此最终得到的emem的实际取值应小于em0.5em≤0.5
所以最终:0em0.50≤em≤0.5,且每次迭代误差emem递减。这点对下面的参数理解很重要。
(c)计算Gm(x)Gm(x)的系数:(这里对数为自然对数)
αm=12log1ememαm=12log1−emem

那么问题来了,为什么要用这个公式来计算更新每个基分类器的参数?我们先画个图出来观察下这个函数。(其中y轴为αmαm,x轴为误差emem

由(2-b)我们得到误差emem的取值范围为0em<0.50≤em<0.5,结合该图可以可知0<αm<10<αm<1
另外可以发现,通过该函数的转换,弱分类器Gm(x)Gm(x)的误差的越小,参数αmαm越大。即实现了给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值
(d)更新训练数据集的权值分布:(该权值决定数据集的重要性,并让误差的计算变得简单)

Dm+1=(wm+1,1,...,wm+1,i,...wm+1,N)Dm+1=(wm+1,1,...,wm+1,i,...wm+1,N)

wm+1,i=wmiZmexp(αmyiGm(xi)),i=1,2,...Nwm+1,i=wmiZmexp(−αmyiGm(x−i)),i=1,2,...N

这里yi={1,1}yi={−1,1}为真实值,Gm(xi)={1,1}Gm(xi)={−1,1}为预测值。当预测正确时yiGm(xi)yiGm(xi)为1,反之为-1。
δmi=αmyiGm(xi)δmi=αmyiGm(xi)θmi=wmiZmθmi=wmiZm(把它看作一个用于归一化权值的加权平均常数)。权重wm+1,iwm+1,i的更新函数可以简化为
wm+1,i=θmiexp(δmi),i=1,2,...Nwm+1,i=θmiexp(δmi),i=1,2,...N
画出y=wm+1,i=exp(δmi)y=wm+1,i=exp(δmi)的图形来看一下:

由于0<αm<10<αm<1,所以1<δm,i<1−1<δm,i<1。且使得预测错误的数据集样本点更新后的权重变大,预测正确的权值变小,然后对所有权值进行归一化。这就是该函数实现的作用。(图中y=1是当αα无限接近于0时的情况:解释为,当αmαm权值越大,权重wm+1,iwm+1,i更新改变的效果越明显。)
这里,ZmZm是规范化因子,目的是使各数据集的权重进行归一化。理解为ZmZm=更新后的各数据集权重之和。

Zm=Ni=1wmiexp(αmyiGm(xi))Zm=∑i=1Nwmiexp(−αmyiGm(xi))

(3)构建基本分类器的新型组合f(x)=Mm=1αmGm(x)f(x)=∑m=1MαmGm(x),即:
G(x)=sign(f(x))=sign(Mm=1αmGm(x))G(x)=sign(f(x))=sign(∑m=1MαmGm(x))

函数sign()sign()的意义是将正数判别为1,负数判别为-1,最终达到分类的目的。如图:

2. AdaBoost构建步骤

上面解释了AdaBoost算法的具体内容。这里写出它的分布实现步骤再对上文算法加深下理解:
(1)假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第1步能够在原始数据上学习基本分类器G1(x)G1(x)
(2)AdaBoost反复学习基本分类器,在每一轮m1,2,,Mm=1,2,…,M顺次地执行下列操作:
(a)使用当前分布DmDm加权的训练数据集,学习基本分类器Gm(x)Gm(x)
(b)计算基本分类器Gm(x)Gm(x)再加权训练数据集上的分类误差率(即误分类样本的权值之和。这里要注意wmiwmi表示第mm轮中第i个实例的权值,且权值之和为1,即Ni=1wmi=1∑i=1Nwmi=1):

em=P(Gm(xi)yi)=Gm(xi)yiwmiem=P(Gm(xi)≠yi)=∑Gm(xi)≠yiwmi

(c)计算基本分类器Gm(x)Gm(x)的系数αmαmalphamalpham表示Gm(x)Gm(x)在最终分类器中的重要性。由上面(2-c)可知,em1/2em≤1/2时,alpham0alpham≥0,并且αmαm随着emem的减小而增大,所以分类误差率越小的分类器在最终分类器中的作用越大。
(d)更新训练数据的权值分布为下一轮作准备。式(2-d)的权重更新函数可以写成:

由此可知,被基本分类器Gm(x)Gm(x)误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。两相比较,误分类样本的权值被放大e(2αm)=em1eme(2αm)=em1−em倍。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是AdaBoost的一个特点。
(3)线性组合f(x)f(x)实现MM个基本分类器的加权表决。系数αm 表示了基本分类器Gm(x)Gm(x)的重要性,这里,所有αmαm 之和并不为1。f(x)f(x)的符号决定实例x的类,f(x)f(x)的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。

3. AdaBoost算法缺点

1. 常规AdaBoost算法只能处理二分类问题

MultiBoost工具的侧重点不同于XGBoost,是Adaboost算法的多分类版本实现,更偏向于解决multi-class / multi-label / multi-task的分类问题。

2. 对异常值敏感

指数损失存在的一个问题是不断增加误分类样本的权重(指数上升)。如果数据样本是异常点(outlier),会极大的干扰后面基本分类器学习效果;

3. 模型无法用于概率估计

对于取值为ŷ{1,1}y^∈{−1,1}的随机变量说,eŷfe−y^f不是任何概率密度函数的对数形式,模型f(x)f(x)的结果无法用概率解释。
MLAPP中的原话:eŷfe−y^fis not the logarithm of any pmf for binary variables ŷ{1,1}y^∈{−1,1}; consequently we cannot recover probability estimate from f(x)f(x).”

6. 参考文献

[1] 《统计学习方法》 ——李航 2012 清华大学出版社
[2] 《机器学习》 ——周志华 2016 清华大学出版社
[3] http://ihoge.cn/2018/adaboost.html
[4] https://www.jianshu.com/nb/7305482
[5] http://www.52caml.com/head_first_ml/ml-chapter6-boosting-family/#Gradient_Boosting
[6] https://www.jianshu.com/p/d55f7aaac4a7
[7] http://gitbook.cn/gitchat/column/5ac2f0509e924a1dc029dd84/topic/5ac9e0e5dbd50e7493d35d3f

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之Launcher分析和修改4——初始化加载数据

上面一篇文章说了Launcher是如何被启动的&#xff0c;Launcher启动的过程主要是加载界面数据然后显示出来&#xff0c; 界面数据都是系统APP有关的数据&#xff0c;都是从Launcher的数据库读取&#xff0c;下面我们详细分析Launcher如何加载数据。 在Launcher.java的onCreate()…

图像处理技术之分辨率与压缩

一 图像分辨率数码图像有两大类&#xff0c;一类是矢量图&#xff0c;也叫向量图&#xff1b;另一类是点阵图&#xff0c;也叫位图。矢量图比较简单&#xff0c;它是由大量数学方程式创建的&#xff0c;其图形是由线条和填充颜色的块面构成的&#xff0c;而不是由像素组成的&am…

当代年轻人,都有些不成文的规定?

全世界只有3.14 % 的人关注了爆炸吧知识面对海量信息&#xff0c;我们不可能有时间去一一筛选&#xff0c;导致我们看到的总是局部。包括公众号&#xff0c;看似可以随便关注&#xff0c;但是你的选择其实是有限空间的。你可以关注更多资讯、干货十足的公号主动和别人分享有趣的…

未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?

今天有位女性乎友问&#xff1a;我家的电脑之前一直没装宽带&#xff0c;主要是家人怕影响学习&#xff0c;不过上周就涨了&#xff0c;电脑终于连上网线&#xff0c;但没办法上网&#xff0c;还发现电脑设备管理器中网络适配器出现黄色感叹号。对于电脑的网络适配器感叹号问题…

使用Spectre.Console创建漂亮的控制台应用程序

前言你是否厌倦了控制台应用程序默认的简陋界面&#xff1f;这时&#xff0c;你可以试试引用Nuget包Spectre.Console。打印使用帮助首先&#xff0c;我们可以设置控制台应用程序可以执行的命令&#xff1a;static async Task<int> Main(string[] args) {var app new Com…

Android之ComponentName的用法

ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的、 ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。 实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包…

Linux入门之进程管理(4)之进程与文件

Linux入门之进程管理(4)之进程与文件前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的&#xff0c;但是在某些情况下&#xff0c;想要查看某个文件或者某个设备被哪些进程所使用&#xff0c;使用ps、pgrep等命令查询的是不够准…

初识MASA Blazor

MASA Blazor是一个Blazor的UI组件库。就像大家写前端熟知的Bootstrap, Ant Design一样。MASA Blazor官网地址&#xff1a;https://blazor.masastack.comMASA Blazor Github地址&#xff1a;https://github.com/BlazorComponent/MASA.BlazorMASA Blazor Pro演示地址&#xff1a;…

win7技巧

win7鼠标右键菜单清理 win7右键菜单设置 |浏览&#xff1a;7659|更新&#xff1a;2014-03-04 14:23|标签&#xff1a; windows7 鼠标 1234567分步阅读虽然我们现在打开某个软件都是双击解决完事&#xff0c;但是偶尔我们需要右键属性的时候&#xff0c;可以看到右键菜单拖拖拉拉…

基于Python的电商平台淘宝商品评论数据采集与分析

引言 在电商竞争日益激烈的情况下&#xff0c;商家既要提高产品质量&#xff0c;又要洞悉客户的想法和需求&#xff0c;关注客户购买商品后的评论&#xff0c;而第三方API接口商家获取商品评价主要依赖于人工收集&#xff0c;不但效率低&#xff0c;而且准确度得不到保障。通过…

《Pyflink》Flink集群安装,Python+Flink调研

Flink集群安装&#xff0c;PythonFlink调研 Flink集群部署 下载对应版本安装包&#xff1a;https://flink.apache.org/downloads.html 实验环境为hadoop2.7&#xff0c; scala2.11 所以下载flink-1.7.1-bin-hadoop27-scala_2.11.tgz 配置conf/flink-conf.yaml jobmanager.rpc…

hdu 4539(状压dp)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4539 思路&#xff1a;跟poj1185简直就是如出一辙&#xff01; 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 using namespace std;6 7 int row…

万字长文入门 Redis 命令、事务、锁、订阅、性能测试

Redis 基本数据类型Redis 中&#xff0c;常用的数据类型有以下几种&#xff1a;String&#xff1a;字符串类型&#xff0c;二进制安全字符串&#xff1b;Hash&#xff1a;哈希表&#xff1b;List 列表&#xff1a;链表结构&#xff0c;按照插入顺序排序的字符串元素的集合&…

基于应用日志的扫描器检测实践

基于应用日志的扫描器检测实践 在网络上搜索web扫描器时&#xff0c;各类扫描器工具、扫描攻略玲琅满目&#xff0c;但对扫描器检测方法的内容却少之又少。因此&#xff0c;本文对各类web扫描特特征进行了梳理和总结&#xff0c;并结合苏宁应用防火墙&#xff08;SNWAF&#x…

将一个压缩文件分成多个压缩文件;RAR文件分卷

有时候需要上传压缩文件&#xff0c;但是限制了单个文件的大小&#xff0c;那我们怎么才能将一个比较大的压缩文件分割成多个压缩文件&#xff0c;从而符合要求的进行文件的上传呢&#xff1f;这里小编告诉你一个技巧。 工具/原料 电脑 winrar&#xff08;一般电脑都自带了&…

python画相关性可视化图_Python可视化很简单,一文教你绘制饼图、极线图和气泡图...

matplotlib库作为Python数据化可视化的最经典和最常用库&#xff0c;掌握了它就相当于学会了Python的数据化可视化&#xff0c;上次呢&#xff0c;已经和大家聊了关于柱状图、条形图和直方图相关的东东&#xff0c;相信大家已经掌握了哈&#xff0c;那今天呢&#xff0c;咱们再…