Adaboost 2

本文不定期更新。原创文章,转载请注明出处,谢谢。

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器。

算法概述

1、先通过对N个训练样本的学习得到第一个弱分类器;
2、将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;
3、将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器
4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。

与boosting算法比较

1. 使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;   
2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

与Boosting算法不同的是,AdaBoost算法不需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,并且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,这样可以深入挖掘弱分类器算法的能力。

算法步骤

1. 给定训练样本集S,其中X和Y分别对应于正例样本和负例样本;T为训练的最大循环次数;
2. 初始化样本权重为1/n ,即为训练样本的初始概率分布;   
3. 第一次迭代:(1)训练样本的概率分布相当,训练弱分类器;(2)计算弱分类器的错误率;(3)选取合适阈值,使得误差最小;(4)更新样本权重;   
经T次循环后,得到T个弱分类器,按更新的权重叠加,最终得到的强分类器。

具体步骤如下:

一.样本
Given: m examples (x1, y1), …, (xm, ym)
     where xi?X, yi?Y={-1, +1}
     xi表示X中第i个元素,
     yi表示与xi对应元素的属性值,+1表示xi属于某个分类,
                                       -1表示xi不属于某个分类
二.初始化训练样本xi的权重D(i) :i=1,……,m;
    (1).若正负样本数目一致,D1(i) = 1/m
    (2).若正负样本数目m+, m-则正样本D1(i) = 1/m+,
负样本D1(i) = 1/m-

实例详解


图中“+”和“-”表示两种类别。我们用水平或者垂直的直线作为分类器进行分类。

算法开始前默认均匀分布D,共10个样本,故每个样本权值为0.1.

第一次分类:

第一次划分有3个点划分错误,根据误差表达式

 计算可得e1=(0.1+0.1+0.1)/1.0=0.3

分类器权重:

然后根据算法把错分点的权值变大。对于正确分类的7个点,权值不变,仍为0.1,对于错分的3个点,权值为:

D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333

第二次分类:

如图所示,有3个"-"分类错误。上轮分类后权值之和为:0.1*7+0.2333*3=1.3990

分类误差:e2=0.1*3/1.3990=0.2144

分类器权重a2=0.6493

错分的3个点权值为:D2=0.1*(1-0.2144)/0.2144=0.3664

第三次分类:

同上步骤可求得:e3=0.1365 ;a3=0.9223;D3=0.6326

最终的强分类器即为三个弱分类器的叠加,如下图所示:

每个区域是属于哪个属性,由这个区域所在分类器的权值综合决定。比如左下角的区域,属于蓝色分类区的权重为h1 中的0.42和h2 中的0.65,其和为1.07;属于淡红色分类区域的权重为h3 中的0.92;属于淡红色分类区的权重小于属于蓝色分类区的权值,因此左下角属于蓝色分类区。因此可以得到整合的结果如上图所示,从结果图中看,即使是简单的分类器,组合起来也能获得很好的分类效果。

分类器权值调整的原因


由公式可以看到,权值是关于误差的表达式。每次迭代都会提高错分点的权值,当下一次分类器再次错分这些点之后,会提高整体的错误率,这样就导致分类器权值变小,进而导致这个分类器在最终的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占整体的权值更高,让正确率低的分类器权值更低,从而提高最终分类器的正确率。

算法优缺点

优点

1)Adaboost是一种有很高精度的分类器
2)可以使用各种方法构建子分类器,Adaboost算法提供的是框架
3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单
4)简单,不用做特征筛选
5)不用担心overfitting(过度拟合)

缺点

1)容易受到噪声干扰,这也是大部分算法的缺点

2)训练时间过长

3)执行效果依赖于弱分类器的选择

SQL实现

#开始迭代
while(@i<=3) do
	set @evalue=0,@temp=0;
	set @flag1=0,@flag2=0,@flag3=0,@flag4=0;
	set @las=concat(‘d‘,@i-1);
	set @cur=concat(‘d‘,@i);
	set @a=concat(‘select hx,hy into @hx,@hy from hea where id = ‘,@i);
	prepare stmt1 from @a;
	execute stmt1;
	set @aa=concat(‘update adaset set ‘,@cur,‘ = ‘,@las);
	prepare stmt111 from @aa;
	execute stmt111;
