提升方法之AdaBoost算法

提升方法之AdaBoost算法

作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解,但是涉及到具体的数学公式实现就开始懵逼了:为什么要用这个公式,这个公式是怎么推到的,这个公式达到什么样的效果?
这里结合自己的理解和画图,用最直白的语言对每个公式作用进行解剖。


一、AdaBoost核心概念总结

  1. 提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中,提升方法通过反复修改训练数据的权值分布,构建一系列基本分类器(弱分类器),并将这些基本分类器线性组合,构成一个强分类器。代表性的提升方法是AdaBoost算法。(重点是:更新分类器的参数训练集的权重见下2

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

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

    • MM表示该提升树共有M个弱分类器组成
    • Gm(x)Gm(x)表示第mm个弱分类器
    • αm为第mm个弱分类器的参数(反应该分类器的重要性)
  2. AdaBoost算法的特点是通过迭代每次学习一个基本分类器。每次迭代中,核心思想是:提高那些被前一轮分类器错误分类数据的权值,而降低那些被正确分类的数据的权值。最后,AdaBoost将基本分类器的线性组合作为强分类器,其中给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值

  3. AdaBoost的训练误差分析表明,AdaBoost的每次迭代可以减少它在训练数据集上的分类误差率,这说明了它作为提升方法的有效性。(每次迭代误差递减且误差0ϵ<0.5
  4. AdaBoost算法的一个解释是该算法实际是前向分步算法的一个实现。在这个方法里,模型是加法模型,损失函数是指数损失,算法是前向分步算法时的二分类学习方法。每一步中极小化损失函数。
  5. 提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中最有效的方法之一。

AdaBoost是一种典型的提升树算法。

通过上面的总结我们看到,AdaBoost是一个神奇的算法,以精妙的方式通过更新数据集的权重以及各个弱分类器的参数组合成一个强分类器。那么它具体是怎么做到的呢?

二、AdaBoost算法推导

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)T=(x1,y1),(x2,y2),...,(xN,yN),其中xiXRn,yiY={1,1}xi∈X⊆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,最终达到分类的目的。如图:

参数αmαm公式及权重wm+1,iwm+1,i其实是通过前向分步算法分别得到的αmαmGm(x)Gm(x)并使得fm(x)fm(x)再训练数据集TT上的指数损失最小。具体的推导过程可参考《统计学习方法》–李航 第145~146页

三、AdaBoost算法实现步骤

上面解释了AdaBoost算法的具体内容。这里写出它的分布实现步骤再对上文算法加深下理解:

(1)假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第1步能够在原始数据上学习基本分类器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的另一特点。

提升方法是即采用加法模型(即基数函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

喜欢本文的伙伴请关注我的博客http://ihoge.cn

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

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

相关文章

C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

关于 Neting刚开始的时候是打算使用微软官方的 Yarp 库&#xff0c;实现一个 API 网关。目前写完了查看 Kubernetes Service 信息、创建 Route 和 Cluster 和绑定 Kubernetes Service。简单来说&#xff0c;就是完成了基础部分&#xff0c;配置路由和后端服务绑定&#xff0c;如…

CCR源码分析-CCR架构

CCR&#xff0c;并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道&#xff0c;这个东东是用来简化并发程序设计的。为何要并发呢&#xff1f;因为我们有多个任务需要处理&#xff0c;如果能同时做就会充分利用硬 件而减少处理的时间。自然的&a…

量子力学到底有多难?他用700多幅漫画,让孩子秒懂这个神奇世界!

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时&#xff0c;曾谈到&#xff1a;学习量子力学改变了他的思维方式。到底什么是量子力学&#xff1f;我们生活面对的物质尺度大约是厘米级到千米级之…

Openssl搭建私有CA认证

概述CA英文全称Certification Authority&#xff0c;即数字证书认机构。从广义上来说&#xff0c;CA是负责发放和管理数字证书的权威机构&#xff0c;并作为用户数字认证中受信任的第三方&#xff0c;承担公钥体系&#xff08;PKI&#xff09;中公钥的合法性检验的责任&#xf…

提升树算法总结(一)

本文是综合了之前的以往多个笔记汇总而成&#xff0c;内容较长。感兴趣的建议收藏用到时随时翻阅内容包含&#xff1a; 若有遗漏错误之处请反馈修改&#xff0c;感激不尽 一、Boosting基本概念 二、前向分步加法模型1. 加法模型2. 前向分步算法 三、AdaBoost1. 算法解析2. 模…

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…