数据挖掘算法学习(八)Adaboost

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

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算法的文档,我已经上传。

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

时间: 2024-10-09 20:00:42

数据挖掘算法学习(八)Adaboost的相关文章

数据挖掘算法学习(三)NaiveBayes算法

算法简单介绍 NBC是应用最广的分类算法之中的一个.朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同一时候,NBC模型所需预计的參数非常少,对缺失数据不太敏感,算法也比較简单. 算法如果 给定目标值时属性之间互相条件独立. 算法输入 训练数据   T={(x1,y1),(x2,y2),--,(xn,yn)} 待分类数据x0=(x0(1),x0(2),--,x0(n))T 算法输出 待分类数据x0的分类结果y0∈{c1,c2,--,ck} 算法思想 weka执行 以we

数据挖掘算法学习(一)K-Means算法

博主最近实习开始接触数据挖掘,将学习笔记分享给大家.目前用的软件是weka,下篇文章会着重讲解. 算法简介: K-Means算法是输入聚类个数k,以及包含n个数据对象的数据库,输出满足方差最小标准的k个聚类.并使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类对象相似度较小. 算法假设: 均方误差是计算群组分散度的最佳参数. 算法输入: 聚类个数k:包含n个数据对象的数据集. 算法输出: k个聚类 算法思想: (a)绿点表示数据集在二级的欧几里德空间,初始化的中心点u1和u2用红的和蓝

数据挖掘算法学习(四)PCA算法

算法简介 主成分分析(PrincipalComponentAnalysis,简称PCA)是一种常用的基于变量协方差矩阵对信息进行处理.压缩和抽提的有效方法.主要用于对特征进行降维. 算法假设 数据的概率分布满足高斯分布或是指数型的概率分布.方差高的向量视为主元. 算法输入 包含n条记录的数据集 算法输出 降维或压缩后的数据集 算法思想 ?1.计算所有样本的均值m和协方差矩阵S: ?2.计算S的特征值,并由大到小排序: ?3.选择前n'个特征值对应的特征矢量作成一个变换矩阵E=[e1,e2, -,

数据挖掘算法学习(七)SVM

SVM,支持向量机.数据挖掘中的一个经典算法,博主学了挺久,把学到的一些东西跟大家分享一下. 支持向量机(SVM,Support Vector Machine)是在高维特征空间使用线性函数假设空间的学习系统,它由一个来自最优化理论的学习算法训练,该算法实现了一个由统计学习理论到处的学习偏置.此学习策略由Vapnik和他的合作者提出,是一个准则性的 并且强有力的方法.在它提出来的若干年来,在范围广大的应用中,SVM的性能胜过其他大多数的学习系统. 一.主要思想 建立一个最优决策超平面,使得该平面两

数据挖掘算法学习(九)EM算法-上篇-多元高斯分布

------------------------------------------------------------------------------------ 欢迎转载,请附上链接 http://blog.csdn.net/iemyxie/article/details/42560125 ----------------------------------------------------------------------------------- EM算法大致分为两步--E步骤和

数据挖掘算法学习(五)C4.5

C4.5分类决策树算法,其核心算法是ID3算法.目前应用在临床决策.生产制造.文档分析.生物信息学.空间数据建模等领域.算法的输入是带类标的数据,输出是树形的决策规则. C4.5比ID3的改进: 1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2)在树构造过程中进行剪枝: 3)能够完成对连续属性的离散化处理: 4)能够对不完整数据进行处理. C4.5算法优点:产生的分类规则易于理解,准确率较高. C4.5算法缺点:在构造树的过程中,需要对数据集进行多次的顺序扫

数据挖掘算法学习(六)CART

分类回归树算法:CART(Classification And Regression Tree)算法采用一种二分递归分割的技术,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支.因此,CART算法生成的决策树是结构简洁的二叉树. 分类树两个基本思想:第一个是将训练样本进行递归地划分自变量空间进行建树的想法,第二个想法是用验证数据进行剪枝. CART与C4.5的不同之处是节点在分裂时使用GINI指数.GINI指标主要是度量数据划分或训练数据集D的不纯度为主,系数值的属性作为测

集成学习之Adaboost算法原理小结

在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boosting系列算法.在boosting系列算法中, Adaboost是最著名的算法之一.Adaboost既可以用作分类,也可以用作回归.本文就对Adaboost算法做一个总结. 1. 回顾boosting算法的基本原理 在集成学习原理小结中,我们已经讲到了boosting算法系列的基本思想,如下图: 从图中

18大经典数据挖掘算法小结

18大经典数据挖掘算法小结 本文所有涉及到的数据挖掘代码的都放在了我的github上了. 地址链接: https://github.com/linyiqun/DataMiningAlgorithm 大概花了将近2个月的时间,自己把18大数据挖掘的经典算法进行了学习并且进行了代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面.也算是对数据挖掘领域的小小入门了吧.下面就做个小小的总结,后面都是我自己相应算法的博文链接,希望能够帮助大家学习. 1.C4.5算法.C4.5算法与ID3