#1.分类器为垂直x轴直线
	if (@hy=0) then
	#处理分类1
		set @b=concat(‘select count(class) into @l_1 from adaset where class="1" and x < ‘,@hx);
		prepare stmt2 from @b;
		execute stmt2;
		set @c=concat(‘select count(class) into @l_2 from adaset where class="-1" and x < ‘,@hx);
		prepare stmt3 from @c;
		execute stmt3;
		if(@l_1=0 and @l_2!=0) then
		set @clas=concat(‘update hea set l=-1 where id = ‘,@i);
		prepare stmt28 from @clas;
		execute stmt28;
		end if;
		if(@l_1!=0 and @l_2 =0) then
			set @clas=concat(‘update hea set l=1 where id = ‘,@i);
			prepare stmt29 from @clas;
			execute stmt29;
		end if;
		set @weight=concat(‘d‘,@i-1);
		if (@l_1 !=0 and @l_2 !=0 and @l_1>@l_2) then #@l_2是错分点
			set @d=concat(‘select sum(‘,@weight,‘) into @temp from adaset where class="-1" and x < ‘,@hx);
			prepare stmt4 from @d;
			execute stmt4;
			set @[email protected][email protected];
			set @flag1=1;
			set @clas=concat(‘update hea set l=1 where id = ‘,@i);
			prepare stmt20 from @clas;
			execute stmt20;
		end if;
		if (@l_1 !=0 and @l_2 !=0 and @l_1<@l_2) then #@l_1是错分点
			set @d=concat(‘select sum(‘,@weight,‘) into @temp from adaset where class="1" and x < ‘,@hx);
			prepare stmt5 from @d;
			execute stmt5;
			set @[email protected][email protected];
			set @flag2=1;
			set @clas=concat(‘update hea set l=-1 where id = ‘,@i);
			prepare stmt21 from @clas;
			execute stmt21;
		end if;
#总权值&误差
	set @h=concat(‘select sum(‘,@weight,‘) into @temp from adaset‘);
	prepare stmt10 from @h;
	execute stmt10;
	set @evalue = round(@evalue/@temp,4);
	set @avalue = round((0.5*ln(([email protected])/@evalue)),4);
	set @eee=round(([email protected])/@evalue,4);
#更新误差e&假设权重a
	set @j=concat(‘update hea set e = ‘,@evalue,‘ ,a = ‘,@avalue,‘ where id = ‘,@i);
	prepare stmt11 from @j;
	execute stmt11;
#更新错分样本的权重
	if (@hy=0) then
		if (@flag1=1) then
			set @k=concat(‘update adaset set ‘,@cur,‘ = ‘,@las,‘*‘,@eee,‘ where class="-1" and x < ‘,@hx);
			prepare stmt12 from @k;
			execute stmt12;
		end if;
		if (@flag2=1) then
			set @m=concat(‘update adaset set ‘,@cur,‘ = ‘,@las,‘*‘,@eee,‘ where class="1" and x < ‘,@hx);
			prepare stmt13 from @m;
			execute stmt13;
		end if;
		if (@flag3=1) then
			set @n=concat(‘update adaset set ‘,@cur,‘ = ‘,@las,‘*‘,@eee,‘ where class="-1" and x > ‘,@hx);
			prepare stmt14 from @n;
			execute stmt14;
		end if;
		if (@flag4=1) then
			set @o=concat(‘update adaset set ‘,@cur,‘ = ‘,@las,‘*‘,@eee,‘ where class="1" and x > ‘,@hx);
			prepare stmt15 from @o;
			execute stmt15;
		end if;
	end if;
set @[email protected]+1;
end while;

以上是博主最近用SQL实现的Adaboost算法的部分代码。数据库表以后整理一下再贴。Ubuntu不稳定啊,死机两次了。。编辑的博客都没了。。累觉不爱。。

个人疑问

上文中的缺点提到,Adaboost算法的效果依赖于弱分类器的选择,那么面对巨大的待分类数据时,如何选择弱分类呢?有没有什么原则。博主依旧在探索中,找到答案的话会在这里更新。

推荐资料:由Adaboost算法创始人Freund和Schapire写的关于Adaboost算法的文档,我已经上传。

原创文章,转载请注明出处,谢谢。

原文链接:http://blog.csdn.net/iemyxie/article/details/40423907

时间: 2024-10-08 14:26:02

Adaboost 2的相关文章

决策树 随机森林 adaboost

? 熵.互信息? 决策树学习算法 ? 信息增益 ? ID3.C4.5.CART? Bagging与随机森林? 提升 ? Adaboost/GDBT ? 熵.互信息 熵是对平均不确定性的度量. 平均互信息:得知特征Y的信息而使得对标签X的信息的不确定性减少的程度.描述随机变量之间的相似程度.(条件熵.相对熵:差异性) ? 决策树 决策树学习采用的是自顶向下的递归方法,有监督学习. 其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类. 建立

Adaboost提升算法从原理到实践

1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合提升或者说是强化"得到一个性能赶超强可学习算法的算法.如何地这些弱算法进行提升是关键!AdaBoost算法是其中的一个代表. 2.分类算法提升的思路: 1.找到一个弱分类器,分类器简单,快捷,易操作(如果它本身就很复杂,而且效果还不错,那么进行提升无疑是锦上添花,增加复杂度,甚至上性能并没有得到提升

《机器学习实战》学习笔记:利用Adaboost元算法提高分类性能

一. 关于boosting算法的起源 boost 算法系列的起源来自于PAC Learnability(直译过来称为:PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的. 我们知道,可计算性在计算理论中已经有定义,而可学习性正是PAC Learnability理论所要定义的内容.另外,在计算理论中还有很大一部分精力花在研究问题是可计算的时候,其复杂度又是什么样的.因此,在计算学习理论中,也有研究可学习的问题的复杂度的内容,主要是样本复杂度 (Sample Complexity)

监督算法大比拼之BP、SVM、adaboost非线性多分类实验

写在之前: 前些文章曾经细数过从决策树.贝叶斯算法等一些简单的算法到神经网络(BP).支持向量机(SVM).adaboost等一些较为复杂的机器学习算法(对其中感兴趣的朋友可以往前的博客看看),各种算法各有优缺点,基本上都能处理线性与非线性样本集,然通观这些算法来看,个人感觉对于数据(无论线性还是非线性)的分类上来说,里面比较好的当数BP.SVM.adaboost元算法这三种了,由于前面在介绍相应算法原理以及实验的时候所用的样本以及分类情况都是二分类的,对于多分类的情况未曾涉及过,而实际情况往往

利用Adaboost提高分类性能

Adaboost为一种集成算法,是对其他算法进行组合的一种方式. 本文将通过单层决策树分类器建立一个Adaboost优化算法,即利用多个弱分类器构建一个强分类器. 弱分类器:分类器性能比随机猜测要略好,但是也不会好太多. 强分类器:分类器性能比随机猜测好很多. 下面结合代码说明Adaboost算法原理和思路: 单层决策树是一种简单的决策树,仅基于单个特征来做决策. 首先加载简单的训练数据. def loadSimpleData(): dataMat = np.mat( [ [1.0,2.1],

Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用

1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一篇文档$d$中出现的词$w_0,w_1,...,w_n$, 这篇文章被分类为$c$的概率为$$p(c|w_0,w_1,...,w_n) = \frac{p(c,w_0,w_1,...,w_n)}{p(w_0,w_1,...,w_n)} = \frac{p(w_0,w_1,...,w_n|c)*p(c

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB

之前的文章主要讲解了OpenCV中与检测相关的内容,包括Haar特征.积分图和检测分类器结构:之后的文章将逐步开始介绍训练相关的内容.而本节主要介绍AdaBoost的理论,以及AdaBoost中的DAB与GAB算法,为后续讲解奠定基础. (一) AdaBoost背景介绍 在了解AdaBoost之前,先介绍弱学习和强学习的概念: 1. 弱学习:识别错误率小于1/2,即准确率仅比随机猜测略高的学习算法 2. 强学习:识别准确率很高并能在多项式时间内完成的学习算法 显然,无论对于任何分类问题,弱学习都

用cart(分类回归树)作为弱分类器实现adaboost

在之前的决策树到集成学习里我们说了决策树和集成学习的基本概念(用了adaboost昨晚集成学习的例子),其后我们分别学习了决策树分类原理和adaboost原理和实现, 上两篇我们学习了cart(决策分类树),决策分类树也是决策树的一种,也是很强大的分类器,但是cart的深度太深,我们可以指定cart的深度使得cart变成强一点的弱分类器. 在决策树到集成学习我们提到,单棵复杂的决策树可以达到100%,而简单的集成学习只能有85%的正确率,下面我们尝试用强一点的弱分类器来看下集成学习的效果有没有提

adaboost原理与理论

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值.将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器.对adaBoost算法的研究以及应用大多集中于分类问题,同时也出现了一些在回归问题上的应用.就其应用ad